2016-09-25 18 views
1

Я пытаюсь проанализировать файл pcap, включая различные типы сетевых пакетов (некоторые из них отмечены как VLAN, а некоторые нет), используя #include. вот мой код до сих пор:Как получить теги VLAN с помощью libpcap и C?

pcap_t *pcap; 
const unsigned char *packet; 
char errbuf[PCAP_ERRBUF_SIZE]; 
struct pcap_pkthdr header; 
pcap = pcap_open_offline(argv[0], errbuf); 
if (pcap == NULL) 
    { 
    fprintf(stderr, "error reading pcap file: %s\n", errbuf); 
    exit(1); 
} 
while ((packet = pcap_next(pcap, &header)) != NULL) 
{ 
    struct ip_header *ip; 
    unsigned int IP_header_length; 
    packet += sizeof(struct ether_header); 
    capture_len -= sizeof(struct ether_header); 
    ip = (struct ip_header*) packet; 
    IP_header_length = ip->vhl * 4; /* ip_hl is in 4-byte words */ 
    char *sinfo = strdup(inet_ntoa(ip->src)); 
    char *dinfo = strdup(inet_ntoa(ip->dst)); 
    printf ("%s<-__->%s\n", sinfo ,dinfo); 
    free (sinfo); 
    free (dinfo); 
} 

Там должно быть где-то в коде, чтобы проверить VLAN и перепрыгивать через них correctly.How я должен различать VLAN пакеты из не-VLANS?

+0

Благодарю за хорошо отформатированный вопрос, я не уверен, однако, если вы спрашиваете «как лучше организовать этот код» или вы спрашиваете «как я могу принести теги VLAN, использующие 'libpcap' ', и если да, ориентируетесь ли вы на 802.1q и ISL? –

+0

Большое спасибо. Я изменил вопрос. Да, я действительно хочу видеть только IP-заголовок. – mazkopolo

ответ

1

(Если вы тестируете это на «живой» среде, важно помнить, что маршрутизаторы могут удалить 802.1q теги перед отсылкой к не транкинговой линии.)

Если у вас есть конкретный протокол платформы & в виду, быстрый способ сделать это всегда будет «вручную» проверить кадр:

htonl(((uint32_t)(ETH_P_8021Q) << 16U) 
    | ((uint32_t)customer_tci & 0xFFFFU)) T 

Однако libpcap обеспечивает портативных & чистых фильтров пакетов в виде функций для compiling a BPF filters и применить (хотя важно отметить, что существуют разные наборы функций для сквозной фильтрации через офф-фильтр)

Таким образом, мы можем использовать pcap_offline_filter для применения скомпилированного фильтра BPF директиву в файл PCAP. Я использовал выражение фильтра vlan здесь, вам может понадобиться еще что-то вроде vlan or ip. Если вам нужно что-то более сложное, you can consult the documentation)

... 

pcap_t *pcap; 
char errbuf[PCAP_ERRBUF_SIZE]; 
const unsigned char *packet; 
struct pcap_pkthdr header; 
struct bpf_program fp; // Our filter expression 
pcap = pcap_open_offline(argv[0], errbuf); 
if (pcap == NULL) { 
    fprintf(stderr, "error reading pcap file: %s\n", errbuf); 
    exit(1); 
} 

// Compile a basic filter expression, you can exam 
if (pcap_compile(pcap, &fp, "vlan", 0, net) == -1) { 
    fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
    return 2; 
} 

while ((packet = pcap_next(pcap, &header) != NULL) 
     && pcap_offline_filter(&fp, header, packet)) { 
    struct ip_header *ip; 
    unsigned int IP_header_length; 
    packet += sizeof(struct ether_header); 
    capture_len -= sizeof(struct ether_header); 
    ip = (struct ip_header*) packet; 
    IP_header_length = ip->vhl * 4; /* ip_hl is in 4-byte words */ 
    char *sinfo = strdup(inet_ntoa(ip->src)); 
    char *dinfo = strdup(inet_ntoa(ip->dst)); 
    printf ("%s<-__->%s\n", sinfo ,dinfo); 
    free (sinfo); 
    free (dinfo); 
} 

...