summaryrefslogtreecommitdiffstats
path: root/net.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-04-20 19:02:19 +0000
committerRoy Marples <roy@marples.name>2008-04-20 19:02:19 +0000
commit35ff0dbb35b746c5594773ddc47516af440cdae7 (patch)
tree144e8a4e9e870ef40546544b9ce65cdd13930474 /net.c
parent7612d18ee2d823cbd61f156191c6b5d6cb41352f (diff)
downloaddhcpcd-35ff0dbb35b746c5594773ddc47516af440cdae7.tar.xz
We should send packets to a specific IP over the udp socket so we don't broadcast on layer 2 and unicast on layer 3, #64.
Diffstat (limited to 'net.c')
-rw-r--r--net.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/net.c b/net.c
index 10661956..467cdf7e 100644
--- a/net.c
+++ b/net.c
@@ -443,6 +443,23 @@ eexit:
return -1;
}
+ssize_t
+send_packet(const struct interface *iface, struct in_addr to,
+ const uint8_t *data, ssize_t len)
+{
+ union sockunion {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+ } su;
+
+ memset(&su, 0, sizeof(su));
+ su.sin.sin_family = AF_INET;
+ su.sin.sin_addr.s_addr = to.s_addr;
+ su.sin.sin_port = htons(DHCP_SERVER_PORT);
+
+ return sendto(iface->udp_fd, data, len, 0, &su.sa, sizeof(su));
+}
+
struct udp_dhcp_packet
{
struct ip ip;
@@ -648,8 +665,8 @@ send_arp(const struct interface *iface, int op, struct in_addr sip,
}
memcpy(ar_tpa(arp), &tip, (size_t)arp->ar_pln);
- retval = send_packet(iface, ETHERTYPE_ARP,
- (unsigned char *) arp, arphdr_len(arp));
+ retval = send_raw_packet(iface, ETHERTYPE_ARP,
+ (uint8_t *)arp, arphdr_len(arp));
if (retval == -1)
logger(LOG_ERR,"send_packet: %s", strerror(errno));
free(arp);