: Introduce XFRM_MSG_REPORT.
Subsystems (3)
PATCH 17/23 : Introduce XFRM_MSG_REPORT.
XFRM_MSG_REPORT is a message as notification of state protocol and selector from kernel to user-space.
Mobile IPv6 will use it when inbound reject is occurred at route optimization to make user-space know a binding error requirement.
Based on MIPL2 kernel patch.
--- include/linux/xfrm.h | 15 ++++++++++++++ include/net/xfrm.h | 11 ++++++++++ net/xfrm/xfrm_state.c | 21 ++++++++++++++++++++ net/xfrm/xfrm_user.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 0 deletions(-)
include/linux/xfrm.h +15 -0
@@ -160,6 +160,10 @@ #define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FL#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE XFRM_MSG_GETAE,#define XFRM_MSG_GETAE XFRM_MSG_GETAE + + XFRM_MSG_REPORT, +#define XFRM_MSG_REPORT XFRM_MSG_REPORT + __XFRM_MSG_MAX };#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
@@ -325,12 +329,21 @@ struct xfrm_usersa_flush {__u8 proto; }; +/* +* This notifies flow information to the user space with carrying XFRMA_ADDR. +*/ +struct xfrm_user_report { +__u8 proto; +struct xfrm_selector sel; +}; +#ifndef __KERNEL__/* backwards compatibility for userspace */ #define XFRMGRP_ACQUIRE 1#define XFRMGRP_EXPIRE 2#define XFRMGRP_SA 4#define XFRMGRP_POLICY 8 +#define XFRMGRP_REPORT 0x20#endif enum xfrm_nlgroups {
@@ -346,6 +359,8 @@ #define XFRMNLGRP_SA XFRMNLGRP_SA#define XFRMNLGRP_POLICY XFRMNLGRP_POLICY XFRMNLGRP_AEVENTS,#define XFRMNLGRP_AEVENTS XFRMNLGRP_AEVENTS + XFRMNLGRP_REPORT, +#define XFRMNLGRP_REPORT XFRMNLGRP_REPORT __XFRMNLGRP_MAX };#define XFRMNLGRP_MAX (__XFRMNLGRP_MAX - 1)
include/net/xfrm.h +11 -0
@@ -383,6 +383,9 @@ struct xfrm_mgrstruct xfrm_policy *(*compile_policy)(u16 family,int opt,u8 *data,int len,int *dir);int (*new_mapping)(struct xfrm_state *x,xfrm_address_t *ipaddr,u16 sport);int (*notify_policy)(struct xfrm_policy *x,int dir,struct km_event *c); +#ifdef CONFIG_XFRM_ADVANCED +int (*report)(__u8 proto,struct xfrm_selector *sel,void *arg); +#endif };extern int xfrm_register_km (struct xfrm_mgr *km);
@@ -1042,6 +1045,14 @@ extern wait_queue_head_t km_waitq;extern int km_new_mapping (struct xfrm_state *x,xfrm_address_t *ipaddr,u16 sport);extern void km_policy_expired (struct xfrm_policy *pol,int dir,int hard,u32 pid); +#ifdef CONFIG_XFRM_ADVANCED +extern int km_report (__u8 proto,struct xfrm_selector *sel,void *arg); +#else +static inline int km_report (__u8 proto,struct xfrm_selector *sel,void *arg) +{ +return -ENOSYS ; +} +#endif extern void xfrm_input_init (void );extern int xfrm_parse_spi (struct sk_buff *skb,u8 nexthdr,u32 *spi,u32 *seq);
net/xfrm/xfrm_state.c +21 -0
@@ -1077,6 +1077,27 @@ void km_policy_expired(struct xfrm_polic }EXPORT_SYMBOL (km_policy_expired); +#ifdef CONFIG_XFRM_ADVANCED +int km_report (__u8 proto,struct xfrm_selector *sel,void *arg) +{ +int err = -EINVAL ; +int ret; +struct xfrm_mgr *km; + +read_lock (&xfrm_km_lock); +list_for_each_entry (km, &xfrm_km_list, list) { +if (km->report) { + ret = km->report (proto, sel, arg); +if (!ret) + err = ret; + } + } +read_unlock (&xfrm_km_lock); +return err; +} +EXPORT_SYMBOL (km_report); +#endif +int xfrm_user_policy (struct sock *sk,int optname,u8 __user *optval,int optlen) {int err;
net/xfrm/xfrm_user.c +52 -0
70 lines not on this page · raw message
Signature · 1 line
1.4.1