aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/packet.c')
-rw-r--r--networking/udhcp/packet.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c
index 51374646d..4d8e005d4 100644
--- a/networking/udhcp/packet.c
+++ b/networking/udhcp/packet.c
@@ -189,7 +189,8 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
189/* Let the kernel do all the work for packet generation */ 189/* Let the kernel do all the work for packet generation */
190int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, 190int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
191 uint32_t source_nip, int source_port, 191 uint32_t source_nip, int source_port,
192 uint32_t dest_nip, int dest_port) 192 uint32_t dest_nip, int dest_port,
193 const char *ifname)
193{ 194{
194 struct sockaddr_in sa; 195 struct sockaddr_in sa;
195 unsigned padding; 196 unsigned padding;
@@ -204,6 +205,21 @@ int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
204 } 205 }
205 setsockopt_reuseaddr(fd); 206 setsockopt_reuseaddr(fd);
206 207
208 /* If interface carrier goes down, unless we
209 * bind socket to a particular netdev, the packet
210 * can go out through another interface, eg. via
211 * default route despite being bound to a specific
212 * source IP. As such, bind to device hard and fail
213 * otherwise. Sending renewal packets on foreign
214 * interfaces makes no sense.
215 */
216 if (ifname) {
217 if (setsockopt_bindtodevice(fd, ifname) < 0) {
218 msg = "bindtodevice";
219 goto ret_close;
220 }
221 }
222
207 memset(&sa, 0, sizeof(sa)); 223 memset(&sa, 0, sizeof(sa));
208 sa.sin_family = AF_INET; 224 sa.sin_family = AF_INET;
209 sa.sin_port = htons(source_port); 225 sa.sin_port = htons(source_port);