setsockopt() API-n nagyjából 33 éve beállítható egy socket prioritása SO_PRIORITY opcióval. Ilyenkor minden kiküldött csomagra beállításra kerül egy prioritás metaadat, IP csomagoknál a ToS headerbe is bekerül. Ez viszont az adott socket minden a küldött csomagjára érvényes.
Az újdonság a SO_PRIORITY és SO_RCVPRIORITY CMSG típus (néhol a CMSG-t ancillary message-nek vagy aux message-nek is hívják, a lényeg ugyanaz): csomagontként lehet megadni a proritási metaadatot. Ez akkor hasznos, ha van egy tunnelhez használt socket, amibe több stream van multiplexelve és ütemezésnél (pl. mqprio, taprio Qdisc-ek) fontos melyiknek mi a prioritása. Pl. vagyünk egy proxy-t, ami több bejövő kacsolatot multiplexál egy socketba, ahol a kapcsolatok más-más prioritással bírnak de amint egy socketen kereszül küldöd ki az összes beérkező csomagot, bukod a priorizálást (mert az csak a socket teljes egészére állítható, nem per-csomag).
Eddig erre workaround lehetett
1. több socket nyitása más-más prioritással,
2. eBPF-el átírni a prioritásokat per-packet megadható SO_MARK priortás alapján
3. esetleg csomagonként setsockoptolni más-más prioritást a teljes socketra (ez utóbbi szerintem elég gázos).
Egyik sem tökéletes, de azt gondolom akinek ilyesmi kellett ezekkel meg tudta/tudja oldani. Ettől függetlenül jó ha van direkt erre a célra kitalált API.
Én ipari témavezetője vagyok a kódhoz kapcsolódó szakdolgozatnak és az elején adtam pár általános tanácsot teszteléssel és lkml-el kapcsolatban (a levlistás fejlesztés nem triviális főleg nem elsőre :D). Maga a kód és az integrációs tesztek teljes egészében a szakdolgozó munkái.