12 |
#include <net/if_arp.h> |
#include <net/if_arp.h> |
13 |
#include <netinet/in.h> |
#include <netinet/in.h> |
14 |
#include <linux/route.h> |
#include <linux/route.h> |
15 |
|
#include <linux/sockios.h> |
16 |
|
|
17 |
#include "netdev.h" |
#include "netdev.h" |
18 |
|
|
41 |
|
|
42 |
static int netdev_sif_addr(struct ifreq *ifr, int cmd, uint32_t addr) |
static int netdev_sif_addr(struct ifreq *ifr, int cmd, uint32_t addr) |
43 |
{ |
{ |
44 |
struct sockaddr_in *sin = (struct sockaddr_in *)&ifr->ifr_addr; |
struct sockaddr_in sin; |
45 |
|
|
46 |
sin->sin_family = AF_INET; |
memset(&sin, 0, sizeof(sin)); |
47 |
sin->sin_addr.s_addr = addr; |
sin.sin_family = AF_INET; |
48 |
|
sin.sin_addr.s_addr = addr; |
49 |
|
|
50 |
|
memcpy(&ifr->ifr_addr, &sin, sizeof sin); |
51 |
|
|
52 |
return ioctl(cfd, cmd, ifr); |
return ioctl(cfd, cmd, ifr); |
53 |
} |
} |
79 |
return 0; |
return 0; |
80 |
} |
} |
81 |
|
|
82 |
|
static void set_s_addr(struct sockaddr *saddr, uint32_t ipaddr) |
83 |
|
{ |
84 |
|
struct sockaddr_in sin = { |
85 |
|
.sin_family = AF_INET, |
86 |
|
.sin_addr.s_addr = ipaddr, |
87 |
|
}; |
88 |
|
memcpy(saddr, &sin, sizeof sin); |
89 |
|
} |
90 |
|
|
91 |
int netdev_setdefaultroute(struct netdev *dev) |
int netdev_setdefaultroute(struct netdev *dev) |
92 |
{ |
{ |
93 |
struct rtentry r; |
struct rtentry r; |
97 |
|
|
98 |
memset(&r, 0, sizeof(r)); |
memset(&r, 0, sizeof(r)); |
99 |
|
|
100 |
((struct sockaddr_in *)&r.rt_dst)->sin_family = AF_INET; |
set_s_addr(&r.rt_dst, INADDR_ANY); |
101 |
((struct sockaddr_in *)&r.rt_dst)->sin_addr.s_addr = INADDR_ANY; |
set_s_addr(&r.rt_gateway, dev->ip_gateway); |
102 |
((struct sockaddr_in *)&r.rt_gateway)->sin_family = AF_INET; |
set_s_addr(&r.rt_genmask, INADDR_ANY); |
|
((struct sockaddr_in *)&r.rt_gateway)->sin_addr.s_addr = |
|
|
dev->ip_gateway; |
|
|
((struct sockaddr_in *)&r.rt_genmask)->sin_family = AF_INET; |
|
|
((struct sockaddr_in *)&r.rt_genmask)->sin_addr.s_addr = INADDR_ANY; |
|
103 |
r.rt_flags = RTF_UP | RTF_GATEWAY; |
r.rt_flags = RTF_UP | RTF_GATEWAY; |
104 |
|
|
105 |
if (ioctl(cfd, SIOCADDRT, &r) == -1 && errno != EEXIST) { |
if (ioctl(cfd, SIOCADDRT, &r) == -1 && errno != EEXIST) { |