2016-09-01 20 views
0

Я следил за кодом в here и исправил проблему для распечатки IP-адреса. Я отлично работал, когда он читал захваченный файл с моей машины, и результаты одинаковы с tcpdump. Однако, когда я читаю еще один файл pcap (захвачен с граничного маршрутизатора большой сети), он дает мне совершенно разные IP-адреса. Я обнаружил, что эти pcap содержат VLAN в кадрах Ethernet. Как определить, содержит ли пакет заголовок vlan?Как я могу обойти заголовок vlan, когда я прочитал pcap в C?

+0

Прочитайте спецификацию vlan, чтобы узнать значения поля заголовка, чтобы вы могли проанализировать пакет? Он скажет вам, что ethertype 802.1q - 0x8100. Для QinQ 802.1ad это 0x88A8. – kaylum

ответ

0

Вам нужно будет изучить протокол физического уровня (в настоящее время, скорее всего, ethernet), и определить тип ethernet (13-й и 14-й байты заголовка ethernet). Вы можете просмотреть примерный список возможных типов Ethernet here.

Если тип 0x0800 (IPv4), то все должно работать должным образом.

Однако, если Ethertype является 0x8100 (802.1Q) вы должны извлечь фактический тип полезной нагрузки из заголовка VLAN (17 и 18-байт)

Вот очень сырой код, чтобы обойти верхний слои, начиная с базовым адресом, указывающего на локальной сети, начиная

char *get_ip_hdr(char *base) { 

    // If frame is not ethernet retun NULL 

    uint16_t ether_type = ntohs(*(uint16_t *) (base + 12)); 
    if (ether_type == 0x0800) { 
     return base + 14; 
    } else if (ether_type == 0x8100) { 
     // VLAN tag 
     ether_type = ntohs(*(uint16_t *) (base + 16)); 
     if (ether_type == 0x800) { 
      return base + 18; 
     } 
    } 

    return NULL 
} 

Примечания опасайтесь double VLAN tagging и принять необходимые меры, аналогичные, чтобы пропустить его.