1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <net/if.h>
27
28#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION
29#include <netpacket/packet.h>
30#include <net/ethernet.h>
31#else
32#include <asm/types.h>
33#include <linux/if_packet.h>
34#include <linux/if_ether.h>
35#endif
36
37#include "common.h"
38
39
40int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac)
41{
42 int fd;
43 struct ifreq ifr;
44 struct sockaddr_in *our_ip;
45
46 memset(&ifr, 0, sizeof(ifr));
47 fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW);
48
49 ifr.ifr_addr.sa_family = AF_INET;
50 strncpy_IFNAMSIZ(ifr.ifr_name, interface);
51 if (nip) {
52 if (ioctl_or_perror(fd, SIOCGIFADDR, &ifr,
53 "is interface %s up and configured?", interface)
54 ) {
55 close(fd);
56 return -1;
57 }
58 our_ip = (struct sockaddr_in *) &ifr.ifr_addr;
59 *nip = our_ip->sin_addr.s_addr;
60 log1("IP %s", inet_ntoa(our_ip->sin_addr));
61 }
62
63 if (ifindex) {
64 if (ioctl_or_warn(fd, SIOCGIFINDEX, &ifr) != 0) {
65 close(fd);
66 return -1;
67 }
68 log1("Adapter index %d", ifr.ifr_ifindex);
69 *ifindex = ifr.ifr_ifindex;
70 }
71
72 if (mac) {
73 if (ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr) != 0) {
74 close(fd);
75 return -1;
76 }
77 memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
78 log1("MAC %02x:%02x:%02x:%02x:%02x:%02x",
79 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
80 }
81
82 close(fd);
83 return 0;
84}
85
86
87
88int FAST_FUNC udhcp_listen_socket( int port, const char *inf)
89{
90 int fd;
91 struct sockaddr_in addr;
92
93 log1("Opening listen socket on *:%d %s", port, inf);
94 fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
95
96 setsockopt_reuseaddr(fd);
97 if (setsockopt_broadcast(fd) == -1)
98 bb_perror_msg_and_die("SO_BROADCAST");
99
100
101 if (setsockopt_bindtodevice(fd, inf))
102 xfunc_die();
103
104 memset(&addr, 0, sizeof(addr));
105 addr.sin_family = AF_INET;
106 addr.sin_port = htons(port);
107
108 xbind(fd, (struct sockaddr *)&addr, sizeof(addr));
109
110 return fd;
111}
112