--- zzzz-none-000/linux-4.9.276/net/switchdev/switchdev.c 2021-07-20 14:21:16.000000000 +0000 +++ falcon-5530-750/linux-4.9.276/net/switchdev/switchdev.c 2023-04-05 08:19:02.000000000 +0000 @@ -768,7 +768,8 @@ .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, }; u16 mode = BRIDGE_MODE_UNDEF; - u32 mask = BR_LEARNING | BR_LEARNING_SYNC | BR_FLOOD; + u32 mask = BR_LEARNING | BR_LEARNING_SYNC | BR_FLOOD | BR_HAIRPIN_MODE | + BR_ISOLATED; int err; if (!netif_is_bridge_port(dev)) @@ -808,18 +809,19 @@ } static const struct nla_policy -switchdev_port_bridge_policy[IFLA_BRPORT_MAX + 1] = { - [IFLA_BRPORT_STATE] = { .type = NLA_U8 }, - [IFLA_BRPORT_COST] = { .type = NLA_U32 }, - [IFLA_BRPORT_PRIORITY] = { .type = NLA_U16 }, - [IFLA_BRPORT_MODE] = { .type = NLA_U8 }, - [IFLA_BRPORT_GUARD] = { .type = NLA_U8 }, - [IFLA_BRPORT_PROTECT] = { .type = NLA_U8 }, - [IFLA_BRPORT_FAST_LEAVE] = { .type = NLA_U8 }, - [IFLA_BRPORT_LEARNING] = { .type = NLA_U8 }, - [IFLA_BRPORT_LEARNING_SYNC] = { .type = NLA_U8 }, - [IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 }, -}; + switchdev_port_bridge_policy[IFLA_BRPORT_MAX + 1] = { + [IFLA_BRPORT_STATE] = { .type = NLA_U8 }, + [IFLA_BRPORT_COST] = { .type = NLA_U32 }, + [IFLA_BRPORT_PRIORITY] = { .type = NLA_U16 }, + [IFLA_BRPORT_MODE] = { .type = NLA_U8 }, + [IFLA_BRPORT_GUARD] = { .type = NLA_U8 }, + [IFLA_BRPORT_PROTECT] = { .type = NLA_U8 }, + [IFLA_BRPORT_FAST_LEAVE] = { .type = NLA_U8 }, + [IFLA_BRPORT_LEARNING] = { .type = NLA_U8 }, + [IFLA_BRPORT_LEARNING_SYNC] = { .type = NLA_U8 }, + [IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 }, + [IFLA_BRPORT_ISOLATED] = { .type = NLA_U8 }, + }; static int switchdev_port_br_setlink_protinfo(struct net_device *dev, struct nlattr *protinfo) @@ -832,7 +834,6 @@ switchdev_port_bridge_policy); if (err) return err; - nla_for_each_nested(attr, protinfo, rem) { switch (nla_type(attr)) { case IFLA_BRPORT_LEARNING: @@ -846,6 +847,12 @@ case IFLA_BRPORT_UNICAST_FLOOD: err = switchdev_port_br_setflag(dev, attr, BR_FLOOD); break; + case IFLA_BRPORT_MODE: + err = switchdev_port_br_setflag(dev, attr, BR_HAIRPIN_MODE); + break; + case IFLA_BRPORT_ISOLATED: + err = switchdev_port_br_setflag(dev, attr, BR_ISOLATED); + break; default: err = -EOPNOTSUPP; break;