aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/udhcp/clientpacket.c31
-rw-r--r--networking/udhcp/common.h5
-rw-r--r--networking/udhcp/dhcpc.c8
-rw-r--r--networking/udhcp/dhcpc.h2
-rw-r--r--networking/udhcp/packet.c3
-rw-r--r--networking/udhcp/serverpacket.c6
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
82static 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?
84int FAST_FUNC send_decline(uint32_t xid, uint32_t server, uint32_t requested) 94int 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 */
123int FAST_FUNC send_selecting(uint32_t xid, uint32_t server, uint32_t requested) 131//FIXME: maybe it should be unicast?
132int 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
67int udhcp_send_raw_packet(struct dhcpMessage *payload, 67int 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
71int udhcp_send_kernel_packet(struct dhcpMessage *payload, 72int 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
40uint32_t random_xid(void) FAST_FUNC; 40uint32_t random_xid(void) FAST_FUNC;
41int send_discover(uint32_t xid, uint32_t requested) FAST_FUNC; 41int send_discover(uint32_t xid, uint32_t requested) FAST_FUNC;
42int send_selecting(uint32_t xid, uint32_t server, uint32_t requested) FAST_FUNC; 42int 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
44int send_decline(uint32_t xid, uint32_t server, uint32_t requested) FAST_FUNC; 44int 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 */
119int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload, 119int 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