Skip to contentSkip to conversation

: Introduce XFRM_MSG_REPORT.

PATCH In review Masahide NAKAMURA 1 participant 1 message Jul 29, 2006

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

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
index 597a7c7..84a3e76 100644
@@ -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
index 0b8edad..05d4257 100644
@@ -383,6 +383,9 @@ struct xfrm_mgr
 	struct 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
index 1bdeecf..0c74e7c 100644
@@ -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