MIP6: Loadable module support for MIPv6.
Subsystems (4)
PATCH 2/2 MIP6: Loadable module support for MIPv6.
From: Masahide NAKAMURA <[email protected]>
This patch makes MIPv6 loadable module named "mip6".
Here is a modprobe.conf(5) example to load it automatically when user application uses XFRM state for MIPv6:
alias xfrm-type-10-43 mip6
alias xfrm-type-10-60 mip6
Some MIPv6 feature is not included by this modular, however, it should not be affected to other features like either IPsec or IPv6 with and without the patch.
We may discuss XFRM, MH (RAW socket) and ancillary data/sockopt separately for future work.
Loadable features:
* MH receiving check (to send ICMP error back)
* RO header parsing and building (i.e. RH2 and HAO in DSTOPTS)
* XFRM policy/state database handling for RO
These are NOT covered as loadable:
* Home Address flags and its rule on source address selection
* XFRM sub policy (depends on its own kernel option)
* XFRM functions to receive RO as IPv6 extension header
* MH sending/receiving through raw socket if user application opens it (since raw socket allows to do so)
* RH2 sending as ancillary data
* RH2 operation with setsockopt(2)
--- include/linux/ipv6.h | 2 +- include/net/addrconf.h | 2 +- include/net/mip6.h | 4 ---- include/net/rawv6.h | 9 +++++++++ net/ipv6/Kconfig | 2 +- net/ipv6/Makefile | 2 +- net/ipv6/addrconf.c | 4 ++-- net/ipv6/af_inet6.c | 10 +--------- net/ipv6/ah6.c | 8 ++++---- net/ipv6/datagram.c | 2 +- net/ipv6/exthdrs.c | 19 ++++++++++--------- net/ipv6/icmp.c | 2 +- net/ipv6/ip6_output.c | 2 +- net/ipv6/ipv6_sockglue.c | 2 +- net/ipv6/mip6.c | 22 +++++++++++++++++++--- net/ipv6/raw.c | 34 +++++++++++++++++++++++++++++++--- net/ipv6/xfrm6_policy.c | 4 ++-- net/ipv6/xfrm6_state.c | 4 ++-- 18 files changed, 88 insertions(+), 46 deletions(-)
include/linux/ipv6.h +1 -1
@@ -248,7 +248,7 @@ struct inet6_skb_parm {__u16 lastopt;__u32 nhoff;__u16 flags; -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )__u16 dsthao;#endif
include/net/addrconf.h +1 -1
@@ -61,7 +61,7 @@ extern int addrconf_set_dstaddr(void __user *arg);extern int ipv6_chk_addr (struct in6_addr *addr,struct net_device *dev,int strict); -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )extern int ipv6_chk_home_addr (struct in6_addr *addr);#endif extern struct inet6_ifaddr * ipv6_get_ifaddr(struct in6_addr *addr,
include/net/mip6.h +0 -4
@@ -54,8 +54,4 @@ struct ip6_mh {#define IP6_MH_TYPE_BERROR 7/* Binding Error */ #define IP6_MH_TYPE_MAX IP6_MH_TYPE_BERROR -extern int mip6_init (void ); -extern void mip6_fini (void ); -extern int mip6_mh_filter (struct sock *sk,struct sk_buff *skb); -#endif
include/net/rawv6.h +9 -0
@@ -3,6 +3,8 @@#ifdef __KERNEL__ +#include <net/protocol.h> +#define RAWV6_HTABLE_SIZE MAX_INET_PROTOSextern struct hlist_head raw_v6_htable[RAWV6_HTABLE_SIZE ];extern rwlock_t raw_v6_lock;
@@ -23,6 +25,13 @@ extern void rawv6_err(struct sock *sk, int type, int code, int offset, __be32 info); +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE ) +int rawv6_mh_filter_register (int (*filter)(struct sock *sock, +struct sk_buff *skb)); +int rawv6_mh_filter_unregister (int (*filter)(struct sock *sock, +struct sk_buff *skb)); +#endif +#endif #endif
net/ipv6/Kconfig +1 -1
@@ -109,7 +109,7 @@ config INET6_IPCOMP If unsure, say Y. config IPV6_MIP6 - bool "IPv6: Mobility (EXPERIMENTAL)" + tristate "IPv6: Mobility (EXPERIMENTAL)" depends on IPV6 && EXPERIMENTAL select XFRM ---help---
net/ipv6/Makefile +1 -1
@@ -14,7 +14,6 @@ ipv6-$(CONFIG_XFRM) += xfrm6_policy.o xfrm6_state.o xfrm6_input.o \ xfrm6_output.o ipv6-$(CONFIG_NETFILTER) += netfilter.o ipv6-$(CONFIG_IPV6_MULTIPLE_TABLES) += fib6_rules.o -ipv6-$(CONFIG_IPV6_MIP6) += mip6.o ipv6-$(CONFIG_PROC_FS) += proc.o ipv6-objs += $(ipv6-y)
@@ -28,6 +27,7 @@ obj-$(CONFIG_INET6_XFRM_MODE_TRANSPORT) += xfrm6_mode_transport.o obj-$(CONFIG_INET6_XFRM_MODE_TUNNEL) += xfrm6_mode_tunnel.o obj-$(CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION) += xfrm6_mode_ro.o obj-$(CONFIG_INET6_XFRM_MODE_BEET) += xfrm6_mode_beet.o +obj-$(CONFIG_IPV6_MIP6) += mip6.o obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_IPV6_SIT) += sit.o
net/ipv6/addrconf.c +2 -2
@@ -1034,7 +1034,7 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev, }/* Rule 4: Prefer home address */ -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )if (hiscore.rule <4 ) {if (ifa_result->flags &IFA_F_HOMEADDRESS ) hiscore.attrs |=IPV6_SADDR_SCORE_HOA ;
@@ -2832,7 +2832,7 @@ void if6_proc_exit(void) }#endif /* CONFIG_PROC_FS */ -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )/* Check if address is a home address configured on any interface. */ int ipv6_chk_home_addr (struct in6_addr *addr) {
net/ipv6/af_inet6.c +1 -9
@@ -58,9 +58,6 @@#ifdef CONFIG_IPV6_TUNNEL #include <net/ip6_tunnel.h> #endif -#ifdef CONFIG_IPV6_MIP6 -#include <net/mip6.h> -#endif #include <asm/uaccess.h> #include <asm/system.h>
@@ -853,9 +850,6 @@ static int __init inet6_init(void)ipv6_frag_init ();ipv6_nodata_init ();ipv6_destopt_init (); -#ifdef CONFIG_IPV6_MIP6 -mip6_init (); -#endif /* Init v6 transport protocols. */ udpv6_init ();
@@ -921,9 +915,7 @@ static void __exit inet6_exit(void)/* Cleanup code parts. */ ipv6_packet_cleanup (); -#ifdef CONFIG_IPV6_MIP6 -mip6_fini (); -#endif +addrconf_cleanup ();ip6_flowlabel_cleanup ();ip6_route_cleanup ();
net/ipv6/ah6.c +4 -4
@@ -74,7 +74,7 @@ bad:return 0 ; } -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )/** * ipv6_rearrange_destopt - rearrange IPv6 destination options header * @iph: IPv6 header
@@ -228,7 +228,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)u8 nexthdr;char tmp_base[8 ];struct { -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )struct in6_addr saddr;#endif struct in6_addr daddr;
@@ -255,7 +255,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) err = -ENOMEM ; goto error; } -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )memcpy (tmp_ext, &top_iph->saddr, extlen);#else memcpy (tmp_ext, &top_iph->daddr, extlen);
@@ -294,7 +294,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)memcpy (top_iph, tmp_base,sizeof (tmp_base));if (tmp_ext) { -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )memcpy (&top_iph->saddr, tmp_ext, extlen);#else memcpy (&top_iph->daddr, tmp_ext, extlen);
net/ipv6/datagram.c +1 -1
@@ -654,7 +654,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,switch (rthdr->type) {case IPV6_SRCRT_TYPE_0 : -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPV6_SRCRT_TYPE_2 :#endif break ;
net/ipv6/exthdrs.c +10 -9
@@ -42,7 +42,7 @@#include <net/ndisc.h> #include <net/ip6_route.h> #include <net/addrconf.h> -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )#include <net/xfrm.h> #endif
@@ -90,6 +90,7 @@ int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) bad:return -1 ; } +EXPORT_SYMBOL_GPL (ipv6_find_tlv);/* * Parsing tlv encoded headers.
@@ -196,7 +197,7 @@ bad:Destination options header. *****************************/ -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )static int ipv6_dest_hao (struct sk_buff **skbp,int optoff) {struct sk_buff *skb = *skbp;
@@ -270,7 +271,7 @@ static int ipv6_dest_hao(struct sk_buff **skbp, int optoff)#endif static struct tlvtype_proc tlvprocdestopt_lst[] = { -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) { .type = IPV6_TLV_HAO, .func = ipv6_dest_hao,
@@ -283,7 +284,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) {struct sk_buff *skb = *skbp;struct inet6_skb_parm *opt =IP6CB (skb); -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )__u16 dstbuf;#endif struct dst_entry *dst;
@@ -298,7 +299,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) } opt->lastopt = opt->dst1 =skb_network_header_len (skb); -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE ) dstbuf = opt->dst1;#endif
@@ -308,7 +309,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) skb = *skbp; skb->transport_header += (skb_transport_header (skb)[1 ] +1 ) <<3 ; opt =IP6CB (skb); -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE ) opt->nhoff = dstbuf;#else opt->nhoff = opt->dst1;
@@ -427,7 +428,7 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp) looped_back:if (hdr->segments_left ==0 ) {switch (hdr->type) { -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPV6_SRCRT_TYPE_2 :/* Silently discard type 2 header unless it was * processed by own
@@ -463,7 +464,7 @@ looped_back:return -1 ; }break ; -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPV6_SRCRT_TYPE_2 :/* Silently discard invalid RTH type 2 */ if (hdr->hdrlen !=2 || hdr->segments_left !=1 ) {
@@ -520,7 +521,7 @@ looped_back: addr += i -1 ;switch (hdr->type) { -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPV6_SRCRT_TYPE_2 : if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, (xfrm_address_t *)&ipv6_hdr(skb)->saddr,
net/ipv6/icmp.c +1 -1
@@ -272,7 +272,7 @@ static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, streturn 0 ; } -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )static void mip6_addr_swap (struct sk_buff *skb) {struct ipv6hdr *iph =ipv6_hdr (skb);
net/ipv6/ip6_output.c +1 -1
@@ -543,7 +543,7 @@ int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) found_rhdr =1 ;break ;case NEXTHDR_DEST : -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )if (ipv6_find_tlv (skb, offset,IPV6_TLV_HAO ) >=0 )break ;#endif
net/ipv6/ipv6_sockglue.c +1 -1
@@ -417,7 +417,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,struct ipv6_rt_hdr *rthdr = opt->srcrt;switch (rthdr->type) {case IPV6_SRCRT_TYPE_0 : -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPV6_SRCRT_TYPE_2 :#endif break ;
net/ipv6/mip6.c +19 -3
@@ -30,6 +30,7 @@#include <net/sock.h> #include <net/ipv6.h> #include <net/ip6_checksum.h> +#include <net/rawv6.h> #include <net/xfrm.h> #include <net/mip6.h>
@@ -86,7 +87,7 @@ static int mip6_mh_len(int type)return len; } -int mip6_mh_filter (struct sock *sk,struct sk_buff *skb) +static int mip6_mh_filter (struct sock *sk,struct sk_buff *skb) {struct ip6_mh *mh;
@@ -471,7 +472,7 @@ static struct xfrm_type mip6_rthdr_type = .remote_addr = mip6_xfrm_addr, }; -int __init mip6_init (void ) +static int __init mip6_init (void ) {printk (KERN_INFO "Mobile IPv6\n" );
@@ -483,18 +484,33 @@ int __init mip6_init(void)printk (KERN_INFO "%s: can't add xfrm type(rthdr)\n" , __FUNCTION__); goto mip6_rthdr_xfrm_fail; } +if (rawv6_mh_filter_register (mip6_mh_filter) <0 ) { +printk (KERN_INFO "%s: can't add rawv6 mh filter\n" , __FUNCTION__); + goto mip6_rawv6_mh_fail; + } + +return 0 ; + mip6_rawv6_mh_fail: +xfrm_unregister_type (&mip6_rthdr_type,AF_INET6 ); mip6_rthdr_xfrm_fail:xfrm_unregister_type (&mip6_destopt_type,AF_INET6 ); mip6_destopt_xfrm_fail:return -EAGAIN ; } -void __exit mip6_fini(void) +static void __exit mip6_fini(void) { +if (rawv6_mh_filter_unregister (mip6_mh_filter) <0 ) +printk (KERN_INFO "%s: can't remove rawv6 mh filter\n" , __FUNCTION__);if (xfrm_unregister_type (&mip6_rthdr_type,AF_INET6 ) <0 )printk (KERN_INFO "%s: can't remove xfrm type(rthdr)\n" , __FUNCTION__);if (xfrm_unregister_type (&mip6_destopt_type,AF_INET6 ) <0 )printk (KERN_INFO "%s: can't remove xfrm type(destopt)\n" , __FUNCTION__); } + +module_init (mip6_init); +module_exit (mip6_fini); + +MODULE_LICENSE ("GPL" );
net/ipv6/raw.c +31 -3
@@ -49,7 +49,7 @@#include <net/udp.h> #include <net/inet_common.h> #include <net/tcp_states.h> -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )#include <net/mip6.h> #endif
@@ -137,6 +137,28 @@ static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)return 0 ; } +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE ) +static int (*mh_filter)(struct sock *sock,struct sk_buff *skb); + +int rawv6_mh_filter_register (int (*filter)(struct sock *sock, +struct sk_buff *skb)) +{ +rcu_assign_pointer (mh_filter, filter); +return 0 ; +} +EXPORT_SYMBOL (rawv6_mh_filter_register); + +int rawv6_mh_filter_unregister (int (*filter)(struct sock *sock, +struct sk_buff *skb)) +{ +rcu_assign_pointer (mh_filter,NULL ); +synchronize_rcu (); +return 0 ; +} +EXPORT_SYMBOL (rawv6_mh_filter_unregister); + +#endif +/* * demultiplex raw sockets. * (should consider queueing the skb in the sock receive_queue
@@ -178,16 +200,22 @@ int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)case IPPROTO_ICMPV6 : filtered =icmpv6_filter (sk, skb);break ; -#ifdef CONFIG_IPV6_MIP6 + +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPPROTO_MH : + {/* XXX: To validate MH only once for each packet, * this is placed here. It should be after checking * xfrm policy, however it doesn't. The checking xfrm * policy is placed in rawv6_rcv() because it is * required for each socket. */ - filtered =mip6_mh_filter (sk, skb); +int (*filter)(struct sock *sock,struct sk_buff *skb); + + filter =rcu_dereference (mh_filter); + filtered = filter ?filter (sk, skb) :0 ;break ; + }#endif default : filtered =0 ;
net/ipv6/xfrm6_policy.c +2 -2
@@ -18,7 +18,7 @@#include <net/ip.h> #include <net/ipv6.h> #include <net/ip6_route.h> -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )#include <net/mip6.h> #endif
@@ -318,7 +318,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl) fl->proto = nexthdr;return ; -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )case IPPROTO_MH :if (pskb_may_pull (skb, nh + offset +3 - skb->data)) {struct ip6_mh *mh;
net/ipv6/xfrm6_state.c +2 -2
@@ -65,7 +65,7 @@ __xfrm6_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n) goto end;/* Rule 2: select MIPv6 RO or inbound trigger */ -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )for (i =0 ; i < n; i++) { if (src[i] && (src[i]->props.mode == XFRM_MODE_ROUTEOPTIMIZATION ||
@@ -130,7 +130,7 @@ __xfrm6_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n) goto end;/* Rule 2: select MIPv6 RO or inbound trigger */ -#ifdef CONFIG_IPV6_MIP6 +#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )for (i =0 ; i < n; i++) { if (src[i] && (src[i]->mode == XFRM_MODE_ROUTEOPTIMIZATION ||
Signature · 1 line
1.4.4.2
Hi,
Quoted 9 lines · [email protected] schrieb:
From: Masahide NAKAMURA <[email protected]>
This patch makes MIPv6 loadable module named "mip6".
Here is a
modprobe.conf(5)example to load it automatically when user application uses XFRM state for MIPv6:alias xfrm-type-10-43 mip6
alias xfrm-type-10-60 mip6
What about MODULE_ALIAS("xfrm-type-10-60")
and MODULE_ALIAS("xfrm-type-10-43") in mip6.c ?
The aliases in modprobe.conf(5) should not be necessary then.
If you are really ambitious you can even define a MODULE_ALIAS_XFRM_TYPE macro in include/net/xfrm.h simliar to to MODULE_ALIAS_XFRM_MODE.
Please be sure to discuss CC Herbert Xu then.
Best regards
Ingo Oeser
Quoted 11 lines · Ingo Oeser
Quoted 9 lines · [email protected] schrieb:
From: Masahide NAKAMURA <[email protected]>
This patch makes MIPv6 loadable module named "mip6".
Here is a
modprobe.conf(5)example to load it automatically when user application uses XFRM state for MIPv6:alias xfrm-type-10-43 mip6
alias xfrm-type-10-60 mip6
Quoted 6 lines
What about
MODULE_ALIAS("xfrm-type-10-60")andMODULE_ALIAS("xfrm-type-10-43")inmip6.c?The aliases in
modprobe.conf(5)should not be necessary then.If you are really ambitious you can even define a
MODULE_ALIAS_XFRM_TYPEmacro ininclude/net/xfrm.hsimliar to toMODULE_ALIAS_XFRM_MODE.
I prefer to use new macro like XFRM mode to unify XFRM protocols i.e. esp[46].c, ah[46].c, ipcomp[46].c, and mip6.c if we care about it. Can I add it as extensional patch if nobody has a plan to do this yet?
Quoted 1 line
Please be sure to discuss CC Herbert Xu then.
# CC-ed.
Regards,
Signature · 1 line
Masahide NAKAMURA
Quoted 3 lines · Masahide NAKAMURA
Quoted 2 lines · Ingo Oeser
What about
MODULE_ALIAS("xfrm-type-10-60")
andMODULE_ALIAS("xfrm-type-10-43")inmip6.c?
Just replace your second patch ("Loadable module support") with one, which additionally adds these two lines to mip6.c ...
Quoted 10 lines
Quoted 5 lines
The aliases in
modprobe.conf(5)should not be necessary then.If you are really ambitious you can even define a
MODULE_ALIAS_XFRM_TYPEmacro ininclude/net/xfrm.hsimliar to toMODULE_ALIAS_XFRM_MODE.I prefer to use new macro like XFRM mode to unify XFRM protocols i.e. esp[46].c, ah[46].c, ipcomp[46].c, and
mip6.cif we care about it. Can I add it as extensional patch if nobody has a plan to do this yet?
... and provide a third patch to implement this cleanup.
That way there are no administrative changes required due to any of your patches and we can defer the global cleanup, if it causes problems or conflicts with other patches in that area.
Does this sound like a plan?
Regards
Ingo Oeser
Hi Ingo,
Quoted 19 lines · Ingo Oeser
Quoted 3 lines · Masahide NAKAMURA
Quoted 2 lines · Ingo Oeser
What about
MODULE_ALIAS("xfrm-type-10-60")
andMODULE_ALIAS("xfrm-type-10-43")inmip6.c?Just replace your second patch ("Loadable module support") with one, which additionally adds these two lines to
mip6.c...Quoted 9 lines
Quoted 5 lines
The aliases in
modprobe.conf(5)should not be necessary then.If you are really ambitious you can even define a
MODULE_ALIAS_XFRM_TYPEmacro ininclude/net/xfrm.hsimliar to toMODULE_ALIAS_XFRM_MODE.I prefer to use new macro like XFRM mode to unify XFRM protocols i.e. esp[46].c, ah[46].c, ipcomp[46].c, and
mip6.cif we care about it. Can I add it as extensional patch if nobody has a plan to do this yet?
Quoted 8 lines
... and provide a third patch to implement this cleanup.
That way there are no administrative changes required due to any of your patches and we can defer the global cleanup, if it causes problems or conflicts with other patches in that area.
Does this sound like a plan?
Thank you for the detailed instruction.
I intended to ask the list is just in order to avoid duplicated work; whether such work is already queued by anyone's TODO to support module aliases for each IPsec protocol or not.
Anyway, I'll provide the third patch for review, which will be almost what you described.
Signature · 1 line
Masahide NAKAMURA
PATCH 1/1 : Add module alias for transformation type. (Re: [PATCH 2/2] [IPV6] MIP6: Loadable module support for MIPv6.)
Hi Ingo and all,
This is the third one of MIPv6 module patch. It can be applied after two patches which are already sent to the list. Could you review it?
It is clean-up for XFRM type modules and adds aliases with its protocol:
ESP, AH, IPCOMP, IPIP and IPv6 for IPsec
ROUTING and DSTOPTS for MIPv6
It is almost the same thing as XFRM mode alias, but it is added new defines XFRM_PROTO_XXX for preprocessing since some protocols are defined as enum.
--- include/net/xfrm.h | 10 ++++++++++ net/ipv4/ah4.c | 1 + net/ipv4/esp4.c | 1 + net/ipv4/ipcomp.c | 1 + net/ipv4/xfrm4_tunnel.c | 1 + net/ipv6/ah6.c | 1 + net/ipv6/esp6.c | 1 + net/ipv6/ipcomp6.c | 2 +- net/ipv6/mip6.c | 2 ++ net/ipv6/xfrm6_tunnel.c | 1 + 10 files changed, 20 insertions(+), 1 deletions(-)
include/net/xfrm.h +10 -0
@@ -19,9 +19,19 @@#include <net/ipv6.h> #include <net/ip6_fib.h> +#define XFRM_PROTO_ESP 50 +#define XFRM_PROTO_AH 51 +#define XFRM_PROTO_COMP 108 +#define XFRM_PROTO_IPIP 4 +#define XFRM_PROTO_IPV6 41 +#define XFRM_PROTO_ROUTING IPPROTO_ROUTING +#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS +#define XFRM_ALIGN8 (len) (((len) + 7) & ~7)#define MODULE_ALIAS_XFRM_MODE (family, encap) \ MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) +#define MODULE_ALIAS_XFRM_TYPE (family, proto) \ + MODULE_ALIAS("xfrm-type-" __stringify(family) "-" __stringify(proto))extern struct sock *xfrm_nl;extern u32 sysctl_xfrm_aevent_etime;
net/ipv4/ah4.c +1 -0
@@ -339,3 +339,4 @@ static void __exit ah4_fini(void)module_init (ah4_init);module_exit (ah4_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET ,XFRM_PROTO_AH );
net/ipv4/esp4.c +1 -0
@@ -481,3 +481,4 @@ static void __exit esp4_fini(void)module_init (esp4_init);module_exit (esp4_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET ,XFRM_PROTO_ESP );
net/ipv4/ipcomp.c +1 -0
@@ -485,3 +485,4 @@ MODULE_LICENSE("GPL");MODULE_DESCRIPTION ("IP Payload Compression Protocol (IPComp) - RFC3173" );MODULE_AUTHOR ("James Morris <[email protected]>" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET ,XFRM_PROTO_COMP );
net/ipv4/xfrm4_tunnel.c +1 -0
@@ -109,3 +109,4 @@ static void __exit ipip_fini(void)module_init (ipip_init);module_exit (ipip_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET ,XFRM_PROTO_IPIP );
net/ipv6/ah6.c +1 -0
@@ -554,3 +554,4 @@ module_init(ah6_init);module_exit (ah6_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET6 ,XFRM_PROTO_AH );
net/ipv6/esp6.c +1 -0
@@ -421,3 +421,4 @@ module_init(esp6_init);module_exit (esp6_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET6 ,XFRM_PROTO_ESP );
net/ipv6/ipcomp6.c +1 -1
@@ -500,4 +500,4 @@ MODULE_LICENSE("GPL");MODULE_DESCRIPTION ("IP Payload Compression Protocol (IPComp) for IPv6 - RFC3173" );MODULE_AUTHOR ("Mitsuru KANDA <[email protected]>" ); - +MODULE_ALIAS_XFRM_TYPE (AF_INET6 ,XFRM_PROTO_COMP );
net/ipv6/mip6.c +2 -0
@@ -514,3 +514,5 @@ module_init(mip6_init);module_exit (mip6_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET6 ,XFRM_PROTO_DSTOPTS ); +MODULE_ALIAS_XFRM_TYPE (AF_INET6 ,XFRM_PROTO_ROUTING );
net/ipv6/xfrm6_tunnel.c +1 -0
@@ -379,3 +379,4 @@ static void __exit xfrm6_tunnel_fini(void)module_init (xfrm6_tunnel_init);module_exit (xfrm6_tunnel_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_XFRM_TYPE (AF_INET6 ,XFRM_PROTO_IPV6 );
Signature · 1 line
1.4.4.2
Herbert Xu
maintainerRe: [PATCH] [XFRM]: Add module alias for transformation type. (Re: [PATCH 2/2] [IPV6] MIP6: Loadable module support for MIPv6.)
Quoted 6 lines · On Fri, May 25, 2007 at 01:23:23PM +0900, [email protected] wrote:
include/net/xfrm.h +0
-0
include/net/xfrm.h line 28
Quoted 10 lines
include/net/xfrm.h +7
-0@@ -19,9 +19,19 @@#include <net/ipv6.h> #include <net/ip6_fib.h> +#define XFRM_PROTO_ESP 50 +#define XFRM_PROTO_AH 51 +#define XFRM_PROTO_COMP 108 +#define XFRM_PROTO_IPIP 4 +#define XFRM_PROTO_IPV6 41 +#define XFRM_PROTO_ROUTING IPPROTO_ROUTING +#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS
Could we use the existing IPPROTO_* values for all of these?
Otherwise this looks pretty good.
Thanks,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtRe: [PATCH] [XFRM]: Add module alias for transformation type.
In article <[email protected]> (at Fri, 25 May 2007 15:32:20 +1000), Herbert Xu <[email protected]> says:
Quoted 10 lines · On Fri, May 25, 2007 at 01:23:23PM +0900, [email protected] wrote:
Quoted 9 lines
include/net/xfrm.h +0
-0@@ -19,9 +19,19 @@#include <net/ipv6.h> #include <net/ip6_fib.h>
Quoted 9 lines
include/net/xfrm.h line 28
Quoted 7 lines
include/net/xfrm.h +7
-0+#define XFRM_PROTO_ESP 50 +#define XFRM_PROTO_AH 51 +#define XFRM_PROTO_COMP 108 +#define XFRM_PROTO_IPIP 4 +#define XFRM_PROTO_IPV6 41 +#define XFRM_PROTO_ROUTING IPPROTO_ROUTING +#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTSCould we use the existing IPPROTO_* values for all of these?
No, because they are of enums.
--yoshfuji
Herbert Xu
maintainerRe: [PATCH] [XFRM]: Add module alias for transformation type.
Quoted 3 lines · YOSHIFUJI Hideaki / 吉藤英明
Quoted 1 line
Could we use the existing IPPROTO_* values for all of these?
No, because they are of enums.
Good point. I've forgotten about these module alias hacks :)
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtRe: [PATCH] [XFRM]: Add module alias for transformation type. (Re: [PATCH 2/2] [IPV6] MIP6: Loadable module support for MIPv6.)
In reply to [email protected]Dear Nakamura-san,
Quoted 3 lines · [email protected] schrieb:
This is the third one of MIPv6 module patch. It can be applied after two patches which are already sent to the list. Could you review it?
They look good. Thanks for taking the time to clean this up!
Best Regards
Ingo Oeser
David Miller
maintainerRe: [PATCH] [XFRM]: Add module alias for transformation type.
In reply to [email protected]From: [email protected]
Date: Fri, 25 May 2007 13:23:23 +0900
Quoted 12 lines
Hi Ingo and all,
This is the third one of MIPv6 module patch. It can be applied after two patches which are already sent to the list. Could you review it?
It is clean-up for XFRM type modules and adds aliases with its protocol:
ESP, AH, IPCOMP, IPIP and IPv6 for IPsec
ROUTING and DSTOPTS for MIPv6
Quoted 5 lines
It is almost the same thing as XFRM mode alias, but it is added new defines
XFRM_PROTO_XXXfor preprocessing since some protocols are defined as enum.Signed-off-by Masahide NAKAMURA <[email protected]>
I have also applied this patch, thank you!
Herbert Xu
maintainerQuoted 5 lines · Masahide NAKAMURA
I prefer to use new macro like XFRM mode to unify XFRM protocols i.e. esp[46].c, ah[46].c, ipcomp[46].c, and
mip6.cif we care about it. Can I add it as extensional patch if nobody has a plan to do this yet?
You're most welcome :)
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtDavid Miller
maintainerFrom: [email protected]
Date: Wed, 23 May 2007 16:50:19 +0900
Quoted 30 lines
From: Masahide NAKAMURA <[email protected]>
This patch makes MIPv6 loadable module named "mip6".
Here is a
modprobe.conf(5)example to load it automatically when user application uses XFRM state for MIPv6:alias xfrm-type-10-43 mip6
alias xfrm-type-10-60 mip6Some MIPv6 feature is not included by this modular, however, it should not be affected to other features like either IPsec or IPv6 with and without the patch.
We may discuss XFRM, MH (RAW socket) and ancillary data/sockopt separately for future work.Loadable features:
* MH receiving check (to send ICMP error back)
* RO header parsing and building (i.e. RH2 and HAO in DSTOPTS)
* XFRM policy/state database handling for ROThese are NOT covered as loadable:
* Home Address flags and its rule on source address selection
* XFRM sub policy (depends on its own kernel option)
* XFRM functions to receive RO as IPv6 extension header
* MH sending/receiving through raw socket if user application opens it (since raw socket allows to do so)
* RH2 sending as ancillary data
* RH2 operation with setsockopt(2)
Quoted 1 line
Signed-off-by Masahide NAKAMURA <[email protected]>
Patch applied, thank you!