diff options
Diffstat (limited to 'networking/udhcp/packet.c')
-rw-r--r-- | networking/udhcp/packet.c | 18 |
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 */ |
190 | int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, | 190 | int 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); |