[P4] big endian, little endian

Tejfel Máté matej at caesar.elte.hu
Thu Mar 10 16:57:44 CET 2016


Sziasztok!

   A jó hír, hogy HDaninál már kb megy a full-os L3 példa, viszont ennek 
kapcsán elkezdtünk beszélgetni és gondolkodni a big-little endian-os 
váltásokon. Most ezt nagyon kevés helyen csináljuk, ott sem, ahol 
kellene. Át kellene gondolni, hogy hova rakjunk. Alapvetően a táblákban 
történő eltároláson gondolkodunk, a csomag fieldjeit, nem akarjuk 
bántani, ott feltételezzük, hogy big endian-ban van (ugye ez a network 
order...
  Ha Danival jól gondoljuk a controller-től jövő minden üzenetnél 
feltételezhető, hogy big endian-ban vannak az adatok. (Ez igaz Sanyi? 
Vagy elvileg akár "rá lehetne venni" a controller-t, hogy little 
endian-ban küldjön?) Most ezeket mindig így tároljuk el a táblákba, akár 
kulcsról, akár értékről (pl. függvény paraméterről van szó).
   Ez a kulcs esetén lpm-nél nem jó (kipróbáltuk), úgyhogy ott Dani első 
körben átírja, hogy a táblába kerülés előtt megforgassuk a kapott 
adatot, illetve lekérdezéskor is megforgassuk, ami alapján keresünk 
(persze ez sem teljesen triviális, mondjuk, ha több field-ből áll elő az 
lpm...). Kérdés, hogy ezt hosszabb távon nem lehet-e hatékonyabban (pl. 
saját/más lpm keresés).
   Amire nem tudjuk az igazán jó választ, hogy mi legyen az értékekkel, 
azaz pl. az action függvény paraméterekkel. Pl. modify_field esetén, ha 
a csomag mezőit piszkáljuk (egyelőre ez tűnik a leggyakoribb esetnek), 
jó, hogy big endian-ban van, ha egy metadata-t piszkálunk, inkább little 
endian kellene, ha pl. add_to_field paraméterben jelenik meg, akkor 
megint csak inkább little endian lenne jó, ha pedig feltételezzük, hogy 
az action függvényen belül módosulhat a paraméter mielőtt egy primitív 
függvényben felhasználjuk, akkor ismét a little endian a jó...
Szóval megoldásként, ami eddig eszünkbe jutott:
  -- marad minden big endian és ahol kell (pl. fenti add_to_field, 
modify_field esetek) figyelünk erre (egyelőre ezt próbálja Dani 
megvalósítani)
      -- itt talán kevesebb forgatás kell (egyelőre azt feltételezzük, 
az a jellemzőbb eset, hogy a big endian-os alak a jó, ezt persze jó 
lenne végiggondolni), viszont
          ennél ha valaki egyéni módon próbál használni egy fv 
paramétert, fura dolgok sülhetnek ki...

-- csinálunk valami egyszerűbb statikus elemzést fordításkor, hogy az 
adatot hol fogjuk használni és ez alapján eldöntjük, milyen módban tároljuk
     -- itt még kevesebb forgatás kell, (esetleg eladható 
optimalizálásnak :) ), viszont inkonzisztens lesz a tárolás és utólag 
nem biztos, hogy egyszerű lesz kitalálni,
         hogyan is tároltuk az adatot, emiatt fontos kérdés, hogy 
elképzelhető-e olyan (értelmes) eset, hogy nem eldönthető, miben lenne 
jó tárolni (több eltérő dologra is
         használunk egy paramétert egy függvényben)...

-- minden adatot (a kulcsokat azért nem) még táblába írás előtt átrakunk 
little endian-ba és ahol kell (pl. sima modify_field) konvertálunk
     - valószínű itt kell a legtöbb forgatás (ez lenne a leglassabb), 
viszont elméleti oldalról ez tűnik a leghelyesebbnek és persze ez lenne a
       legbiztonságosabb (minden fv. paraméter egyértelműen little 
endian, mindentől függetlenül, azaz bármire használják a függvényen 
belül, nem lesz váratlan az
       eredmény)

  Egyéb ötlet? :) Illetve, ha valamit nem gondoltunk át (jól) a 
fentieknél, szóljatok és kérlek, ti is gondolkodjatok rajta, mi lenne a 
legjobb verzió...

    Köszi!

         M.






More information about the P4 mailing list