Message ID | 20220826114700.2272645-2-eyal.birger@gmail.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | xfrm: support collect metadata mode for xfrm interfaces | expand |
Le 26/08/2022 à 13:46, Eyal Birger a écrit : > XFRM interfaces provide the association of various XFRM transformations > to a netdevice using an 'if_id' identifier common to both the XFRM data > structures (polcies, states) and the interface. The if_id is configured by > the controlling entity (usually the IKE daemon) and can be used by the > administrator to define logical relations between different connections. > > For example, different connections can share the if_id identifier so > that they pass through the same interface, . However, currently it is > not possible for connections using a different if_id to use the same > interface while retaining the logical separation between them, without > using additional criteria such as skb marks or different traffic > selectors. > > When having a large number of connections, it is useful to have a the > logical separation offered by the if_id identifier but use a single > network interface. Similar to the way collect_md mode is used in IP > tunnels. > > This patch attempts to enable different configuration mechanisms - such > as ebpf programs, LWT encapsulations, and TC - to attach metadata > to skbs which would carry the if_id. This way a single xfrm interface in > collect_md mode can demux traffic based on this configuration on tx and > provide this metadata on rx. > > The XFRM metadata is somewhat similar to ip tunnel metadata in that it > has an "id", and shares similar configuration entities (bpf, tc, ...), > however, it does not necessarily represent an IP tunnel or use other > ip tunnel information, and also has an optional "link" property which > can be used for affecting underlying routing decisions. > > Additional xfrm related criteria may also be added in the future. > > Therefore, a new metadata type is introduced, to be used in subsequent > patches in the xfrm interface and configuration entities. > > Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org> > Signed-off-by: Eyal Birger <eyal.birger@gmail.com> Reviewed-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h index adab27ba1ecb..e4b059908cc7 100644 --- a/include/net/dst_metadata.h +++ b/include/net/dst_metadata.h @@ -9,6 +9,7 @@ enum metadata_type { METADATA_IP_TUNNEL, METADATA_HW_PORT_MUX, + METADATA_XFRM, }; struct hw_port_info { @@ -16,12 +17,18 @@ struct hw_port_info { u32 port_id; }; +struct xfrm_md_info { + u32 if_id; + int link; +}; + struct metadata_dst { struct dst_entry dst; enum metadata_type type; union { struct ip_tunnel_info tun_info; struct hw_port_info port_info; + struct xfrm_md_info xfrm_info; } u; }; @@ -53,6 +60,16 @@ skb_tunnel_info(const struct sk_buff *skb) return NULL; } +static inline struct xfrm_md_info *skb_xfrm_md_info(const struct sk_buff *skb) +{ + struct metadata_dst *md_dst = skb_metadata_dst(skb); + + if (md_dst && md_dst->type == METADATA_XFRM) + return &md_dst->u.xfrm_info; + + return NULL; +} + static inline bool skb_valid_dst(const struct sk_buff *skb) { struct dst_entry *dst = skb_dst(skb); @@ -82,6 +99,9 @@ static inline int skb_metadata_dst_cmp(const struct sk_buff *skb_a, return memcmp(&a->u.tun_info, &b->u.tun_info, sizeof(a->u.tun_info) + a->u.tun_info.options_len); + case METADATA_XFRM: + return memcmp(&a->u.xfrm_info, &b->u.xfrm_info, + sizeof(a->u.xfrm_info)); default: return 1; }