75 |
struct ifreq ifr; |
struct ifreq ifr; |
76 |
int fd; |
int fd; |
77 |
|
|
78 |
strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, dev); |
79 |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
80 |
xioctl(fd, SIOCGIFINDEX, &ifr); |
xioctl(fd, SIOCGIFINDEX, &ifr); |
81 |
close(fd); |
close(fd); |
88 |
int fd; |
int fd; |
89 |
int err; |
int err; |
90 |
|
|
91 |
strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, dev); |
92 |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
93 |
err = ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr); |
err = ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr); |
94 |
close(fd); |
close(fd); |
114 |
int fd; |
int fd; |
115 |
int err; |
int err; |
116 |
|
|
117 |
strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, basedev); |
118 |
ifr.ifr_ifru.ifru_data = (void*)p; |
ifr.ifr_ifru.ifru_data = (void*)p; |
119 |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
120 |
err = ioctl_or_warn(fd, SIOCGETTUNNEL, &ifr); |
err = ioctl_or_warn(fd, SIOCGETTUNNEL, &ifr); |
129 |
int fd; |
int fd; |
130 |
|
|
131 |
if (cmd == SIOCCHGTUNNEL && p->name[0]) { |
if (cmd == SIOCCHGTUNNEL && p->name[0]) { |
132 |
strncpy(ifr.ifr_name, p->name, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, p->name); |
133 |
} else { |
} else { |
134 |
strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, basedev); |
135 |
} |
} |
136 |
ifr.ifr_ifru.ifru_data = (void*)p; |
ifr.ifr_ifru.ifru_data = (void*)p; |
137 |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
155 |
int fd; |
int fd; |
156 |
|
|
157 |
if (p->name[0]) { |
if (p->name[0]) { |
158 |
strncpy(ifr.ifr_name, p->name, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, p->name); |
159 |
} else { |
} else { |
160 |
strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name)); |
strncpy_IFNAMSIZ(ifr.ifr_name, basedev); |
161 |
} |
} |
162 |
ifr.ifr_ifru.ifru_data = (void*)p; |
ifr.ifr_ifru.ifru_data = (void*)p; |
163 |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
189 |
int key; |
int key; |
190 |
|
|
191 |
memset(p, 0, sizeof(*p)); |
memset(p, 0, sizeof(*p)); |
192 |
memset(&medium, 0, sizeof(medium)); |
medium[0] = '\0'; |
193 |
|
|
194 |
p->iph.version = 4; |
p->iph.version = 4; |
195 |
p->iph.ihl = 5; |
p->iph.ihl = 5; |
222 |
} |
} |
223 |
p->iph.protocol = IPPROTO_IPV6; |
p->iph.protocol = IPPROTO_IPV6; |
224 |
} else { |
} else { |
225 |
bb_error_msg_and_die("%s tunnel mode", "cannot guess"); |
bb_error_msg_and_die("%s tunnel mode", "can't guess"); |
226 |
} |
} |
227 |
} else if (key == ARG_key) { |
} else if (key == ARG_key) { |
228 |
unsigned uval; |
unsigned uval; |
232 |
if (strchr(*argv, '.')) |
if (strchr(*argv, '.')) |
233 |
p->i_key = p->o_key = get_addr32(*argv); |
p->i_key = p->o_key = get_addr32(*argv); |
234 |
else { |
else { |
235 |
if (get_unsigned(&uval, *argv, 0) < 0) { |
uval = get_unsigned(*argv, "key"); |
|
invarg(*argv, "key"); |
|
|
} |
|
236 |
p->i_key = p->o_key = htonl(uval); |
p->i_key = p->o_key = htonl(uval); |
237 |
} |
} |
238 |
} else if (key == ARG_ikey) { |
} else if (key == ARG_ikey) { |
242 |
if (strchr(*argv, '.')) |
if (strchr(*argv, '.')) |
243 |
p->o_key = get_addr32(*argv); |
p->o_key = get_addr32(*argv); |
244 |
else { |
else { |
245 |
if (get_unsigned(&uval, *argv, 0) < 0) { |
uval = get_unsigned(*argv, "ikey"); |
|
invarg(*argv, "ikey"); |
|
|
} |
|
246 |
p->i_key = htonl(uval); |
p->i_key = htonl(uval); |
247 |
} |
} |
248 |
} else if (key == ARG_okey) { |
} else if (key == ARG_okey) { |
252 |
if (strchr(*argv, '.')) |
if (strchr(*argv, '.')) |
253 |
p->o_key = get_addr32(*argv); |
p->o_key = get_addr32(*argv); |
254 |
else { |
else { |
255 |
if (get_unsigned(&uval, *argv, 0) < 0) { |
uval = get_unsigned(*argv, "okey"); |
|
invarg(*argv, "okey"); |
|
|
} |
|
256 |
p->o_key = htonl(uval); |
p->o_key = htonl(uval); |
257 |
} |
} |
258 |
} else if (key == ARG_seq) { |
} else if (key == ARG_seq) { |
285 |
p->iph.saddr = get_addr32(*argv); |
p->iph.saddr = get_addr32(*argv); |
286 |
} else if (key == ARG_dev) { |
} else if (key == ARG_dev) { |
287 |
NEXT_ARG(); |
NEXT_ARG(); |
288 |
strncpy(medium, *argv, IFNAMSIZ-1); |
strncpy_IFNAMSIZ(medium, *argv); |
289 |
} else if (key == ARG_ttl) { |
} else if (key == ARG_ttl) { |
290 |
unsigned uval; |
unsigned uval; |
291 |
NEXT_ARG(); |
NEXT_ARG(); |
292 |
key = index_in_strings(keywords, *argv); |
key = index_in_strings(keywords, *argv); |
293 |
if (key != ARG_inherit) { |
if (key != ARG_inherit) { |
294 |
if (get_unsigned(&uval, *argv, 0)) |
uval = get_unsigned(*argv, "TTL"); |
|
invarg(*argv, "TTL"); |
|
295 |
if (uval > 255) |
if (uval > 255) |
296 |
invarg(*argv, "TTL must be <=255"); |
invarg(*argv, "TTL must be <=255"); |
297 |
p->iph.ttl = uval; |
p->iph.ttl = uval; |
313 |
} |
} |
314 |
if (p->name[0]) |
if (p->name[0]) |
315 |
duparg2("name", *argv); |
duparg2("name", *argv); |
316 |
strncpy(p->name, *argv, IFNAMSIZ); |
strncpy_IFNAMSIZ(p->name, *argv); |
317 |
if (cmd == SIOCCHGTUNNEL && count == 0) { |
if (cmd == SIOCCHGTUNNEL && count == 0) { |
318 |
struct ip_tunnel_parm old_p; |
struct ip_tunnel_parm old_p; |
319 |
memset(&old_p, 0, sizeof(old_p)); |
memset(&old_p, 0, sizeof(old_p)); |
358 |
} |
} |
359 |
} |
} |
360 |
|
|
|
|
|
361 |
/* Return value becomes exitcode. It's okay to not return at all */ |
/* Return value becomes exitcode. It's okay to not return at all */ |
362 |
static int do_add(int cmd, char **argv) |
static int do_add(int cmd, char **argv) |
363 |
{ |
{ |
377 |
case IPPROTO_IPV6: |
case IPPROTO_IPV6: |
378 |
return do_add_ioctl(cmd, "sit0", &p); |
return do_add_ioctl(cmd, "sit0", &p); |
379 |
default: |
default: |
380 |
bb_error_msg_and_die("cannot determine tunnel mode (ipip, gre or sit)"); |
bb_error_msg_and_die("can't determine tunnel mode (ipip, gre or sit)"); |
381 |
} |
} |
382 |
} |
} |
383 |
|
|
436 |
printf(" inherit"); |
printf(" inherit"); |
437 |
if (p->iph.tos & ~1) |
if (p->iph.tos & ~1) |
438 |
printf("%c%s ", p->iph.tos & 1 ? '/' : ' ', |
printf("%c%s ", p->iph.tos & 1 ? '/' : ' ', |
439 |
rtnl_dsfield_n2a(p->iph.tos & ~1, b1, sizeof(b1))); |
rtnl_dsfield_n2a(p->iph.tos & ~1, b1)); |
440 |
} |
} |
441 |
if (!(p->iph.frag_off & htons(IP_DF))) |
if (!(p->iph.frag_off & htons(IP_DF))) |
442 |
printf(" nopmtudisc"); |
printf(" nopmtudisc"); |
499 |
continue; |
continue; |
500 |
type = do_ioctl_get_iftype(name); |
type = do_ioctl_get_iftype(name); |
501 |
if (type == -1) { |
if (type == -1) { |
502 |
bb_error_msg("cannot get type of [%s]", name); |
bb_error_msg("can't get type of [%s]", name); |
503 |
continue; |
continue; |
504 |
} |
} |
505 |
if (type != ARPHRD_TUNNEL && type != ARPHRD_IPGRE && type != ARPHRD_SIT) |
if (type != ARPHRD_TUNNEL && type != ARPHRD_IPGRE && type != ARPHRD_SIT) |