Commit 42e8e6d9 authored by David S. Miller's avatar David S. Miller
Browse files


Steffen Klassert says:

====================
1) Refactor selftests to use an array of structs in xfrm_fill_key().
   From Gautam Menghani.

2) Drop an unused argument from xfrm_policy_match.
   From Hongbin Wang.

3) Support collect metadata mode for xfrm interfaces.
   From Eyal Birger.

4) Add netlink extack support to xfrm.
   From Sabrina Dubroca.

Please note, there is a merge conflict in:

include/net/dst_metadata.h

between commit:

0a28bfd4 ("net/macsec: Add MACsec skb_metadata_dst Tx Data path support")

from the net-next tree and commit:

5182a5d4 ("net: allow storing xfrm interface metadata in metadata_dst")

from the ipsec-next tree.

Can be solved as done in linux-next.

Please pull or let me know if there are problems.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9d435073 c39596f6
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ enum metadata_type {
	METADATA_IP_TUNNEL,
	METADATA_HW_PORT_MUX,
	METADATA_MACSEC,
	METADATA_XFRM,
};

struct hw_port_info {
@@ -22,6 +23,11 @@ struct macsec_info {
	sci_t sci;
};

struct xfrm_md_info {
	u32 if_id;
	int link;
};

struct metadata_dst {
	struct dst_entry		dst;
	enum metadata_type		type;
@@ -29,6 +35,7 @@ struct metadata_dst {
		struct ip_tunnel_info	tun_info;
		struct hw_port_info	port_info;
		struct macsec_info	macsec_info;
		struct xfrm_md_info	xfrm_info;
	} u;
};

@@ -60,6 +67,27 @@ skb_tunnel_info(const struct sk_buff *skb)
	return NULL;
}

static inline struct xfrm_md_info *lwt_xfrm_info(struct lwtunnel_state *lwt)
{
	return (struct xfrm_md_info *)lwt->data;
}

static inline struct xfrm_md_info *skb_xfrm_md_info(const struct sk_buff *skb)
{
	struct metadata_dst *md_dst = skb_metadata_dst(skb);
	struct dst_entry *dst;

	if (md_dst && md_dst->type == METADATA_XFRM)
		return &md_dst->u.xfrm_info;

	dst = skb_dst(skb);
	if (dst && dst->lwtstate &&
	    dst->lwtstate->type == LWTUNNEL_ENCAP_XFRM)
		return lwt_xfrm_info(dst->lwtstate);

	return NULL;
}

static inline bool skb_valid_dst(const struct sk_buff *skb)
{
	struct dst_entry *dst = skb_dst(skb);
@@ -92,6 +120,9 @@ static inline int skb_metadata_dst_cmp(const struct sk_buff *skb_a,
	case METADATA_MACSEC:
		return memcmp(&a->u.macsec_info, &b->u.macsec_info,
			      sizeof(a->u.macsec_info));
	case METADATA_XFRM:
		return memcmp(&a->u.xfrm_info, &b->u.xfrm_info,
			      sizeof(a->u.xfrm_info));
	default:
		return 1;
	}
+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ struct xfrm_state;
int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb);
int ipcomp_output(struct xfrm_state *x, struct sk_buff *skb);
void ipcomp_destroy(struct xfrm_state *x);
int ipcomp_init_state(struct xfrm_state *x);
int ipcomp_init_state(struct xfrm_state *x, struct netlink_ext_ack *extack);

static inline struct ip_comp_hdr *ip_comp_hdr(const struct sk_buff *skb)
{
+17 −7
Original line number Diff line number Diff line
@@ -312,9 +312,15 @@ struct km_event {
	struct net *net;
};

struct xfrm_if_decode_session_result {
	struct net *net;
	u32 if_id;
};

struct xfrm_if_cb {
	struct xfrm_if	*(*decode_session)(struct sk_buff *skb,
					   unsigned short family);
	bool (*decode_session)(struct sk_buff *skb,
			       unsigned short family,
			       struct xfrm_if_decode_session_result *res);
};

void xfrm_if_register_cb(const struct xfrm_if_cb *ifcb);
@@ -399,7 +405,8 @@ struct xfrm_type {
#define XFRM_TYPE_LOCAL_COADDR	4
#define XFRM_TYPE_REMOTE_COADDR	8

	int			(*init_state)(struct xfrm_state *x);
	int			(*init_state)(struct xfrm_state *x,
					      struct netlink_ext_ack *extack);
	void			(*destructor)(struct xfrm_state *);
	int			(*input)(struct xfrm_state *, struct sk_buff *skb);
	int			(*output)(struct xfrm_state *, struct sk_buff *pskb);
@@ -985,6 +992,7 @@ void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev);
struct xfrm_if_parms {
	int link;		/* ifindex of underlying L2 interface */
	u32 if_id;		/* interface identifyer */
	bool collect_md;
};

struct xfrm_if {
@@ -1573,9 +1581,10 @@ int xfrm_dev_state_flush(struct net *net, struct net_device *dev, bool task_vali
void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si);
void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
int xfrm_init_replay(struct xfrm_state *x);
int xfrm_init_replay(struct xfrm_state *x, struct netlink_ext_ack *extack);
u32 xfrm_state_mtu(struct xfrm_state *x, int mtu);
int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload);
int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload,
		      struct netlink_ext_ack *extack);
int xfrm_init_state(struct xfrm_state *x);
int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type);
int xfrm_input_resume(struct sk_buff *skb, int nexthdr);
@@ -1879,7 +1888,8 @@ void xfrm_dev_resume(struct sk_buff *skb);
void xfrm_dev_backlog(struct softnet_data *sd);
struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t features, bool *again);
int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
		       struct xfrm_user_offload *xuo);
		       struct xfrm_user_offload *xuo,
		       struct netlink_ext_ack *extack);
bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x);

static inline void xfrm_dev_state_advance_esn(struct xfrm_state *x)
@@ -1942,7 +1952,7 @@ static inline struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_fea
	return skb;
}

static inline int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, struct xfrm_user_offload *xuo)
static inline int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, struct xfrm_user_offload *xuo, struct netlink_ext_ack *extack)
{
	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -695,6 +695,7 @@ enum {
	IFLA_XFRM_UNSPEC,
	IFLA_XFRM_LINK,
	IFLA_XFRM_IF_ID,
	IFLA_XFRM_COLLECT_METADATA,
	__IFLA_XFRM_MAX
};

+10 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ enum lwtunnel_encap_types {
	LWTUNNEL_ENCAP_SEG6_LOCAL,
	LWTUNNEL_ENCAP_RPL,
	LWTUNNEL_ENCAP_IOAM6,
	LWTUNNEL_ENCAP_XFRM,
	__LWTUNNEL_ENCAP_MAX,
};

@@ -111,4 +112,13 @@ enum {

#define LWT_BPF_MAX_HEADROOM 256

enum {
	LWT_XFRM_UNSPEC,
	LWT_XFRM_IF_ID,
	LWT_XFRM_LINK,
	__LWT_XFRM_MAX,
};

#define LWT_XFRM_MAX (__LWT_XFRM_MAX - 1)

#endif /* _UAPI_LWTUNNEL_H_ */
Loading