#c #linux #network-programming #linux-kernel
#c #linux #сетевое программирование #linux-ядро
Вопрос:
Каков программный способ включения или отключения интерфейса в пространстве ядра? Что следует сделать?
Комментарии:
1. Какой тип интерфейса и на каком языке используется?
2. На самом деле я не упоминал, но это будет в типах C и eth.
Ответ №1:
… с помощью IOCTL…
ioctl(skfd, SIOCSIFFLAGS, amp;ifr);
… с установленным или отключенным битом IFF_UP в зависимости от того, хотите ли вы соответствующим образом увеличить или уменьшить интерфейс, т.Е.:
static int set_if_up(char *ifname, short flags)
{
return set_if_flags(ifname, flags | IFF_UP);
}
static int set_if_down(char *ifname, short flags)
{
return set_if_flags(ifname, flags amp; ~IFF_UP);
}
Код скопирован из сетевой документации Linux.
Ответ №2:
Код для запуска eth0:
int sockfd;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
return;
memset(amp;ifr, 0, sizeof ifr);
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_flags |= IFF_UP;
ioctl(sockfd, SIOCSIFFLAGS, amp;ifr);
Ответ №3:
int skfd = -1; /* AF_INET socket for ioctl() calls.*/
int set_if_flags(char *ifname, short flags)
{
struct ifreq ifr;
int res = 0;
ifr.ifr_flags = flags;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("socket error %sn", strerror(errno));
res = 1;
goto out;
}
res = ioctl(skfd, SIOCSIFFLAGS, amp;ifr);
if (res < 0) {
printf("Interface '%s': Error: SIOCSIFFLAGS failed: %sn",
ifname, strerror(errno));
} else {
printf("Interface '%s': flags set to X.n", ifname, flags);
}
out:
return res;
}
int set_if_up(char *ifname, short flags)
{
return set_if_flags(ifname, flags | IFF_UP);
}
использование :
set_if_up("eth0", 1);