J'ai suivi ce tuto, ça fonctionne bien. Par contre, la méthode de passer par défaut en piro VLAN 6 puis de router via iptables ne me suffit pas, car j'aimerais activer le flow offload (disponible depuis OpenWRT 19.07 pour l'Archer C7 v5 que j'utilise). Sinon le proc est noyé par les IRQ, et les débits sont bridés ce qui est dommage (même si on arrive quand même à plus de 300 mbps ce qui est déjà pas si mal). Avec l'offload et avec ma vieille offre de base je suis manifestement en 400/400.
J'ai donc patché (à la rache) les clients DHCP d'OpenWRT (oui en v4 ils utilisent busybox, et en v6 odhcp6c qui sont donc disctincts). J'ai donc bien les paquets DHCP avec la prio VLAN, et uniquement eux, ce qui permet de laisser les flux passer sans jouer avec iptables, et donc d'activer l'offload.
Il faut tout de même évidemment mapper une des prio kernel en prio VLAN. J'ai pris la 6. Seulement a priori le système de ifup d'OpenWRT ne permet pas de hook en pre-up et donc de placer le mapping avant l'envoi des paquets DHCP de façon certaine (si l'interface VLAN est coupée, il faut recommencer etc.). J'ai donc fait faire ça à busybox dans la foulée (et, oui, c'est doublement crade du coup).
Bien sûr le reste du tuto reste vrai, ceci ne remplace QUE la partie iptables et script vlanprio dans le cas où on est dans une zone qui nécessite le tag VLAN PRIO. Et bien sûr cela est à refaire à chaque mise à jour (compiler en amont pour éviter les surprises et télécharger le SDK, copier les exécutables après…) ce qui peut paraitre un peu lourd !
Patch dégueu pour busybox (prio sur la socket et egress mapping) :
--- busybox-1.30.1.orig/networking/udhcp/packet.c
+++ busybox-1.30.1/networking/udhcp/packet.c
@@ -115,6 +115,20 @@ int FAST_FUNC udhcp_send_raw_packet(stru
const char *msg;
fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
+#include <linux/sockios.h>
+#include <linux/if_vlan.h>
+#include <net/if.h>
+const int VLAN_DHCP_PRIORITY = 6;
+char *buf[IF_NAMESIZE];
+setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &VLAN_DHCP_PRIORITY, sizeof(VLAN_DHCP_PRIORITY));
+struct vlan_ioctl_args vlan_args;
+vlan_args.cmd=SET_VLAN_EGRESS_PRIORITY_CMD;
+vlan_args.u.skb_priority=6;
+vlan_args.vlan_qos=6;
+if_indextoname(ifindex, buf);
+strcpy(vlan_args.device1,buf);
+
+ioctl (fd,SIOCSIFVLAN, &vlan_args);
if (fd < 0) {
msg = "socket(%s)";
goto ret_msg;
Patch pour odhcp6c (prio sur la socket uniquement car egress déjà fait par busybox en v4) :
--- build_dir/target-mips_24kc_musl/odhcp6c-2019-01-11-e199804b/src/dhcpv6.c.orig 2020-03-30 10:26:51.191836514 +0200
+++ build_dir/target-mips_24kc_musl/odhcp6c-2019-01-11-e199804b/src/dhcpv6.c 2020-03-30 10:27:51.531659035 +0200
@@ -140,6 +140,9 @@
ifindex = ifr.ifr_ifindex;
+const int VLAN_DHCP_PRIORITY = 6;
+setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &VLAN_DHCP_PRIORITY, sizeof(VLAN_DHCP_PRIORITY));
+
// Create client DUID
size_t client_id_len;
odhcp6c_get_state(STATE_CLIENT_ID, &client_id_len);
Il suffit alors simplement de copier les nouveau exécutables à la place de ceux de base (ils se retrouveront donc sur l'overlay).
Procédure pour moi à partir du SDK de 19.07.2 et pour l'Archer C7 (999-vlan-prio.patch contenant le patch pour busybox et 192.168.1.42 l'IP du routeur pendant les tests) :
./scripts/feeds update -a
./scripts/feeds install busybox
cp 999-vlan-prio.patch ./feeds/base/package/utils/busybox/patches/
make package/busybox/compile
scp build_dir/target-mips_24kc_musl/busybox-1.30.1/.pkgdir/busybox/bin/busybox root@192.168.1.42:/bin
./scripts/feeds install odhcp6c
make package/odhcp6c/prepare
nano build_dir/target-mips_24kc_musl/odhcp6c-2019-01-11-e199804b/src/dhcpv6.c (et appliquer le patch à la main, ou directement via patch -p1)
make package/odhcp6c/compile
scp ./build_dir/target-mips_24kc_musl/odhcp6c-2019-01-11-e199804b/.pkgdir/odhcp6c/usr/sbin/odhcp6c root@192.168.1.42:/usr/sbin/
Debug :
busybox udhcpc -i eth0.832
cat /proc/eth0.832
À voir si ça peut en aider certains ou si je peux améliorer la présentation, c'est sûr que c'est très technique et que je ne réexplique pas tous les concepts sinon on s'en sortirait pas
Je ne pense pas soumettre ces patchs aux projets concernés car c'est quand même très très spécifique… et qu'ils contiennet la partie de configuration egress du VLAN ce qui n'est pas pertinent à cet endroit dans le cas général.