Декодирование пакета - широковещательная или многоадресная - PullRequest
1 голос
/ 15 февраля 2012

После поиска декодирования пакетов для многоадресных и широковещательных пакетов у меня возникли некоторые трудности при создании логики принятия решений.Из того, что я читал и наблюдал с помощью wireshark (и смотрел на некоторые его источники), вот что я нашел:

Трансляции:

  • Особый случайдля 0.0.0.0 или, скорее, dst addr 255.255.255.255
  • Локальная широковещательная передача, где биты IG и LG для dst addr установлены в 1
  • Я не могу знать, из какой подсети происходит пакет, и поэтому я не могуопределить конкретные широковещательные адреса из-за пользовательских подсетей.
  • Должен ли я проверить и посмотреть, может ли dest addr быть допустимым широковещательным адресом (например, предположить, что cidr?)

Достаточно ли этого?

Многоадресная передача:

  • Бит IG установлен на 1, а бит LG установлен на 0
  • адрес dst, предназначенный для 224 - 239 подсети (первый октет)

Что у меня так далеко?

/*
* Is packet destined for a multicast address?
*/
int is_multicast(CONNECTION temp)
{

char *save;
save = strtok(inet_ntoa(temp.ip_dst), ".");

int firstOct = 0;
firstOct = atoi(save);

if((temp.ether_dhost[0] == 1 ) && 
   (temp.ether_dhost[1] == 0 ) &&
   ((firstOct >= 224) && 
   (firstOct <= 239))) 
{
    return 1;

}

return 0;
}

/*
* Is packet destined for a broadcast address?
*/
int is_broadcast(CONNECTION temp)
{

    if ((temp.ether_dhost[0] == 0xFF) &&
        (temp.ether_dhost[1] == 0xFF) &&
        (temp.ether_dhost[2] == 0xFF) &&
        (temp.ether_dhost[3] == 0xFF) &&
        (temp.ether_dhost[4] == 0xFF) &&
        (temp.ether_dhost[5] == 0xFF)) {
        return 1;   // DHCP or ARP 
    } else if ((temp.ether_dhost[0] == 0xFF) &&
           (temp.ether_dhost[1] == 0xFF))
        && (temp.ether_dhost[2] != 0xFF) {
        return 1;   // Other local broadcast
    }

    return 0;
}

Есть мысли?

1 Ответ

0 голосов
/ 15 февраля 2012

В случае IPv4 для проверки многоадресной рассылки должно быть достаточно проверки первого октета.

(224 <= first octect <= 239)

Для трансляции я не понял петлю else if() в вашем коде. Первый цикл if() должен дать желаемые результаты.

...