diff options
-rw-r--r-- | networking/udhcp/clientpacket.c | 31 | ||||
-rw-r--r-- | networking/udhcp/common.h | 5 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 8 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.h | 2 | ||||
-rw-r--r-- | networking/udhcp/packet.c | 3 | ||||
-rw-r--r-- | networking/udhcp/serverpacket.c | 6 |
6 files changed, 36 insertions, 19 deletions
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c index 77331d98d..1ab17321d 100644 --- a/networking/udhcp/clientpacket.c +++ b/networking/udhcp/clientpacket.c | |||
@@ -79,8 +79,18 @@ static void add_param_req_option(struct dhcpMessage *packet) | |||
79 | } | 79 | } |
80 | 80 | ||
81 | 81 | ||
82 | static int raw_bcast_from_client_config_ifindex(struct dhcpMessage *packet) | ||
83 | { | ||
84 | return udhcp_send_raw_packet(packet, | ||
85 | /*src*/ INADDR_ANY, CLIENT_PORT, | ||
86 | /*dst*/ INADDR_BROADCAST, SERVER_PORT, MAC_BCAST_ADDR, | ||
87 | client_config.ifindex); | ||
88 | } | ||
89 | |||
90 | |||
82 | #if ENABLE_FEATURE_UDHCPC_ARPING | 91 | #if ENABLE_FEATURE_UDHCPC_ARPING |
83 | /* Unicast a DHCP decline message */ | 92 | /* Broadcast a DHCP decline message */ |
93 | //FIXME: maybe it should be unicast? | ||
84 | int FAST_FUNC send_decline(uint32_t xid, uint32_t server, uint32_t requested) | 94 | int FAST_FUNC send_decline(uint32_t xid, uint32_t server, uint32_t requested) |
85 | { | 95 | { |
86 | struct dhcpMessage packet; | 96 | struct dhcpMessage packet; |
@@ -92,8 +102,7 @@ int FAST_FUNC send_decline(uint32_t xid, uint32_t server, uint32_t requested) | |||
92 | 102 | ||
93 | bb_info_msg("Sending decline..."); | 103 | bb_info_msg("Sending decline..."); |
94 | 104 | ||
95 | return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, | 105 | return raw_bcast_from_client_config_ifindex(&packet); |
96 | SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); | ||
97 | } | 106 | } |
98 | #endif | 107 | #endif |
99 | 108 | ||
@@ -114,13 +123,13 @@ int FAST_FUNC send_discover(uint32_t xid, uint32_t requested) | |||
114 | add_param_req_option(&packet); | 123 | add_param_req_option(&packet); |
115 | 124 | ||
116 | bb_info_msg("Sending discover..."); | 125 | bb_info_msg("Sending discover..."); |
117 | return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, | 126 | return raw_bcast_from_client_config_ifindex(&packet); |
118 | SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); | ||
119 | } | 127 | } |
120 | 128 | ||
121 | 129 | ||
122 | /* Broadcasts a DHCP request message */ | 130 | /* Broadcasts a DHCP request message */ |
123 | int FAST_FUNC send_selecting(uint32_t xid, uint32_t server, uint32_t requested) | 131 | //FIXME: maybe it should be unicast? |
132 | int FAST_FUNC send_select(uint32_t xid, uint32_t server, uint32_t requested) | ||
124 | { | 133 | { |
125 | struct dhcpMessage packet; | 134 | struct dhcpMessage packet; |
126 | struct in_addr addr; | 135 | struct in_addr addr; |
@@ -134,8 +143,7 @@ int FAST_FUNC send_selecting(uint32_t xid, uint32_t server, uint32_t requested) | |||
134 | 143 | ||
135 | addr.s_addr = requested; | 144 | addr.s_addr = requested; |
136 | bb_info_msg("Sending select for %s...", inet_ntoa(addr)); | 145 | bb_info_msg("Sending select for %s...", inet_ntoa(addr)); |
137 | return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, | 146 | return raw_bcast_from_client_config_ifindex(&packet); |
138 | SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); | ||
139 | } | 147 | } |
140 | 148 | ||
141 | 149 | ||
@@ -151,10 +159,11 @@ int FAST_FUNC send_renew(uint32_t xid, uint32_t server, uint32_t ciaddr) | |||
151 | add_param_req_option(&packet); | 159 | add_param_req_option(&packet); |
152 | bb_info_msg("Sending renew..."); | 160 | bb_info_msg("Sending renew..."); |
153 | if (server) | 161 | if (server) |
154 | return udhcp_send_kernel_packet(&packet, ciaddr, CLIENT_PORT, server, SERVER_PORT); | 162 | return udhcp_send_kernel_packet(&packet, |
163 | ciaddr, CLIENT_PORT, | ||
164 | server, SERVER_PORT); | ||
155 | 165 | ||
156 | return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, | 166 | return raw_bcast_from_client_config_ifindex(&packet); |
157 | SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); | ||
158 | } | 167 | } |
159 | 168 | ||
160 | 169 | ||
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index bf099d8d2..68fa65cf5 100644 --- a/networking/udhcp/common.h +++ b/networking/udhcp/common.h | |||
@@ -66,8 +66,9 @@ int udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd) FAST_FUNC; | |||
66 | 66 | ||
67 | int udhcp_send_raw_packet(struct dhcpMessage *payload, | 67 | int udhcp_send_raw_packet(struct dhcpMessage *payload, |
68 | uint32_t source_ip, int source_port, | 68 | uint32_t source_ip, int source_port, |
69 | uint32_t dest_ip, int dest_port, | 69 | uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, |
70 | const uint8_t *dest_arp, int ifindex) FAST_FUNC; | 70 | int ifindex) FAST_FUNC; |
71 | |||
71 | int udhcp_send_kernel_packet(struct dhcpMessage *payload, | 72 | int udhcp_send_kernel_packet(struct dhcpMessage *payload, |
72 | uint32_t source_ip, int source_port, | 73 | uint32_t source_ip, int source_port, |
73 | uint32_t dest_ip, int dest_port) FAST_FUNC; | 74 | uint32_t dest_ip, int dest_port) FAST_FUNC; |
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 5ec8d39b9..c1ef19519 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
@@ -389,7 +389,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
389 | if (state == RENEW_REQUESTED) /* unicast */ | 389 | if (state == RENEW_REQUESTED) /* unicast */ |
390 | send_renew(xid, server_addr, requested_ip); | 390 | send_renew(xid, server_addr, requested_ip); |
391 | else /* broadcast */ | 391 | else /* broadcast */ |
392 | send_selecting(xid, server_addr, requested_ip); | 392 | send_select(xid, server_addr, requested_ip); |
393 | 393 | ||
394 | timeout = discover_timeout; | 394 | timeout = discover_timeout; |
395 | packet_num++; | 395 | packet_num++; |
@@ -430,7 +430,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
430 | * try to find DHCP server using broadcast */ | 430 | * try to find DHCP server using broadcast */ |
431 | if (timeout > 0) { | 431 | if (timeout > 0) { |
432 | /* send a request packet */ | 432 | /* send a request packet */ |
433 | send_renew(xid, 0, requested_ip); /* broadcast */ | 433 | send_renew(xid, 0 /* INADDR_ANY*/, requested_ip); /* broadcast */ |
434 | timeout >>= 1; | 434 | timeout >>= 1; |
435 | continue; | 435 | continue; |
436 | } | 436 | } |
@@ -529,6 +529,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
529 | if (lease_seconds < 10) /* and not too small */ | 529 | if (lease_seconds < 10) /* and not too small */ |
530 | lease_seconds = 10; | 530 | lease_seconds = 10; |
531 | } | 531 | } |
532 | //FIXME: why do we check ARP only after we've got DHCPACK? | ||
533 | //Shouldn't we do it immediately after DHCPOFFER? | ||
532 | #if ENABLE_FEATURE_UDHCPC_ARPING | 534 | #if ENABLE_FEATURE_UDHCPC_ARPING |
533 | if (opt & OPT_a) { | 535 | if (opt & OPT_a) { |
534 | if (!arpping(packet.yiaddr, | 536 | if (!arpping(packet.yiaddr, |
@@ -538,6 +540,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
538 | ) { | 540 | ) { |
539 | bb_info_msg("offered address is in use " | 541 | bb_info_msg("offered address is in use " |
540 | "(got ARP reply), declining"); | 542 | "(got ARP reply), declining"); |
543 | //NB: not clear whether it should be unicast or bcast. | ||
544 | //Currently it is a bcast. Why? | ||
541 | send_decline(xid, server_addr, packet.yiaddr); | 545 | send_decline(xid, server_addr, packet.yiaddr); |
542 | 546 | ||
543 | if (state != REQUESTING) | 547 | if (state != REQUESTING) |
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h index 6ca440071..a9348497f 100644 --- a/networking/udhcp/dhcpc.h +++ b/networking/udhcp/dhcpc.h | |||
@@ -39,7 +39,7 @@ struct client_config_t { | |||
39 | 39 | ||
40 | uint32_t random_xid(void) FAST_FUNC; | 40 | uint32_t random_xid(void) FAST_FUNC; |
41 | int send_discover(uint32_t xid, uint32_t requested) FAST_FUNC; | 41 | int send_discover(uint32_t xid, uint32_t requested) FAST_FUNC; |
42 | int send_selecting(uint32_t xid, uint32_t server, uint32_t requested) FAST_FUNC; | 42 | int send_select(uint32_t xid, uint32_t server, uint32_t requested) FAST_FUNC; |
43 | #if ENABLE_FEATURE_UDHCPC_ARPING | 43 | #if ENABLE_FEATURE_UDHCPC_ARPING |
44 | int send_decline(uint32_t xid, uint32_t server, uint32_t requested) FAST_FUNC; | 44 | int send_decline(uint32_t xid, uint32_t server, uint32_t requested) FAST_FUNC; |
45 | #endif | 45 | #endif |
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index 58f45e54e..4eedbb53a 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c | |||
@@ -118,7 +118,8 @@ uint16_t FAST_FUNC udhcp_checksum(void *addr, int count) | |||
118 | /* Construct a ip/udp header for a packet, send packet */ | 118 | /* Construct a ip/udp header for a packet, send packet */ |
119 | int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload, | 119 | int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload, |
120 | uint32_t source_ip, int source_port, | 120 | uint32_t source_ip, int source_port, |
121 | uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, int ifindex) | 121 | uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, |
122 | int ifindex) | ||
122 | { | 123 | { |
123 | struct sockaddr_ll dest; | 124 | struct sockaddr_ll dest; |
124 | struct udp_dhcp_packet packet; | 125 | struct udp_dhcp_packet packet; |
diff --git a/networking/udhcp/serverpacket.c b/networking/udhcp/serverpacket.c index 2fcf93033..5b1c61517 100644 --- a/networking/udhcp/serverpacket.c +++ b/networking/udhcp/serverpacket.c | |||
@@ -59,8 +59,10 @@ static int send_packet_to_client(struct dhcpMessage *payload, int force_broadcas | |||
59 | ciaddr = payload->yiaddr; | 59 | ciaddr = payload->yiaddr; |
60 | chaddr = payload->chaddr; | 60 | chaddr = payload->chaddr; |
61 | } | 61 | } |
62 | return udhcp_send_raw_packet(payload, server_config.server, SERVER_PORT, | 62 | return udhcp_send_raw_packet(payload, |
63 | ciaddr, CLIENT_PORT, chaddr, server_config.ifindex); | 63 | /*src*/ server_config.server, SERVER_PORT, |
64 | /*dst*/ ciaddr, CLIENT_PORT, chaddr, | ||
65 | server_config.ifindex); | ||
64 | } | 66 | } |
65 | 67 | ||
66 | 68 | ||