: Add sorting interface for state and template.
Subsystems (3)
PATCH 21/23 : Add sorting interface for state and template.
Under two transformation policies it is required to merge them. This is a platform to sort state for outbound and templates for inbound respectively.
Mobile IPv6 will use it.
--- include/net/xfrm.h | 22 ++++++++++++++++++++++ net/xfrm/xfrm_policy.c | 16 ++++++++++++++-- net/xfrm/xfrm_state.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-)
include/net/xfrm.h +22 -0
@@ -258,6 +258,10 @@ #endifstruct xfrm_state *(*find_acq)(u8 mode,u32 reqid,u8 proto,xfrm_address_t *daddr,xfrm_address_t *saddr,int create); +#ifdef CONFIG_XFRM_SUB_POLICY +int (*tmpl_sort)(struct xfrm_tmpl **dst,struct xfrm_tmpl **src,int n); +int (*state_sort)(struct xfrm_state **dst,struct xfrm_state **src,int n); +#endif };extern int xfrm_state_register_afinfo (struct xfrm_state_afinfo *afinfo);
@@ -996,6 +1000,24 @@ static inline struct xfrm_state *xfrm_streturn NULL ; }#endif +#ifdef CONFIG_XFRM_SUB_POLICY +extern int xfrm_tmpl_sort (struct xfrm_tmpl **dst,struct xfrm_tmpl **src, +int n,unsigned short family); +extern int xfrm_state_sort (struct xfrm_state **dst,struct xfrm_state **src, +int n,unsigned short family); +#else +static inline int xfrm_tmpl_sort (struct xfrm_tmpl **dst,struct xfrm_tmpl **src, +int n,unsigned short family) +{ +return 0 ; +} + +static inline int xfrm_state_sort (struct xfrm_state **dst,struct xfrm_state **src, +int n,unsigned short family) +{ +return 0 ; +} +#endif extern struct xfrm_state *xfrm_find_acq_byseq (u32 seq);extern int xfrm_state_delete (struct xfrm_state *x);extern void xfrm_state_flush (u8 proto);
net/xfrm/xfrm_policy.c +14 -2
@@ -787,6 +787,8 @@ xfrm_tmpl_resolve(struct xfrm_policy **p struct xfrm_state **xfrm, unsigned short family) { +struct xfrm_state *tp[XFRM_MAX_DEPTH ]; +struct xfrm_state **tpp = (npols >1 ) ? tp : xfrm;int cnx =0 ;int error;int ret;
@@ -797,7 +799,8 @@ xfrm_tmpl_resolve(struct xfrm_policy **p error = -ENOBUFS ; goto fail; } - ret =xfrm_tmpl_resolve_one (pols[i], fl, &xfrm[cnx], family); + + ret =xfrm_tmpl_resolve_one (pols[i], fl, &tpp[cnx], family);if (ret <0 ) { error = ret; goto fail;
@@ -805,11 +808,15 @@ xfrm_tmpl_resolve(struct xfrm_policy **p cnx += ret; } +/* found states are sorted for outbound processing */ +if (npols >1 ) +xfrm_state_sort (xfrm, tpp, cnx, family); +return cnx; fail:for (cnx--; cnx>=0 ; cnx--) -xfrm_state_put (xfrm[cnx]); +xfrm_state_put (tpp[cnx]);return error; }
@@ -1219,6 +1226,7 @@ #endifstruct sec_path *sp;static struct sec_path dummy;struct xfrm_tmpl *tp[XFRM_MAX_DEPTH ]; +struct xfrm_tmpl *stp[XFRM_MAX_DEPTH ];struct xfrm_tmpl **tpp = tp;int ti =0 ;int i, k;
@@ -1236,6 +1244,10 @@ #endif tpp[ti++] = &pols[pi]->xfrm_vec[i]; } xfrm_nr = ti; +if (npols >1 ) { +xfrm_tmpl_sort (stp, tpp, xfrm_nr, family); + tpp = stp; + }/* For each tunnel xfrm, find the first matching tmpl. * For each tmpl before that, find corresponding xfrm.
net/xfrm/xfrm_state.c +38 -0
@@ -750,6 +750,44 @@ xfrm_find_acq(u8 mode, u32 reqid, u8 pro }EXPORT_SYMBOL (xfrm_find_acq); +#ifdef CONFIG_XFRM_SUB_POLICY +int +xfrm_tmpl_sort (struct xfrm_tmpl **dst,struct xfrm_tmpl **src,int n, +unsigned short family) +{ +int err =0 ; +struct xfrm_state_afinfo *afinfo =xfrm_state_get_afinfo (family); +if (!afinfo) +return -EAFNOSUPPORT ; + +spin_lock_bh (&xfrm_state_lock); +if (afinfo->tmpl_sort) + err = afinfo->tmpl_sort (dst, src, n); +spin_unlock_bh (&xfrm_state_lock); +xfrm_state_put_afinfo (afinfo); +return err; +} +EXPORT_SYMBOL (xfrm_tmpl_sort); + +int +xfrm_state_sort (struct xfrm_state **dst,struct xfrm_state **src,int n, +unsigned short family) +{ +int err =0 ; +struct xfrm_state_afinfo *afinfo =xfrm_state_get_afinfo (family); +if (!afinfo) +return -EAFNOSUPPORT ; + +spin_lock_bh (&xfrm_state_lock); +if (afinfo->state_sort) + err = afinfo->state_sort (dst, src, n); +spin_unlock_bh (&xfrm_state_lock); +xfrm_state_put_afinfo (afinfo); +return err; +} +EXPORT_SYMBOL (xfrm_state_sort); +#endif +/* Silly enough, but I'm lazy to build resolution list */ static struct xfrm_state *__xfrm_find_acq_byseq (u32 seq)
Signature · 1 line
1.4.1