Nowe posty

Autor Wątek: [C][Kernel Module] Przetwarzanie ramki Ethernet  (Przeczytany 3217 razy)

  • Gość
[C][Kernel Module] Przetwarzanie ramki Ethernet
« dnia: 2009-06-12, 18:12:47 »
Witam.
Jestem poczatkujacym w swiecie linuxa, wiec od razu przepraszam za ewentualne lamerstwo. Dostałem zadanie stworzenia modułu do jądra, które będzie przetwarzać ramkę Ethernetu. Szybko zaznajomiłem się z obługą Ethernetu w przestrzeni użytkownika tj. stworzenie socketu, odbieranie funkcją recvmsg etc. Jeśli chodzi zaś o zgranie tego z modułem jądra to nie mam pojęcia jak to zrobić. Próbowałem wykorzystać funkcję ioctl do przesyłania parametrów do jądra, ale zakończyło się to fiaskiem. Zatem chciałbym spytać, jak powinno to być zrealizowane, jakimi funkcjami? I jak to najlepiej zrobić ? Dziękuję z góry.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3062
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
[C][Kernel Module] Przetwarzanie ramki Ethernet
« Odpowiedź #1 dnia: 2009-06-12, 22:12:33 »
1. Rozumiem, że przez cały semestr wykładowaca puszczał wam na wykładach Władcę Pierścieni, Matriksa i inne kultowe w pewnych środowiskach filmy, ani razu nawet słowem nie wspominając o programowaniu, a programowaniu modułów jądra w szczególności.
2. No albo moduł jądra albo w przestrzeni użytkownika. Przeczytaj dokładnie TREŚĆ zadania.
3. Popatrz na źródła EbTables, tam masz obróbkę ramek Eth z poziomu jądra.
4. Popatrz na TUN/TAP, tam masz obróbkę ramek IP/Eth z poziomu userlandu.
5. Popatrz na źródła Ettercap'a, tam masz też obróbkę i generację ramek Eth.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

  • Gość
[C][Kernel Module] Przetwarzanie ramki Ethernet
« Odpowiedź #2 dnia: 2009-06-13, 00:25:13 »
Dziękuje za odpowiedź. No a jeśli chodzi o wykłady z informatyki to mój dziekan (elektrotechniki) uznaje, że w ramach studiów wyposaży mnie w wiedzę informatycznie - podstawową. Dlatego też nie całkiem dokładnie napisałem o co chodzi.
Zatem, muszę stworzyć moduł do jądra, który będzie w stanie odebrać pakiety ramki Ethernetu.
Podszedłem do tego tak, że stworzyłem zadanie za pomocą komendy kthread_run(), zaś kod źródłowy wywołanego taska widoczny jest poniżej.

  iEthSocket=sock_create(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL), &sSocket);
  if (iEthSocket!=0)
  {
    printk(KERN_INFO "Error: Socket doesn't opened.\\n");
    eSocketState=CLOSED;
  }
  else
  {
    printk(KERN_INFO "Eth Socket opened.\\n");
    eSocketState=OPENED;
    memset(&claddr,0, sizeof(claddr));
    claddr.sin_family = AF_PACKET;
    claddr.sin_port = 5001;
    claddr.sin_addr.s_addr= INADDR_ANY;
    iActionResult=sSocket->ops->bind(sSocket,(struct sockaddr *)&claddr,sizeof (claddr));
    iActionResult=sSocket->ops->listen(sSocket,1);
  }

  for (uiEthFrameCounter=0; uiEthFrameCounter<10; uiEthFrameCounter++)
  {
    if (eSocketState==OPENED)
    {
        uiFrameBytesNo = sock_recvmsg(sSocket, &cBuffer, ETH_FRAME_MAX_LENGTH, 0);
 if (uiFrameBytesNo<42)
 {
   printk(KERN_INFO "Incomplete packet, only %i bytes.\\n",uiFrameBytesNo);
 }
 else
 {
   printk(KERN_INFO "Receive frame: %i bytes.\\n",uiFrameBytesNo);
 }
    }
  }
W zaleceniach, które podesłałeś nie znalazłem niczego podobnego do moich wypocin. Dodam, że gdzieś w momencie wywoływania bind, listen, recvmsg zadanie staje w miejscu. Nie jestem specem sieciowym z racji wykształcenia więc trudno mi dojść do ładu z obsługą przede wszystkim socketów w module.. Gdyby ktoś mógłby rzucić okiem na mój kod byłbym wdzięczny.