Merge pull request #1177 from kernelkit/multi-dsa-tree-fixes

Multi DSA tree fixes
This commit is contained in:
Tobias Waldekranz
2025-10-02 16:09:19 +02:00
committed by GitHub
3 changed files with 51 additions and 18 deletions
@@ -1,12 +1,49 @@
#!/bin/sh
#!/bin/bash
IFQUIRKSFILE=${IFQUIRKSFILE:-/etc/product/interface-quirks.json}
if [ $# -lt 2 ]; then
echo "usage: $0 <quirk-name> <ifname>"
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"
@@ -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
+2 -12
View File
@@ -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)