IPv4 címkiosztó program Hardverközeli programozás 1 Beadandó feladat Fejlesztői dokumentáció Készítette: Kovács Aurél Email cím: kovacsaurel@gmail.com Weboldal: http://aurel192.net46.net/hardprog/ Neptun-kód: PZR28M Debreceni Egyetem - Informatikai Kar - Mérnök Informatikus (B.Sc.) szak
Tartalomjegyzék 1. IPv4 Címkiosztó program..3.oldal 1.1 Kompatibilitás 3.oldal 1.2 A program leírása... 3.oldal 2. Függvények bemutatása... 3.oldal 2. oldal
1. IPv4 Címkiosztó program 1.1 A program leírása A IPv4 Címkiosztó egy szimulációs program mely arra használható hogy egy címtartomány definiálása után, kisebb alhálózatokra bonthatjuk azt. A kérések alapján hálózat címeket oszt ki a program és minden hálózati adatot kiszámol. Az alhálózatokat törölhetjük, bináris keresőfát építhetünk a netmask prefixük alapján. 1.2 Kompatibilitás A program kezeléséhez használható az egér és a billentyűzet is. Billentyűzetről való menü vezérlés esetén a már megszokott ALT, kurzormozgató billentyűk, Enter, Esc használhatóak. A felhasználói felület Windows XP-n műkődik a leggyorsabban. A tesztelés során Linux Ubuntu-n Wine-al emulálva gyorsabban futott mint Windows 7 alatt. 2.1 Az Allocate1 nevű függvény leírása Függvény teljes neve: void allocate1(char *alias, int claimsize) A függvény a hardprog-128.c nevű állomány elején található Ez a függvény végzi a hálózat helyének kiszámítását és elhelyezését. A paraméterlistában a két legfontosabb dolgot adom csak meg a függvénynek, a hálózat nevét, és a kívánt méretét. A függvény azzal kezdődik hogy kiszámolom melyik az a szám ami kettőnek az a legkisebb hatványa amelyik éppen több, vagy egyenlő az igény méretével. Például 200-as igény esetén ahol 254 host fér el maximuma hálózaton, ott a 256 ez a szám, vagyis 2^8-on. A kiosztandó hálózat netmask prefixje pedig 32 mínusz az előzőleg kiszámolt szám. nm = 32-i; Következő lépésben a netmask prefix alapján kiszámolom hogy mik lesznek a netmask pontozott decimális oktetjei, és azt hogy minnyivel nőhetnek az oktetek az adott hálózatban. Például egy /24-es netmask prefixű hálózatnál az első két oktet bármennyivel nőhet a teljes tartományéhoz képest, a harmadik oktet az biztos hogy egyesével fog nőni, és a negyedik oktet pedig mindig nulla lesz. A legelső kérés érkezésekor biztos hogy a hálózatnak a címe a teljes tartomány elejével fog megegyezni, ezért ott csak annyit kell leellenőrizni, hogy belefér-e a teljes tartományba a hálózat, ha igen, akkor le lehet tárolni, ha nem akkor a függvény végére ér egyből és hibaüzenetet ír ki a program. A másik eset pedig az hogy nem a legelső kérés érkezett, ilyenkor már kicsit bonyolultabb, mert meg kell keresni azt a tartományt ahova befér egyben az igénynek megfelelő hálózat. 3. oldal
Kezdőértékként a trynet nevű struktúra értékekként kapja a teljes tartomány elejének a címét, és ebből egy előjel nélküli hosszú egész számot is kiszámolok, úgy hogy helyi értéket adok az okteteknek. A fejlesztés során ebben a részben könnyebbnek találtam a hosszú egészekkel való számolást, mert a négy oktet összehasonlítása sokkal bonyolultabb. A broadcast címet is tárolom hosszú egészként, ezt úgy számolom hogy az előzőleg kiszámított hálózat címhez hozzáadom azt a számot ahány host maximum elfér a hálózaton plusz kettőt. A stop és az afit nevű egész típusú segédváltozókat lenullázom Két egymásba ágyazott ciklussal leellenőrzöm hogy az a hálózatcím és broadcast cím amivel éppen próbálkozok az nincs-e benne valamelyik már meglévő hálózat tartományábán. Ha benne van, tehát nem helyezhető el oda akkor a ciklusok leállnak, és a stop változó értékét növelem. Ezután ha a stop értéke nem nulla akkor az azt jelenti hogy az adott helyen nem helyezhető el a hálózat, ezért növelni kell a trynet struktúra hosszú egészként tárolt hálózatcímét annyival mint amekkora a kívánt hálózat mérete, és visszaugrani a programban oda ahol a broadcast címet számítom az előbb említett hálózat cím alapján. Ha a stop értéke nulla akkor arra a helyre amivel próbálkoztam le lehet tárolni a hálózatot, de egy dolgot még le kell előtte ellenőrizni, azt hogy nem nyúlik-e túl a teljes tartomány értékein. Ha az utóbbi feltétel is sikeresen teljesül, akkor tárolhatóak le a hálózat adatai. A függvény végén pedig ha sikerült elhelyezni a hálózatot, akkor kiíratom az összes letárolt adatot, ha pedig nem helyezhető el a hálózat, akkor hibaüzenetet ír ki a program. 2.2 A newclaim nevű függvény bemutatása Függvény teljes neve: void newclaim() A függvény futásának két lehetséges módja lehet, az egyik eset ha a claimdelay nulla, a másik pedig ha a claimdelay egy. Ha a claimdelay nulla akkor a kéréseknek megfelelően nem osztom ki egyből a hálózatokat, hanem letárolom egy külön erre a célra fentartott tömbstruktúrában. Ha a claimdelay értéke egy akkor a kéréseket azonnal kiosztom, vagyis a az allocate1 nevű függvénynek átadom a kérés méretét és a hálózat nevét. 4. oldal
2.3 Az allocate nevű függvény bemutatása Függvény teljes neve: void allocate() Ez a függvény akkor indul el ha az Allocate menüpontra kattintok az Edit menüben. Paraméterlistája nincsen, mert globális változókkal dolgozik. Mindössze annyit csinál a függvény hogy méret szerint csökkenő sorrendbe állítja az összegyűlt kérési igényeket, majd a csökkenő sorba rendezett igényeket egyesével megpróbálja kiosztja az allocate1 függvény meghívásával. 2.4 A deletefirstclaim és deletelastclaim nevű függvények bemutatása Függvények teljes neve: int deletelastclaim(), int deletefirstclaim() A függvények a hardprog-128.c nevű állományban található. A láncolt listában használok minden egyes hálózathoz egy egész értéket is, ami azt tárolja hogy hanyadikként kiosztott hálózat az. Ezek a függvények úgy keresik meg azt az elemet amelyiket törölni kell, hogy elindul egy ciklus vagy nulláról felfelé, vagy pedig a hálózatok számáról lefelé nulláig, függően attól hogy honnan akarunk törölni. Ha a ciklus futása közben talál olyan értékű elemet amit törölni szeretnék, akkor letörlöm, majd kilépek a ciklusból. 2.5 A deleteclaim nevű függvény bemutatása Függvény teljes neve: int deleteclaim() Hálózatot törölni kétféle képen lehet, a nevének a kezdőbetűje alapján, vagy a hálózat címének és netmaskjának a megadásával. Ha a beolvasott string mérete kisebb mint öt karakter akkor biztos hogy nem a hálózatcím alapján akarok törölni hanem a neve alapján. Ebben az esetben a DeleteByName függvényt használom, aminek paraméterként az előbb beolvasott stringet adom át, ami a hálózat nevét tartalmazza. Ha a beolvasott string mérete nagyobb mint négy karakter, akkor biztos hogy hálózati cím alapján szeretnék törölni. Ilyenkor a DeleteByValue függvényt használom. 5. oldal
2.6 A fragmentation nevű függvény bemutatása Függvény teljes neve: int fragmentation() A feladat specifikációi szerint nem volt szükség ilyen funkcióra, de a fejlesztés során így jobban átláttam a kiosztott hálózatokat, és megkönnyítette a tesztelést. A hálózat töredezettségét rajzolja ki vizuálisan. 76 karakter szélességben tudom kiíratni a teljes hálózati tartományt. 2.7 A fragmentation nevű függvény bemutatása Függvény teljes neve: int fragmentation() A feladat specifikációi szerint nem volt szükség ilyen funkcióra, de 2.8 A defnet nevű függvény bemutatása Függvény teljes neve: void network() A függvény a defnet.c nevű állományban található. A Felhasználói felület megírása után a network() függvény megírásába kezdtem bele, de ezen a függvényen még lehetne változtatni, mert itt mindent karaktertömbökben tároltam, szerencsére hamar rájöttem hogy ez nem célravezető, így a későbbiekben inkább bitoperátorokat alkalmaztam. A függvény globális változókat módosít, kiszámolja hogy mi lesz a hálózat kezdőcíme, és a legutolsó kiosztható címe. Majd ki is írja a teljes tartományra vonatkozó adatokat. 2.9 A iptoulongint nevű függvény bemutatása Függvény teljes neve: unsigned long int iptoulongint(int o1,int o2,int o3,int o4) A függvény a defnet.c nevű állományban található. Ezt a függvényt arra használom hogy az ip címek négy oktetje alapján egy előjel nélküli hosszú egész számot számoljak ki. A működése egyszerűen annyi hogy helyi értékeket társítok az egyes oktetekhez, az első oktet 256 a harmadikon, a második oktet 256 a másodikon, a harmadok oktet 256, az utolsó pedig egy. 6. oldal
2.10 A ulonginttoip nevű függvény bemutatása Függvény teljes neve: int ulonginttoip(unsigned long int ulongintip) A függvény a defnet.c nevű állományban található. Ez az előző függvény párja, csak visszafelé konvertálja az adatokat. A paraméterlistájában megkap egy előjel nélküli hosszú egész számot, és ez alapján négy darab globális segédváltozót módosít, amikbe beleírja a négy oktetet. 2.11 Az Insert nevű függvény bemutatása Függvény teljes neve: void Insert(int pos, char *alias, int snaokt1, int snaokt2, int snaokt3, int snaokt4, int data, int cntr, Node **start) Ez a függvény a láncolt listába való új elem beszúrását oldja meg. A függvény megállapítja hogy hova kell letárolni az új elemet, megkeresi a végleges helyét, és meghívja a Node *MakeNode függvényt, melynek paraméterül a letárolandó hálózat adatait adja át. 2.12 A Node *MakeNode nevű függvény bemutatása Függvény teljes neve: Node *MakeNode(int data, char *alias, int snaokt1, int snaokt2, int snaokt3, int snaokt4, int cntr) Az új elem számára memóriát foglal le a program, majd elhelyezi azt a láncolt listában. 2.13 A DeleteByName nevű függvény bemutatása Függvény teljes neve: int DeleteByName(char *alias, Node **start) A láncolt listából lehet a függvény segítségével törölni egy adott elemet a hálózat nevének kezdőbetűje alapján. A függvény visszatérési értéke 0 vagy 1 attól függően hogy megtalálta-e a törldenő elemet. 7. oldal
2.14 A DeleteByValue nevű függvény bemutatása Függvény teljes neve: void Traverse(Node *x) A láncolt listából lehet a függvény segítségével törölni egy adott elemet a hálózat sorszáma alapján. A függvény visszatérési értéke 0 vagy 1 attól függően hogy megtalálta-e a törldenő elemet. 2.15 A Traverse nevű függvény bemutatása Függvény teljes neve: void Traverse(Node *x) A láncolt lista elemeinek a bejárására szolgál. 2.16 A bbst nevű függvény bemutatása Függvény teljes neve: int bbst() A függvény a bstree.c nevű állományban található. A bináris keresőfa feltöltését oldja meg a függvény. 2.17 A printout nevű függvény bemutatása Függvény teljes neve: void printout(node * tree) A függvény a bstree.c nevű állományban található. A bináris keresőfa bejárását oldja meg a függvény. 2.18 A bstinsert nevű függvény bemutatása Függvény teljes neve: void bstinsert(node ** tree, node * item) A függvény a bstree.c nevű állományban található. A bináris keresőfába való bejillesztést oldja meg a függvény. 8. oldal