Obtendo a interface MTU no Linux com o PCAP

2

Estou interessado em armazenar pacotes que eu fungo usando PCAP.

Como eu pré-aloco a memória que eu preciso - ou seja, um múltiplo do MTU da interface da qual estou farejando, gostaria de descobrir quanta memória eu preciso antes de abrir a sessão ao vivo.

É possível consultar o PCAP para obter o MTU da interface detectada?

Como posso obter essa informação de outra forma (possivelmente usando bibliotecas do sistema)?

Obrigado

    
por ziu 18.02.2012 / 18:26

2 respostas

2

Não há uma maneira direta de fazer isso no PCAP (sem API).

No entanto, para o Linux > = 2.6 o Solvent publicou uma solução simples que está lendo um arquivo como o seguinte:% código%. É trivial fazer isso em C.

int getMTU(char *name) {
FILE *f;
char buf[128];
char *line = NULL;
ssize_t count;
size_t len = 0;
int mtu;

snprintf(buf, sizeof(buf), "/sys/class/net/%s/mtu", name);
f = fopen(buf, "r");
if(!f) {
    perror("Error opening:");
    exit(EXIT_FAILURE);
}
count = getline(&line, &len, f);

if (count == -1) {
    perror("Error opening:");
    exit(EXIT_FAILURE);
}
sscanf(line, "%d\n", &mtu);
fclose(f);

return mtu;
}

Lendo a fonte do PCAP, descobri que os desenvolvedores do PCAP usaram uma solução mais complexa, mas elegante, para ler a interface MTU invocando /sys/class/net/INTERFACE_X/mtu . Esta é uma versão simplificada que escrevi:

#include <sys/ioctl.h>
#include <net/if.h>

int get_mtu(int fd, const char *device) {
struct ifreq ifr;

if (!device)
    return 65535;

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));

if (ioctl(fd, SIOCGIFMTU, &ifr) == -1) {
    perror("Error opening:");
    exit(EXIT_FAILURE);
}

return ifr.ifr_mtu;
}

Para referências adicionais, ioctl é sugerido.

    
por 19.02.2012 / 19:19
4

Uma opção no linux seria o arquivo sysfs mtu em / sys / class / net / devicename

$ cat /sys/class/net/eth0/mtu /sys/class/net/lo/mtu
1500
16436
    
por 18.02.2012 / 19:46

Tags