GRE over IPv6
Subsystems (3)
PATCH 1/1 GRE over IPv6
GRE over IPv6 imlementation.
Based on ipv4/ip_gre.c and ipv6/ip6_tunnel.c
Signed-off-by Dmitry Kozlov <[email protected]>
---
include/linux/if_arp.h | 1 + include/linux/if_tunnel.h | 3 + include/linux/ip6_tunnel.h | 18 + include/net/ip6_tunnel.h | 40 ++- include/net/ipv6.h | 1 + net/ipv6/Kconfig | 16 + net/ipv6/Makefile | 1 + net/ipv6/ip6_gre.c | 1228 ++++++++++++++++++++++---------------------- net/ipv6/ip6_tunnel.c | 86 +++- 9 files changed, 767 insertions(+), 627 deletions(-)
include/linux/if_arp.h +1 -0
@@ -92,6 +92,7 @@#define ARPHRD_PHONET 820/* PhoNet media type */ #define ARPHRD_PHONET_PIPE 821/* PhoNet pipe header */ #define ARPHRD_CAIF 822/* CAIF media type */ +#define ARPHRD_IP6GRE 823/* GRE over IPv6 */ #define ARPHRD_VOID 0xFFFF/* Void type, nothing is known */ #define ARPHRD_NONE 0xFFFE/* zero header length */
include/linux/if_tunnel.h +3 -0
@@ -75,6 +75,9 @@ enum {IFLA_GRE_TTL ,IFLA_GRE_TOS ,IFLA_GRE_PMTUDISC , +IFLA_GRE_ENCAP_LIMIT , +IFLA_GRE_FLOWINFO , +IFLA_GRE_FLAGS , __IFLA_GRE_MAX, };
include/linux/ip6_tunnel.h +18 -0
@@ -31,4 +31,22 @@ struct ip6_tnl_parm { struct in6_addr raddr; /* remote tunnel end-point address */ }; +struct ip6_tnl_parm2 { +char name[IFNAMSIZ ];/* name of tunnel device */ +int link;/* ifindex of underlying L2 interface */ +__u8 proto;/* tunnel protocol */ +__u8 encap_limit;/* encapsulation limit for tunnel */ +__u8 hop_limit;/* hop limit for tunnel */ +__be32 flowinfo;/* traffic class and flowlabel for tunnel */ +__u32 flags;/* tunnel flags */ +struct in6_addr laddr;/* local tunnel end-point address */ +struct in6_addr raddr;/* remote tunnel end-point address */ + +__be16 i_flags; +__be16 o_flags; +__be32 i_key; +__be32 o_key; +}; + +#endif
include/net/ip6_tunnel.h +39 -1
@@ -5,6 +5,8 @@#include <linux/netdevice.h> #include <linux/ip6_tunnel.h> +#define IP6TUNNEL_ERR_TIMEO (30*HZ) +/* capable of sending packets */ #define IP6_TNL_F_CAP_XMIT 0x10000/* capable of receiving packets */
@@ -13,14 +15,40 @@#define IP6_TNL_F_CAP_PER_PACKET 0x40000/* IPv6 tunnel */ +struct __ip6_tnl_parm +{ +char name[IFNAMSIZ ];/* name of tunnel device */ +int link;/* ifindex of underlying L2 interface */ +__u8 proto;/* tunnel protocol */ +__u8 encap_limit;/* encapsulation limit for tunnel */ +__u8 hop_limit;/* hop limit for tunnel */ +__be32 flowinfo;/* traffic class and flowlabel for tunnel */ +__u32 flags;/* tunnel flags */ +struct in6_addr laddr;/* local tunnel end-point address */ +struct in6_addr raddr;/* remote tunnel end-point address */ + +__be16 i_flags; +__be16 o_flags; +__be32 i_key; +__be32 o_key; +};struct ip6_tnl {struct ip6_tnl __rcu *next;/* next tunnel in list */ struct net_device *dev;/* virtual device associated with tunnel */ -struct ip6_tnl_parm parms;/* tunnel configuration parameters */ +struct __ip6_tnl_parm parms;/* tunnel configuration parameters */ struct flowi fl;/* flowi template for xmit */ struct dst_entry *dst_cache;/* cached dst */ u32 dst_cookie; + +int err_count; +unsigned long err_time; + +/* These fields used only by GRE */ +__u32 i_seqno;/* The last seen seqno */ +__u32 o_seqno;/* The last output seqno */ +int hlen;/* Precalculated GRE header length */ +int mlink; };/* Tunnel encapsulation limit destination sub-option */
@@ -31,4 +59,14 @@ struct ipv6_tlv_tnl_enc_lim { __u8 encap_limit; /* tunnel encapsulation limit */ } __packed; +struct dst_entry *ip6_tnl_dst_check (struct ip6_tnl *t); +void ip6_tnl_dst_reset (struct ip6_tnl *t); +void ip6_tnl_dst_store (struct ip6_tnl *t,struct dst_entry *dst); +int ip6_tnl_rcv_ctl (struct ip6_tnl *t,const struct in6_addr *laddr, +const struct in6_addr *raddr); +int ip6_tnl_xmit_ctl (struct ip6_tnl *t); +__u16 ip6_tnl_parse_tlv_enc_lim (struct sk_buff *skb,__u8 * raw); +__u32 ip6_tnl_get_cap (struct ip6_tnl *t,const struct in6_addr *laddr, +const struct in6_addr *raddr); +#endif
include/net/ipv6.h +1 -0
@@ -31,6 +31,7 @@#define NEXTHDR_HOP 0/* Hop-by-hop option header. */ #define NEXTHDR_TCP 6/* TCP segment. */ #define NEXTHDR_UDP 17/* UDP message. */ +#define NEXTHDR_GRE 47/* GRE header. */ #define NEXTHDR_IPV6 41/* IPv6 in IPv6 */ #define NEXTHDR_ROUTING 43/* Routing header. */ #define NEXTHDR_FRAGMENT 44/* Fragmentation/reassembly header. */
net/ipv6/Kconfig +16 -0
@@ -201,6 +201,22 @@ config IPV6_TUNNEL If unsure, say N. +config IPV6_GRE + tristate "IPv6: GRE tunnel" + select IPV6_TUNNEL + ---help--- + Tunneling means encapsulating data of one protocol type within + another protocol and sending it over a channel that understands the + encapsulating protocol. This particular tunneling driver implements + GRE (Generic Routing Encapsulation) and at this time allows + encapsulating of IPv4 or IPv6 over existing IPv6 infrastructure. + This driver is useful if the other endpoint is a Cisco router: Cisco + likes GRE much better than the other Linux tunneling driver ("IP + tunneling" above). In addition, GRE allows multicast redistribution + through the tunnel. + + Saying M here will produce a module called ip6_gre. If unsure, say N. + config IPV6_MULTIPLE_TABLES bool "IPv6: Multiple Routing Tables" depends on EXPERIMENTAL
net/ipv6/Makefile +1 -0
@@ -36,6 +36,7 @@ obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_IPV6_SIT) += sit.o obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o +obj-$(CONFIG_IPV6_GRE) += ip6_gre.o obj-y += addrconf_core.o exthdrs_core.o
net/ipv6/ip6_gre.c new file +1816 -0
1,816 lines not on this page · raw message
net/ipv6/ip6_tunnel.c +62 -24
247 lines not on this page · raw message