diff options
| author | Roy Marples <roy@marples.name> | 2008-04-20 19:02:19 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2008-04-20 19:02:19 +0000 |
| commit | 35ff0dbb35b746c5594773ddc47516af440cdae7 (patch) | |
| tree | 144e8a4e9e870ef40546544b9ce65cdd13930474 /net.c | |
| parent | 7612d18ee2d823cbd61f156191c6b5d6cb41352f (diff) | |
| download | dhcpcd-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.c | 21 |
1 files changed, 19 insertions, 2 deletions
@@ -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); |
