summaryrefslogtreecommitdiff
path: root/src/libsystemd-dhcp/dhcp-network.c
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2013-12-09 23:43:26 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-12-12 11:43:34 -0500
commit8c00042c939938818365753023ff2d50f984dec6 (patch)
treeafffca11004c504d8c6e98ca3efea1d8911e8f13 /src/libsystemd-dhcp/dhcp-network.c
parentd3d8ac2f2bac721d99f893c0a0128d21db636d4c (diff)
dhcp: Handle received DHCP Offer message
Create a function for handling the full IP, UDP and DHCP packet and tie it to the main loop. Verify IP and UDP headers and checksum. Creat a new lease structure with using the values supplied in the DHCP message. Free the lease structure when client is stopped. Split out socket handling into a creation and a sending part. As a result modify the test code.
Diffstat (limited to 'src/libsystemd-dhcp/dhcp-network.c')
-rw-r--r--src/libsystemd-dhcp/dhcp-network.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/libsystemd-dhcp/dhcp-network.c b/src/libsystemd-dhcp/dhcp-network.c
index ed34228f67..83a30842c2 100644
--- a/src/libsystemd-dhcp/dhcp-network.c
+++ b/src/libsystemd-dhcp/dhcp-network.c
@@ -30,26 +30,36 @@
#include "dhcp-internal.h"
-int dhcp_network_send_raw_packet(int index, const void *packet, size_t len)
-{
- _cleanup_close_ int s;
- union sockaddr_union link = {};
+int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link)
+ {
+ int s;
- s = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_IP));
+ s = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
+ htons(ETH_P_IP));
if (s < 0)
return -errno;
- link.ll.sll_family = AF_PACKET;
- link.ll.sll_protocol = htons(ETH_P_IP);
- link.ll.sll_ifindex = index;
- link.ll.sll_halen = ETH_ALEN;
- memset(&link.ll.sll_addr, 0xff, ETH_ALEN);
+ link->ll.sll_family = AF_PACKET;
+ link->ll.sll_protocol = htons(ETH_P_IP);
+ link->ll.sll_ifindex = index;
+ link->ll.sll_halen = ETH_ALEN;
+ memset(link->ll.sll_addr, 0xff, ETH_ALEN);
- if (bind(s, &link.sa, sizeof(link.ll)) < 0)
+ if (bind(s, &link->sa, sizeof(link->ll)) < 0) {
+ close(s);
return -errno;
+ }
- if (sendto(s, packet, len, 0, &link.sa, sizeof(link.ll)) < 0)
- return -errno;
+ return s;
+}
+
+int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
+ const void *packet, size_t len)
+{
+ int err = 0;
+
+ if (sendto(s, packet, len, 0, &link->sa, sizeof(link->ll)) < 0)
+ err = -errno;
- return 0;
+ return err;
}