summaryrefslogtreecommitdiffstats
path: root/net.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-09-04 08:31:00 +0000
committerRoy Marples <roy@marples.name>2008-09-04 08:31:00 +0000
commitf0f4b8b6df73aaa57672c47a7f339b52db23e68f (patch)
treeec6ce5531dbe3863b5206f1930b237fb4793fbcd /net.c
parent25312cdd58c66ead7c218ce88e5994f47e7c9266 (diff)
downloaddhcpcd-f0f4b8b6df73aaa57672c47a7f339b52db23e68f.tar.xz
Use static buffers for ARP and move the send code to arp.c. Also, move the hwaddr buffer to the top of the file for clarity.
Diffstat (limited to 'net.c')
-rw-r--r--net.c72
1 files changed, 18 insertions, 54 deletions
diff --git a/net.c b/net.c
index 53db602e..81e2eee4 100644
--- a/net.c
+++ b/net.c
@@ -75,6 +75,8 @@
#include "net.h"
#include "signals.h"
+static char hwaddr_buffer[(HWADDR_LEN * 3) + 1];
+
int
inet_ntocidr(struct in_addr address)
{
@@ -132,8 +134,7 @@ get_netmask(uint32_t addr)
char *
hwaddr_ntoa(const unsigned char *hwaddr, size_t hwlen)
{
- static char buffer[(HWADDR_LEN * 3) + 1];
- char *p = buffer;
+ char *p = hwaddr_buffer;
size_t i;
for (i = 0; i < hwlen && i < HWADDR_LEN; i++) {
@@ -144,7 +145,7 @@ hwaddr_ntoa(const unsigned char *hwaddr, size_t hwlen)
*p ++= '\0';
- return buffer;
+ return hwaddr_buffer;
}
size_t
@@ -553,10 +554,7 @@ int
open_udp_socket(struct interface *iface)
{
int s;
- union sockunion {
- struct sockaddr sa;
- struct sockaddr_in sin;
- } su;
+ struct sockaddr_in sin;
int n;
#ifdef SO_BINDTODEVICE
struct ifreq ifr;
@@ -579,11 +577,11 @@ open_udp_socket(struct interface *iface)
n = 1;
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1)
goto eexit;
- memset(&su, 0, sizeof(su));
- su.sin.sin_family = AF_INET;
- su.sin.sin_port = htons(DHCP_CLIENT_PORT);
- su.sin.sin_addr.s_addr = iface->addr.s_addr;
- if (bind(s, &su.sa, sizeof(su)) == -1)
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(DHCP_CLIENT_PORT);
+ sin.sin_addr.s_addr = iface->addr.s_addr;
+ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1)
goto eexit;
iface->udp_fd = s;
@@ -599,17 +597,14 @@ 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 sockaddr_in sin;
+
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = to.s_addr;
+ sin.sin_port = htons(DHCP_SERVER_PORT);
+ return sendto(iface->udp_fd, data, len, 0,
+ (struct sockaddr *)&sin, sizeof(sin));
}
struct udp_dhcp_packet
@@ -745,34 +740,3 @@ valid_udp_packet(const uint8_t *data)
return retval;
}
-int
-send_arp(const struct interface *iface, int op, in_addr_t sip, in_addr_t tip)
-{
- struct arphdr *arp;
- size_t arpsize;
- uint8_t *p;
- int retval;
-
- arpsize = sizeof(*arp) + 2 * iface->hwlen + 2 * sizeof(sip);
- arp = xmalloc(arpsize);
- arp->ar_hrd = htons(iface->family);
- arp->ar_pro = htons(ETHERTYPE_IP);
- arp->ar_hln = iface->hwlen;
- arp->ar_pln = sizeof(sip);
- arp->ar_op = htons(op);
- p = (uint8_t *)arp;
- p += sizeof(*arp);
- memcpy(p, iface->hwaddr, iface->hwlen);
- p += iface->hwlen;
- memcpy(p, &sip, sizeof(sip));
- p += sizeof(sip);
- /* ARP requests should ignore this */
- retval = iface->hwlen;
- while (retval--)
- *p++ = '\0';
- memcpy(p, &tip, sizeof(tip));
- p += sizeof(tip);
- retval = send_raw_packet(iface, ETHERTYPE_ARP, arp, arpsize);
- free(arp);
- return retval;
-}