next up previous contents
Next: Multiplexer ioctl-ek Up: Multiplexer driverek Previous: A multiplexerek elemei

Egy multiplexer összerakása

A következokben látni lehet, hogy egy hálózatoknál is használható multiplexer konfigurációt hogyan rakhatunk össze. A hálózatoknál gyakori probléma az, hogy egy csomópontban levo gépben két (különbözo) hálózati kártya van (ez a gép köt össze két alhálózatot). Például legyen az egyik egy X.25, a másik pedig egy Ethernet kártya. Ekkor az internet protokoll feladata az adatok megfelelo hálózati kártyára küldése, attól függoen, hogy az egyes adatcsomagok rendeltetési helye melyik alhálózatban van. Itt a következoket csinálhatjuk : meg kell nyitni az Ethernet és az X.25 kártya driverét (ezek természetesen STREAMS device driverek; nevük legyen rendre /dev/ethernet ill. /dev/x25), és meg kell nyitni az internet protokoll multiplexer drivert is (ennek neve legyen a példában /dev/ip). Ezután az IP multiplexert össze kell kapcsolni ( I_LINK ioctl hívással) a fenti két másik driverrel. Ennek a C nyelvu kódja a következo :

  #include <stropts.h>     /* Konstansok miatt kell */
  #inlcude <fcntl.h>

  main()             /* STREAMS multiplexer config. */
  {
    int fdether,fdx25,fdip;
    int muxx25,muxether;

    /* Driverek megnyitasa : */
    if ((fdether=open("/dev/ethernet",O_RDWR)) == -1 )
      { perror("/dev/ethernet"); exit(1); }
    if ((fdx25=open("/dev/x25",O_RDWR)) == -1 )
      { perror("/dev/x25"); exit(1); }
    if ((fdip=open("/dev/ip",O_RDWR)) == -1 )
      { perror("/dev/ip"); exit(1); }
    /* Multiplexer kiepitese : */
    if (muxx25=ioctl(fdip,I_LINK,fdx25) < 0) 
      { perror("I_LINK ioctl sikertelen"); exit(2); }
    if (muxether=ioctl(fdip,I_LINK,fdether) < 0) 
      { perror("I_LINK ioctl sikertelen"); exit(2); }
    /* Ezutan az also driverek filedesc.-jai lezarhatok */
    close(fdether);
    close(fdx25);

    pause();  /* Mindig fusson, nehogy a rendszer
                 lezarja a fileokat */
    /* Ez nem kell most :
      if (ioctl(fdip,I_UNLINK,muxether) < 0) 
        { perror("I_UNLINK ioctl sikertelen"); exit(2); }
      if (ioctl(fdip,I_UNLINK,muxx25) < 0) 
        { perror("I_UNLINK ioctl sikertelen"); exit(2); }
    */
  }
Az összelinkelés után az alsó streamek filedeszkriptorjaikra vonatkozó (ez esetben az fdx25 és az fdether) bármilyen filemuvelet (a close kivételével) hibával fog befejezodni, vagyis a deszkriptorok használhatatlanok lesznek, ezért érdemes ezeket lezárni. Ennek az is a következménye, hogy ha STREAMS modulokat akarunk például az fdx25 filedeszkriptorhoz tartozó streamre rakni, akkor azt még az összelinkelés elott kell elintézni. Ha ezután az IP drivert egy másik programból megnyitjuk és adatcsomagokat írunk a rá vonatkozó filedeszkriptorra, akkor az IP driver ezeket az adatokat szétosztja a két alsó driverre. Természetesen az IP drivert úgy kell megírni, hogy felismerje az adatcsomagokból azok rendeltetési helyét.



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996