diff --git a/board/common/rootfs/usr/libexec/infix/has-quirk b/board/common/rootfs/usr/libexec/infix/has-quirk index 4f9a9bbc8..7dc24d91d 100755 --- a/board/common/rootfs/usr/libexec/infix/has-quirk +++ b/board/common/rootfs/usr/libexec/infix/has-quirk @@ -1,12 +1,49 @@ -#!/bin/sh +#!/bin/bash + +IFQUIRKSFILE=${IFQUIRKSFILE:-/etc/product/interface-quirks.json} + if [ $# -lt 2 ]; then echo "usage: $0 " exit 1 fi + quirk=$1 ifname=$2 -if [ -f "/etc/product/interface-quirks.json" ]; then - echo "$(jq -r --arg iface "$ifname" --arg quirk "$quirk" '.[$iface][$quirk] // "false"' /etc/product/interface-quirks.json)" -else - echo "false" -fi + +[ -f "$IFQUIRKSFILE" ] || { echo false && exit; } + +match() +{ + jq -e \ + --arg quirk "$quirk" --arg pattern "$1" \ + '.[$pattern][$quirk]' "$IFQUIRKSFILE" >/dev/null || return + + echo true + exit 0 +} + +ethtoolmatch() +{ + local pattern="${1#@ethtool:}" + + grep -qFxvf \ + <(ethtool -i "$ifname") \ + <(echo -n "$pattern" | awk -v FS="=" -v RS=";" '{ printf("%s: %s\n", $1, $2); }') \ + && return + + match "@ethtool:$pattern" +} + + +for pattern in $(jq -r 'keys[]' "$IFQUIRKSFILE"); do + case "$pattern" in + @ethtool:*) + ethtoolmatch "$pattern" + ;; + "$ifname") + match "$ifname" + ;; + esac +done + +echo "false" diff --git a/board/common/rootfs/usr/libexec/infix/init.d/20-nameif b/board/common/rootfs/usr/libexec/infix/init.d/20-nameif index 330392599..0356ce103 100755 --- a/board/common/rootfs/usr/libexec/infix/init.d/20-nameif +++ b/board/common/rootfs/usr/libexec/infix/init.d/20-nameif @@ -34,6 +34,12 @@ ports=$(devlink -j port | jq -r '.port[] | select(.flavour == "physical") | .netdev') for iface in $ports; do + # On systems with multiple switch trees, a port may be _both_ + # a physical port, registered with devlink, _and_ a DSA + # port. In those cases, hold on to our initial "internal" + # classification. + [ $(ip -j link show dev "$iface" | jq -r '.[0].group') = internal ] && continue + ip link set "$iface" group port done diff --git a/src/confd/src/ietf-interfaces.c b/src/confd/src/ietf-interfaces.c index 28045ff05..db017cc39 100644 --- a/src/confd/src/ietf-interfaces.c +++ b/src/confd/src/ietf-interfaces.c @@ -17,18 +17,8 @@ bool iface_has_quirk(const char *ifname, const char *quirkname) { - struct json_t *iface, *quirk; - - if (!confd.ifquirks) - return false; - - iface = json_object_get(confd.ifquirks, ifname); - if (!iface) - return false; - - quirk = json_object_get(iface, quirkname); - - return quirk ? json_is_true(quirk) : false; + return systemf("[ $(/usr/libexec/infix/has-quirk %s %s) = true ]", + quirkname, ifname) == 0; } static bool iface_is_phys(const char *ifname)