|
@@ -43,6 +43,8 @@
|
|
MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
|
|
MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
|
|
#define MODULE_ALIAS_XFRM_TYPE(family, proto) \
|
|
#define MODULE_ALIAS_XFRM_TYPE(family, proto) \
|
|
MODULE_ALIAS("xfrm-type-" __stringify(family) "-" __stringify(proto))
|
|
MODULE_ALIAS("xfrm-type-" __stringify(family) "-" __stringify(proto))
|
|
|
|
+#define MODULE_ALIAS_XFRM_OFFLOAD_TYPE(family, proto) \
|
|
|
|
+ MODULE_ALIAS("xfrm-offload-" __stringify(family) "-" __stringify(proto))
|
|
|
|
|
|
#ifdef CONFIG_XFRM_STATISTICS
|
|
#ifdef CONFIG_XFRM_STATISTICS
|
|
#define XFRM_INC_STATS(net, field) SNMP_INC_STATS((net)->mib.xfrm_statistics, field)
|
|
#define XFRM_INC_STATS(net, field) SNMP_INC_STATS((net)->mib.xfrm_statistics, field)
|
|
@@ -163,6 +165,7 @@ struct xfrm_state {
|
|
int header_len;
|
|
int header_len;
|
|
int trailer_len;
|
|
int trailer_len;
|
|
u32 extra_flags;
|
|
u32 extra_flags;
|
|
|
|
+ u32 output_mark;
|
|
} props;
|
|
} props;
|
|
|
|
|
|
struct xfrm_lifetime_cfg lft;
|
|
struct xfrm_lifetime_cfg lft;
|
|
@@ -296,10 +299,12 @@ struct xfrm_policy_afinfo {
|
|
struct dst_entry *(*dst_lookup)(struct net *net,
|
|
struct dst_entry *(*dst_lookup)(struct net *net,
|
|
int tos, int oif,
|
|
int tos, int oif,
|
|
const xfrm_address_t *saddr,
|
|
const xfrm_address_t *saddr,
|
|
- const xfrm_address_t *daddr);
|
|
|
|
|
|
+ const xfrm_address_t *daddr,
|
|
|
|
+ u32 mark);
|
|
int (*get_saddr)(struct net *net, int oif,
|
|
int (*get_saddr)(struct net *net, int oif,
|
|
xfrm_address_t *saddr,
|
|
xfrm_address_t *saddr,
|
|
- xfrm_address_t *daddr);
|
|
|
|
|
|
+ xfrm_address_t *daddr,
|
|
|
|
+ u32 mark);
|
|
void (*decode_session)(struct sk_buff *skb,
|
|
void (*decode_session)(struct sk_buff *skb,
|
|
struct flowi *fl,
|
|
struct flowi *fl,
|
|
int reverse);
|
|
int reverse);
|
|
@@ -1558,7 +1563,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
|
|
u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
|
|
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);
|
|
int xfrm_state_mtu(struct xfrm_state *x, int mtu);
|
|
int xfrm_state_mtu(struct xfrm_state *x, int mtu);
|
|
-int __xfrm_init_state(struct xfrm_state *x, bool init_replay);
|
|
|
|
|
|
+int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload);
|
|
int xfrm_init_state(struct xfrm_state *x);
|
|
int xfrm_init_state(struct xfrm_state *x);
|
|
int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb);
|
|
int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb);
|
|
int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type);
|
|
int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type);
|
|
@@ -1638,7 +1643,7 @@ static inline int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
|
|
struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
|
|
struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
|
|
const xfrm_address_t *saddr,
|
|
const xfrm_address_t *saddr,
|
|
const xfrm_address_t *daddr,
|
|
const xfrm_address_t *daddr,
|
|
- int family);
|
|
|
|
|
|
+ int family, u32 mark);
|
|
|
|
|
|
struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp);
|
|
struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp);
|
|
|
|
|
|
@@ -1856,6 +1861,20 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
|
|
struct xfrm_user_offload *xuo);
|
|
struct xfrm_user_offload *xuo);
|
|
bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x);
|
|
bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x);
|
|
|
|
|
|
|
|
+static inline bool xfrm_dst_offload_ok(struct dst_entry *dst)
|
|
|
|
+{
|
|
|
|
+ struct xfrm_state *x = dst->xfrm;
|
|
|
|
+
|
|
|
|
+ if (!x || !x->type_offload)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ if (x->xso.offload_handle && (x->xso.dev == dst->path->dev) &&
|
|
|
|
+ !dst->child->xfrm)
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline void xfrm_dev_state_delete(struct xfrm_state *x)
|
|
static inline void xfrm_dev_state_delete(struct xfrm_state *x)
|
|
{
|
|
{
|
|
struct xfrm_state_offload *xso = &x->xso;
|
|
struct xfrm_state_offload *xso = &x->xso;
|
|
@@ -1898,6 +1917,11 @@ static inline bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x
|
|
{
|
|
{
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static inline bool xfrm_dst_offload_ok(struct dst_entry *dst)
|
|
|
|
+{
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m)
|
|
static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m)
|