RAW Socket - EtherType a přijímat algoritmus - C

hlasů
3

Pracuji se syrovým zásuvky v jazyce C. Musím odesílat a přijímat raw Ethernet paket. Paket by se mělo začít s IEEE 802.3 záhlaví:

MAC DST [0-5] - MAC SRC [6-11] - ETH TYPE [12-13]

Chytat pakety s wireshark vidím následující strukturu:

MAC DST [0-5] - MAC SRC [6-11] - délka [12-13] - přívěs [14-58] -....

To je můj kód:

...
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
memcpy(ptr_eth_header->DstMac, dst_mac, 6);
memcpy(ptr_eth_header->SrcMac, src_mac, 6);
ptr_eth_header->Type = htons(ETH_P_802_3);
memcpy(buffer + ETHHDR_SIZE, data, 60);
...
sockaddr.sll_family = htons(PF_PACKET);
sockaddr.sll_protocol = htons(ETH_P_802_3);
sockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;
sockaddr.sll_halen = 6;
memcpy(&(sockaddr.sll_addr), dst_mac, 6);
...
bytes = sendto(sraw, buffer, sizeof(buffer), 0, (struct sockaddr *) &(sockaddr), sizeof (struct sockaddr_ll));

Je to jen Wireshark je „problém“? Nějaké nápady?

Můj druhý problém je o přijetí nezpracovaných zpráv. Proces je přilepená na recvfrom.

To je můj kód:

sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
val = CLIENT_PACKET_SIZE;
retVal = setsockopt(sraw, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val));

sockaddr.sll_family    = htons(PF_PACKET);
sockaddr.sll_ifindex   = ifr.ifr_ifindex;
sockaddr.sll_protocol  = htons(ETH_P_802_3);

buffer = malloc(CLIENT_PACKET_SIZE * sizeof(char));
while (count < PACKET_COUNT) {
    bytes = recvfrom(sraw, buffer, CLIENT_PACKET_SIZE, 0, (struct sockaddr *)&sockaddr, (socklen_t*)sizeof(sockaddr));
    ...
}

Mohl byste mi pomoct?

Díky předem!

Položena 12/03/2012 v 14:18
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Našel jsem odpověď o mou první otázku: Používám EtherType == 0x0001 místo EtherType> = 0x0600

http://www.cavebear.com/archive/cavebear/Ethernet/type.html

A co na druhou otázku? Co je s mým kódem špatně?

Odpovězeno 13/03/2012 v 08:16
zdroj uživatelem

hlasů
0

Jeden slovní odpověď na vaši otázku je obtížné. Ale pokud se mě ptáte, proč recvfrom mohlo být přilepená, se svým kódem, řekl bych, že nemusí být dostat žádný paket, který by splňoval vaše podmínku filtru. Jste si jisti, že jste kolemjdoucí hodnotu ifindex v očekávaném formátu? Vidím, že jste projít ifindex sockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue; jako je to v sendto.

Jiné důvody mohou být, velikost vyrovnávací paměti můžete nastavit na zásuvce je nepodložený jádro nebo jádro běží ven nárazníky a mnoha dalších důvodů. ale šance, že některé z nich jsou minimální.

Také pro váš scénář, Navrhoval bych používat zásuvku non-blokování namísto blokování. Zavolejte recvfrom pouze tehdy, když víte, že pakety, které čekají na čtení.

Odpovězeno 03/10/2013 v 05:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more