Linux программно увеличивает / уменьшает ядро интерфейса

#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);