diff options
author | 2013-12-06 23:40:48 +0000 | |
---|---|---|
committer | 2013-12-06 23:40:48 +0000 | |
commit | 393831bbedc65a4a425784816f0f67da4143199d (patch) | |
tree | 9392b1bbcd903a0c8547998794899b80a8432b0c | |
parent | Make clflush() flush the cache line specified by the address we pass it (diff) | |
download | wireguard-openbsd-393831bbedc65a4a425784816f0f67da4143199d.tar.xz wireguard-openbsd-393831bbedc65a4a425784816f0f67da4143199d.zip |
Having stopped pretending we handle anything but ethernet packets,
replace the 'struct hardware' abstraction layer and use 'struct
ether_addr' where hardware addresses are of interest.
ok matthew@, confirmed by reyk@ not to impact DHCP-over-IPSec support.
-rw-r--r-- | sbin/dhclient/bpf.c | 6 | ||||
-rw-r--r-- | sbin/dhclient/dhclient.c | 25 | ||||
-rw-r--r-- | sbin/dhclient/dhcpd.h | 22 | ||||
-rw-r--r-- | sbin/dhclient/dispatch.c | 21 | ||||
-rw-r--r-- | sbin/dhclient/options.c | 17 | ||||
-rw-r--r-- | sbin/dhclient/packet.c | 23 | ||||
-rw-r--r-- | sbin/dhclient/parse.c | 17 |
7 files changed, 59 insertions, 72 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c index 992e2b3b1e8..7620d048cac 100644 --- a/sbin/dhclient/bpf.c +++ b/sbin/dhclient/bpf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bpf.c,v 1.29 2013/11/11 21:00:01 krw Exp $ */ +/* $OpenBSD: bpf.c,v 1.30 2013/12/06 23:40:48 krw Exp $ */ /* BPF socket interface code, originally contributed by Archie Cobbs. */ @@ -262,7 +262,7 @@ if_register_receive(void) ssize_t send_packet(struct in_addr from, struct sockaddr_in *to, - struct hardware *hto) + struct ether_addr *hto) { #define IOVCNT 2 unsigned char buf[256]; @@ -302,7 +302,7 @@ send_packet(struct in_addr from, struct sockaddr_in *to, } ssize_t -receive_packet(struct sockaddr_in *from, struct hardware *hfrom) +receive_packet(struct sockaddr_in *from, struct ether_addr *hfrom) { int length = 0, offset = 0; struct bpf_hdr hdr; diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c index a32c173087c..01a28085f83 100644 --- a/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhclient.c,v 1.273 2013/12/05 21:32:59 krw Exp $ */ +/* $OpenBSD: dhclient.c,v 1.274 2013/12/06 23:40:48 krw Exp $ */ /* * Copyright 2004 Henning Brauer <henning@openbsd.org> @@ -204,7 +204,7 @@ routehandler(void) struct in_addr a, b; ssize_t n; int linkstat, rslt; - struct hardware hw; + struct ether_addr hw; struct rt_msghdr *rtm; struct if_msghdr *ifm; struct ifa_msghdr *ifam; @@ -1477,8 +1477,8 @@ make_discover(struct client_lease *lease) client->bootrequest_packet_length = BOOTP_MIN_LEN; packet->op = BOOTREQUEST; - packet->htype = ifi->hw_address.htype; - packet->hlen = ifi->hw_address.hlen; + packet->htype = HTYPE_ETHER ; + packet->hlen = ETHER_ADDR_LEN; packet->hops = 0; packet->xid = client->xid; packet->secs = 0; /* filled in by send_discover. */ @@ -1488,7 +1488,8 @@ make_discover(struct client_lease *lease) memset(&packet->yiaddr, 0, sizeof(packet->yiaddr)); memset(&packet->siaddr, 0, sizeof(packet->siaddr)); memset(&packet->giaddr, 0, sizeof(packet->giaddr)); - memcpy(&packet->chaddr, ifi->hw_address.haddr, ifi->hw_address.hlen); + memcpy(&packet->chaddr, ifi->hw_address.ether_addr_octet, + ETHER_ADDR_LEN); } void @@ -1546,8 +1547,8 @@ make_request(struct client_lease * lease) client->bootrequest_packet_length = BOOTP_MIN_LEN; packet->op = BOOTREQUEST; - packet->htype = ifi->hw_address.htype; - packet->hlen = ifi->hw_address.hlen; + packet->htype = HTYPE_ETHER ; + packet->hlen = ETHER_ADDR_LEN; packet->hops = 0; packet->xid = client->xid; packet->secs = 0; /* Filled in by send_request. */ @@ -1569,7 +1570,8 @@ make_request(struct client_lease * lease) memset(&packet->yiaddr, 0, sizeof(packet->yiaddr)); memset(&packet->siaddr, 0, sizeof(packet->siaddr)); memset(&packet->giaddr, 0, sizeof(packet->giaddr)); - memcpy(&packet->chaddr, ifi->hw_address.haddr, ifi->hw_address.hlen); + memcpy(&packet->chaddr, ifi->hw_address.ether_addr_octet, + ETHER_ADDR_LEN); } void @@ -1614,8 +1616,8 @@ make_decline(struct client_lease *lease) client->bootrequest_packet_length = BOOTP_MIN_LEN; packet->op = BOOTREQUEST; - packet->htype = ifi->hw_address.htype; - packet->hlen = ifi->hw_address.hlen; + packet->htype = HTYPE_ETHER ; + packet->hlen = ETHER_ADDR_LEN; packet->hops = 0; packet->xid = client->xid; packet->secs = 0; /* Filled in by send_request. */ @@ -1626,7 +1628,8 @@ make_decline(struct client_lease *lease) memset(&packet->yiaddr, 0, sizeof(packet->yiaddr)); memset(&packet->siaddr, 0, sizeof(packet->siaddr)); memset(&packet->giaddr, 0, sizeof(packet->giaddr)); - memcpy(&packet->chaddr, ifi->hw_address.haddr, ifi->hw_address.hlen); + memcpy(&packet->chaddr, ifi->hw_address.ether_addr_octet, + ETHER_ADDR_LEN); } void diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h index d51836e5521..a711c79f201 100644 --- a/sbin/dhclient/dhcpd.h +++ b/sbin/dhclient/dhcpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcpd.h,v 1.124 2013/11/19 15:12:23 mikeb Exp $ */ +/* $OpenBSD: dhcpd.h,v 1.125 2013/12/06 23:40:48 krw Exp $ */ /* * Copyright (c) 2004 Henning Brauer <henning@openbsd.org> @@ -93,12 +93,6 @@ struct reject_elem { struct in_addr addr; }; -struct hardware { - u_int8_t htype; - u_int8_t hlen; - u_int8_t haddr[16]; -}; - struct client_lease { TAILQ_ENTRY(client_lease) next; time_t expiry, renewal, rebind; @@ -172,7 +166,7 @@ struct client_state { }; struct interface_info { - struct hardware hw_address; + struct ether_addr hw_address; struct in_addr primary_address; char name[IFNAMSIZ]; int rfdesc; @@ -216,7 +210,7 @@ extern volatile sig_atomic_t quit; /* options.c */ int cons_options(struct option_data *); char *pretty_print_option(unsigned int, struct option_data *, int); -void do_packet(unsigned int, struct in_addr, struct hardware *); +void do_packet(unsigned int, struct in_addr, struct ether_addr *); /* errwarn.c */ extern int warnings_occurred; @@ -240,7 +234,7 @@ void skip_to_semi(FILE *); int parse_semi(FILE *); char *parse_string(FILE *); int parse_ip_addr(FILE *, struct in_addr *); -void parse_hardware_param(FILE *, struct hardware *); +void parse_hardware_param(FILE *, struct ether_addr *); void parse_lease_time(FILE *, time_t *); void convert_num(unsigned char *, char *, int, int); time_t parse_date(FILE *); @@ -248,8 +242,8 @@ time_t parse_date(FILE *); /* bpf.c */ void if_register_send(void); void if_register_receive(void); -ssize_t send_packet(struct in_addr, struct sockaddr_in *, struct hardware *); -ssize_t receive_packet(struct sockaddr_in *, struct hardware *); +ssize_t send_packet(struct in_addr, struct sockaddr_in *, struct ether_addr *); +ssize_t receive_packet(struct sockaddr_in *, struct ether_addr *); /* dispatch.c */ void discover_interface(void); @@ -290,10 +284,10 @@ void free_client_lease(struct client_lease *); void routehandler(void); /* packet.c */ -void assemble_hw_header(unsigned char *, int *, struct hardware *); +void assemble_hw_header(unsigned char *, int *, struct ether_addr *); void assemble_udp_ip_header(unsigned char *, int *, u_int32_t, u_int32_t, unsigned int, unsigned char *, int); -ssize_t decode_hw_header(unsigned char *, int, struct hardware *); +ssize_t decode_hw_header(unsigned char *, int, struct ether_addr *); ssize_t decode_udp_ip_header(unsigned char *, int, struct sockaddr_in *, int); diff --git a/sbin/dhclient/dispatch.c b/sbin/dhclient/dispatch.c index 30db8aa984f..f83f38036d6 100644 --- a/sbin/dhclient/dispatch.c +++ b/sbin/dhclient/dispatch.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dispatch.c,v 1.85 2013/12/05 21:32:59 krw Exp $ */ +/* $OpenBSD: dispatch.c,v 1.86 2013/12/06 23:40:48 krw Exp $ */ /* * Copyright 2004 Henning Brauer <henning@openbsd.org> @@ -84,21 +84,22 @@ discover_interface(void) struct sockaddr_dl *foo = (struct sockaddr_dl *)ifa->ifa_addr; + if (foo->sdl_alen != ETHER_ADDR_LEN) + continue; + ifi->index = foo->sdl_index; - ifi->hw_address.hlen = foo->sdl_alen; - ifi->hw_address.htype = HTYPE_ETHER; /* XXX */ - memcpy(ifi->hw_address.haddr, LLADDR(foo), - foo->sdl_alen); + memcpy(ifi->hw_address.ether_addr_octet, LLADDR(foo), + ETHER_ADDR_LEN); opt = &config->send_options[DHO_DHCP_CLIENT_IDENTIFIER]; if (opt->len == 0) { /* Build default client identifier. */ - data = calloc(1, foo->sdl_alen + 1); + data = calloc(1, ETHER_ADDR_LEN + 1); if (data != NULL) { - data[0] = ifi->hw_address.htype; + data[0] = HTYPE_ETHER; memcpy(&data[1], LLADDR(foo), - foo->sdl_alen); + ETHER_ADDR_LEN); opt->data = data; - opt->len = foo->sdl_alen + 1; + opt->len = ETHER_ADDR_LEN + 1; } } } @@ -237,7 +238,7 @@ void got_one(void) { struct sockaddr_in from; - struct hardware hfrom; + struct ether_addr hfrom; struct in_addr ifrom; ssize_t result; diff --git a/sbin/dhclient/options.c b/sbin/dhclient/options.c index 88c13d61906..eb5777eea73 100644 --- a/sbin/dhclient/options.c +++ b/sbin/dhclient/options.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options.c,v 1.56 2013/07/11 01:34:00 krw Exp $ */ +/* $OpenBSD: options.c,v 1.57 2013/12/06 23:40:48 krw Exp $ */ /* DHCP options parsing and reassembly. */ @@ -454,7 +454,7 @@ toobig: void do_packet(unsigned int from_port, struct in_addr from, - struct hardware *hfrom) + struct ether_addr *hfrom) { struct dhcp_packet *packet = &client->packet; struct option_data options[256]; @@ -463,14 +463,14 @@ do_packet(unsigned int from_port, struct in_addr from, char *type, *info; int i, rslt, options_valid = 1; - if (ifi->hw_address.hlen != packet->hlen) { + if (packet->hlen != ETHER_ADDR_LEN) { #ifdef DEBUG debug("Discarding packet with hlen != %s (%u)", ifi->name, packet->hlen); #endif return; - } else if (memcmp(ifi->hw_address.haddr, packet->chaddr, - packet->hlen)) { + } else if (memcmp(&ifi->hw_address, packet->chaddr, + sizeof(ifi->hw_address))) { #ifdef DEBUG debug("Discarding packet with chaddr != %s (%s)", ifi->name, ether_ntoa((struct ether_addr *)packet->chaddr)); @@ -552,11 +552,8 @@ do_packet(unsigned int from_port, struct in_addr from, #endif } - if (hfrom->hlen == 6) - rslt = asprintf(&info, "%s from %s (%s)", type, inet_ntoa(from), - ether_ntoa((struct ether_addr *)hfrom->haddr)); - else - rslt = asprintf(&info, "%s from %s", type, inet_ntoa(from)); + rslt = asprintf(&info, "%s from %s (%s)", type, inet_ntoa(from), + ether_ntoa(hfrom)); if (rslt == -1) error("no memory for info string"); diff --git a/sbin/dhclient/packet.c b/sbin/dhclient/packet.c index f6e94bca489..3eb39dd5c50 100644 --- a/sbin/dhclient/packet.c +++ b/sbin/dhclient/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.21 2013/12/05 21:32:59 krw Exp $ */ +/* $OpenBSD: packet.c,v 1.22 2013/12/06 23:40:48 krw Exp $ */ /* Packet assembly code, originally contributed by Archie Cobbs. */ @@ -83,19 +83,18 @@ wrapsum(u_int32_t sum) } void -assemble_hw_header(unsigned char *buf, int *bufix, struct hardware *to) +assemble_hw_header(unsigned char *buf, int *bufix, struct ether_addr *to) { struct ether_header eh; - if (to != NULL && to->hlen == 6) /* XXX */ - memcpy(eh.ether_dhost, to->haddr, sizeof(eh.ether_dhost)); + if (to != NULL) + memcpy(eh.ether_dhost, to->ether_addr_octet, + sizeof(eh.ether_dhost)); else memset(eh.ether_dhost, 0xff, sizeof(eh.ether_dhost)); - if (ifi->hw_address.hlen == sizeof(eh.ether_shost)) - memcpy(eh.ether_shost, ifi->hw_address.haddr, - sizeof(eh.ether_shost)); - else - memset(eh.ether_shost, 0x00, sizeof(eh.ether_shost)); + + memcpy(eh.ether_shost, ifi->hw_address.ether_addr_octet, + sizeof(eh.ether_shost)); eh.ether_type = htons(ETHERTYPE_IP); @@ -141,15 +140,13 @@ assemble_udp_ip_header(unsigned char *buf, int *bufix, u_int32_t from, } ssize_t -decode_hw_header(unsigned char *buf, int bufix, struct hardware *from) +decode_hw_header(unsigned char *buf, int bufix, struct ether_addr *from) { struct ether_header eh; memcpy(&eh, buf + bufix, ETHER_HDR_LEN); - memcpy(from->haddr, eh.ether_shost, sizeof(eh.ether_shost)); - from->htype = ARPHRD_ETHER; - from->hlen = sizeof(eh.ether_shost); + memcpy(from->ether_addr_octet, eh.ether_shost, sizeof(eh.ether_shost)); return (sizeof(eh)); } diff --git a/sbin/dhclient/parse.c b/sbin/dhclient/parse.c index cbb76519f34..6814a2fdf83 100644 --- a/sbin/dhclient/parse.c +++ b/sbin/dhclient/parse.c @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.c,v 1.27 2013/12/05 22:31:35 krw Exp $ */ +/* $OpenBSD: parse.c,v 1.28 2013/12/06 23:40:48 krw Exp $ */ /* Common parser code for dhcpd and dhclient. */ @@ -145,24 +145,19 @@ parse_ip_addr(FILE *cfile, struct in_addr *addr) * csns :== NUMBER | csns COLON NUMBER */ void -parse_hardware_param(FILE *cfile, struct hardware *hardware) +parse_hardware_param(FILE *cfile, struct ether_addr *hardware) { int token; token = next_token(NULL, cfile); - switch (token) { - case TOK_ETHERNET: - hardware->htype = HTYPE_ETHER; - hardware->hlen = 6; - break; - default: - parse_warn("expecting a network hardware type"); + if (token != TOK_ETHERNET) { + parse_warn("expecting 'ethernet'"); skip_to_semi(cfile); return; } - if (parse_numeric_aggregate(cfile, hardware->haddr, hardware->hlen, - ':', 16) == 0) + if (parse_numeric_aggregate(cfile, hardware->ether_addr_octet, + ETHER_ADDR_LEN, ':', 16) == 0) return; token = next_token(NULL, cfile); |