[ Pobierz całość w formacie PDF ]
.Trzecie pole nagłówka ethernetowego zawiera numer przenoszonego protokołu wy ższej warstwy - tutaj jestto ARP.Po stworzeniu nagłówka wstawiamy g o na początek bufora przeznaczonego na cał ą ramkę (pktbuf).Możeby teraz zająć się stworzeniem następnego nagłówka (ARP):81http://debian.esko.plStruktura nagłówka ARP jest zdefiniowana tak ( linux/if_arp.h):Patrząc na kod programu widzimy, że pole ar_hrd wypełniamy wartością ARPHRD_ETHER(linux/if_arp.h) - oznacza to, że będziemy dokonywać konwersji NA adres ethernetowy.Kolejna linijka ustawiaar_pro na ETH_P_IP - będziemy konwertować Z adresu IP.Dwa kolejne pola (ar_hln, ar_pln) oznaczaj ą kolejnodługość adresu fizycznego (MAC) i sieciowego (IP).Nast ępnie polu ar_op nadajemy warto śćARPOP_REQUEST.Istnieje kilka różnych operacji ARP (linux/if_arp.h).My zamierzamy zamienić IP na MAC,a do tego używa się ARPOP_REQUEST.Pozostały jeszcze cztery pola.yródłowy adres MAC to nasz adres.yródłowy adres IP nie ma tu znaczenia dlatego go z erujemy.Docelowego adresu MAC nie znamy - to polezostanie uzupełnione przez komputer, który odpowie na zapytanie ARP.Na koniec docelowy adres IP, czyliadres, o którego konwersję zabiegamy.Pozostało już tylko dokleić nagłówek ARP zaraz za nagłówkiemethernetowym (w buforze pktbuf).Poświęćmy jeszcze chwilę na omówienie samego protokołu ARP.W sieć zostanie wysłana ramkazaadresowana do wszystkich komputerów.Ka żdy z komputerów odbiera tą ramkę i patrzy, co jest w środku.Znajduje tam zapytanie ARP (ARPOP_REQUEST).Sprawdza więc, czy docelowy adres IP (adr_tip) jest jegowłasnym adresem.Jeśli stwierdzi, że tak jest to zamienia miejscami pola: ar_shaar_tha oraz ar_sipar_tip aar_op ustawia na ARPOP_REPLY (odpowiedz ARP).Następnie tak zmieniony paket opakowuje w ramkęethernetową i wysyła pod adres ar_tha.Kiedy komputer inicjuj ący całą tą operację otrzyma odpowiedz ARP,zagląda do pola ar_sha (bądz do adresu zródłowego w nagłówku ethernetowym) gdzie znajduje si ę adres, o któryprosił.Możemy teraz wysłać ramkę w sieć:Jak zawsze przed użyciem sendto() musimy wypełnić strukturę opisującą adres zdalnego komputera.Wprzypadku PF_PACKET struktura ta wygląda tak (linux/if_packet.h):82http://debian.esko.plWystarczy, że wypełnimy tylko trzy pola: sll_family, sll_protocol i sll_ifindex.Reszta informacjipotrzebna do wysłania ramki znajduje si ę w buforze pktbuf.Należy pamiętać o odpowiednim dobraniu trzeciegoparametru dla funkcji sendto() (długość bufora).Jest on równy długości nagłówka ethernetowego + długośćnagłówka ARP + długość samego zapytania ARP.Używamy znanej już funkcji select() aby poczekać na odpowied z ARP.Czekamy maksymalnieTIMEOUT sekund.Jeśli select() zwróci 0 to znaczy, że upłynąl limit czasowy.W przeciwnym przypadku odbieramy przybył ą właśnie ramkę.Zwróćmy uwagę na zastosowanie recv()zamiast recvfrom() - w tym przypadku wystarczy nam recv() ponieważ dane adresowe zdalnego komputera i takodczytamy z nagłówka ethernetowego.Następnie ustawiamy wskazniki do nagłówka ethernetowego (pocz ątekbufora pktbuf) i do nagłówka arp (zaraz za nagłówkiem ethernetowym)
[ Pobierz całość w formacie PDF ]