После поиска декодирования пакетов для многоадресных и широковещательных пакетов у меня возникли некоторые трудности при создании логики принятия решений.Из того, что я читал и наблюдал с помощью 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;
}
Есть мысли?