tap interface

Fórumok

Üdv mindenkinek!

Tud valaki olyan leírásról ami használható és leírják benne, hogy a tap interface-t hogyan kell használni?
Már teljesen kikészít.
Annyira lenne szükségem, hogy a programom létre tudjon hozni egy tap interface-t és ki tudja olvasni az arra küldött csomagokat majd át tudja írni egy másikra.

Hozzászólások

Ne használja ugyanazt a hálózati címet, mint a fizikai hálózat!
Például, ha a fizikai hálózat 192.168.0.x, eltérő IP cím 192.168.200.y

* te tudod hogy qju vagyok ?

Ha jól tévedek a hercules emulátor használ tun/tap device-t. Nézz bele a forráskódjába, ott hogy csinálják!

Letrehozas, mknod.
Ha emlekeim nem csalnak, siman open, select, read, write a menete.
Itt a forraskodban volt regen minta program is, ha jol emlekszem pont a te problemadra:
http://vtun.sourceforge.net/


...

 int            fd;
 struct ifreq   ifr;

 if ( (fd=open("/dev/net/tun",O_RDWR)) < 0 )
        return(-1);

 memset(&ifr, 0, sizeof(ifr));

 ifr.ifr_flags = IFF_TUN | IFF_NO_PI; 
 if ( dev != NULL && *dev )
        strncpy(ifr.ifr_name,dev,IFNAMSIZ);

 if ( (err=ioctl(fd,TUNSETIFF,(void *)&ifr)) < 0 )
  {     close(fd);
        return(err);
  }

 /* + check ifr.ifr_name */

egy-ket megjegyzes:
- ha csak tun-t kell csinalnod, akkor igy erdemes. ha tap-ot, akkor is (IFF_TAP), csak vigyazz, hogy akkor a teljes eth-frame kijon a cso"bo"l, es nemcsak az ip-csomag
- az IFF_NO_PI-t erdemes beallitani, mert igy tenyleg csak a csomagok jonnek ki az fd-bol. ha ezt nem allitod be akkor 4 byte-ot kikuld (es elva'r) minden csomag elott, aminek (szerintem legalabbis) a gyakorlatban semmi jelentosege nincs, teljesen redundans (konkretan tun-nal ez 00 00 08 00)
- ha ez a fenti tun/tap alloka'tor lefut, neked me'g ezt az interface-t ugyanugy fel kell konfiguralni. erre ket lehetoseged van: 1/ vagy kezzel futtatsz valamit (shell-bol /sbin/ifconfig, vagy progibol system()-mel vagy execve()-vel kihivod), 2/ vagy szinten ioctl()-ekkel felprogramozod. .. de:
- ezutobbi esetben nem ezt a /dev/net/tun-ra mutato fd-t kell konfiguralnod, hanem csinalsz egy pf_packet/sock_raw osztalyu socket-et, erre a socket-re kersz a megfelelo nevvel (amit az ifr.ifr_name-ban megtalalsz) egy iface indexet (SIOCGIFINDEX), majd ha ez megvan, akkor a tobbi ifreq struktura't - ami maga't az ifconfig-ola'st (de sze'p ige :]) vegzi a hozza kapcsolodo ioctl()-eken keresztul - feltoltod megfelelo ertekekkel es ezzel az interface indexszel. de elso peldaprogramra/tesztelesre egyszerubb ha kezzel meghivod az /sbin/ifconfig-ot ;)

mi az alapproblemad egyebkent amire ez kell? (csak pl tun-nal /ami egy ppp osztalyu interface-t ad/ egyszerubb dolgozni... nagyon kell a tap?)

a.

szerk: bocs, nem feltetlenul pf_packet/sock_raw osztalyu socket-et kell csinalni, ha ifconfigolnal, mert ez inkabb eth-szinten nyul a csomagokhoz (azaz ha kezzel akarsz eth frame-kat kuldozgetni, fogadni, pl aoe-t implementalsz, vagy ilyesmivel jatszani... ezzel kevertem igy hirtelen). a pf_inet/sock_dgram/ipproto_ip lehet a nyero" vagy a pf_inet/sock_raw/0. mondjuk a vicc az, hogy ha pf_inet szinen kezeljuk a socket-et, akkor is ki lehet nyerni a hwaddr-t meg ilyesmiket, amiknek elvileg nemsok koze van az ip(v4) layerhez. meg lehet nezni peldaul egy `strace /sbin/ifconfig -a` hivast, hogy miket, milyen ioctl()-eket meg socket()-eket hiv meg, es kezi konfiguralasnal ugyanezt kell csinalni csak a SIOCGIF* helyett a megfelelo" SIOCSIF* request-ekkel.