forked from mirrors/linux
		
	gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U)
This is an initial implementation of a netdev driver for GTP datapath (GTP-U) v0 and v1, according to the GSM TS 09.60 and 3GPP TS 29.060 standards. This tunneling protocol is used to prevent subscribers from accessing mobile carrier core network infrastructure. This implementation requires a GGSN userspace daemon that implements the signaling protocol (GTP-C), such as OpenGGSN [1]. This userspace daemon updates the PDP context database that represents active subscriber sessions through a genetlink interface. For more context on this tunneling protocol, you can check the slides that were presented during the NetDev 1.1 [2]. Only IPv4 is supported at this time. [1] http://git.osmocom.org/openggsn/ [2] http://www.netdevconf.org/1.1/proceedings/slides/schultz-welte-osmocom-gtp.pdf Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									c047c3b1af
								
							
						
					
					
						commit
						459aa660eb
					
				
					 8 changed files with 1462 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -192,6 +192,23 @@ config GENEVE
 | 
			
		|||
	  To compile this driver as a module, choose M here: the module
 | 
			
		||||
	  will be called geneve.
 | 
			
		||||
 | 
			
		||||
config GTP
 | 
			
		||||
	tristate "GPRS Tunneling Protocol datapath (GTP-U)"
 | 
			
		||||
	depends on INET && NET_UDP_TUNNEL
 | 
			
		||||
	select NET_IP_TUNNEL
 | 
			
		||||
	---help---
 | 
			
		||||
	  This allows one to create gtp virtual interfaces that provide
 | 
			
		||||
	  the GPRS Tunneling Protocol datapath (GTP-U). This tunneling protocol
 | 
			
		||||
	  is used to prevent subscribers from accessing mobile carrier core
 | 
			
		||||
	  network infrastructure. This driver requires a userspace software that
 | 
			
		||||
	  implements the signaling protocol (GTP-C) to update its PDP context
 | 
			
		||||
	  base, such as OpenGGSN <http://git.osmocom.org/openggsn/). This
 | 
			
		||||
	  tunneling protocol is implemented according to the GSM TS 09.60 and
 | 
			
		||||
	  3GPP TS 29.060 standards.
 | 
			
		||||
 | 
			
		||||
	  To compile this drivers as a module, choose M here: the module
 | 
			
		||||
	  wil be called gtp.
 | 
			
		||||
 | 
			
		||||
config MACSEC
 | 
			
		||||
	tristate "IEEE 802.1AE MAC-level encryption (MACsec)"
 | 
			
		||||
	select CRYPTO
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@ obj-$(CONFIG_VETH) += veth.o
 | 
			
		|||
obj-$(CONFIG_VIRTIO_NET) += virtio_net.o
 | 
			
		||||
obj-$(CONFIG_VXLAN) += vxlan.o
 | 
			
		||||
obj-$(CONFIG_GENEVE) += geneve.o
 | 
			
		||||
obj-$(CONFIG_GTP) += gtp.o
 | 
			
		||||
obj-$(CONFIG_NLMON) += nlmon.o
 | 
			
		||||
obj-$(CONFIG_NET_VRF) += vrf.o
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1364
									
								
								drivers/net/gtp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1364
									
								
								drivers/net/gtp.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										34
									
								
								include/net/gtp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								include/net/gtp.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
#ifndef _GTP_H_
 | 
			
		||||
#define _GTP_H
 | 
			
		||||
 | 
			
		||||
/* General GTP protocol related definitions. */
 | 
			
		||||
 | 
			
		||||
#define GTP0_PORT	3386
 | 
			
		||||
#define GTP1U_PORT	2152
 | 
			
		||||
 | 
			
		||||
#define GTP_TPDU	255
 | 
			
		||||
 | 
			
		||||
struct gtp0_header {	/* According to GSM TS 09.60. */
 | 
			
		||||
	__u8	flags;
 | 
			
		||||
	__u8	type;
 | 
			
		||||
	__be16	length;
 | 
			
		||||
	__be16	seq;
 | 
			
		||||
	__be16	flow;
 | 
			
		||||
	__u8	number;
 | 
			
		||||
	__u8	spare[3];
 | 
			
		||||
	__be64	tid;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
struct gtp1_header {	/* According to 3GPP TS 29.060. */
 | 
			
		||||
	__u8	flags;
 | 
			
		||||
	__u8	type;
 | 
			
		||||
	__be16	length;
 | 
			
		||||
	__be32	tid;
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
#define GTP1_F_NPDU	0x01
 | 
			
		||||
#define GTP1_F_SEQ	0x02
 | 
			
		||||
#define GTP1_F_EXTHDR	0x04
 | 
			
		||||
#define GTP1_F_MASK	0x07
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -141,6 +141,7 @@ header-y += gfs2_ondisk.h
 | 
			
		|||
header-y += gigaset_dev.h
 | 
			
		||||
header-y += gpio.h
 | 
			
		||||
header-y += gsmmux.h
 | 
			
		||||
header-y += gtp.h
 | 
			
		||||
header-y += hdlcdrv.h
 | 
			
		||||
header-y += hdlc.h
 | 
			
		||||
header-y += hdreg.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										33
									
								
								include/uapi/linux/gtp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								include/uapi/linux/gtp.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
#ifndef _UAPI_LINUX_GTP_H_
 | 
			
		||||
#define _UAPI_LINUX_GTP_H__
 | 
			
		||||
 | 
			
		||||
enum gtp_genl_cmds {
 | 
			
		||||
	GTP_CMD_NEWPDP,
 | 
			
		||||
	GTP_CMD_DELPDP,
 | 
			
		||||
	GTP_CMD_GETPDP,
 | 
			
		||||
 | 
			
		||||
	GTP_CMD_MAX,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gtp_version {
 | 
			
		||||
	GTP_V0 = 0,
 | 
			
		||||
	GTP_V1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum gtp_attrs {
 | 
			
		||||
	GTPA_UNSPEC = 0,
 | 
			
		||||
	GTPA_LINK,
 | 
			
		||||
	GTPA_VERSION,
 | 
			
		||||
	GTPA_TID,	/* for GTPv0 only */
 | 
			
		||||
	GTPA_SGSN_ADDRESS,
 | 
			
		||||
	GTPA_MS_ADDRESS,
 | 
			
		||||
	GTPA_FLOW,
 | 
			
		||||
	GTPA_NET_NS_FD,
 | 
			
		||||
	GTPA_I_TEI,	/* for GTPv1 only */
 | 
			
		||||
	GTPA_O_TEI,	/* for GTPv1 only */
 | 
			
		||||
	GTPA_PAD,
 | 
			
		||||
	__GTPA_MAX,
 | 
			
		||||
};
 | 
			
		||||
#define GTPA_MAX (__GTPA_MAX + 1)
 | 
			
		||||
 | 
			
		||||
#endif /* _UAPI_LINUX_GTP_H_ */
 | 
			
		||||
| 
						 | 
				
			
			@ -529,6 +529,16 @@ enum {
 | 
			
		|||
};
 | 
			
		||||
#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1)
 | 
			
		||||
 | 
			
		||||
/* GTP section */
 | 
			
		||||
enum {
 | 
			
		||||
	IFLA_GTP_UNSPEC,
 | 
			
		||||
	IFLA_GTP_FD0,
 | 
			
		||||
	IFLA_GTP_FD1,
 | 
			
		||||
	IFLA_GTP_PDP_HASHSIZE,
 | 
			
		||||
	__IFLA_GTP_MAX,
 | 
			
		||||
};
 | 
			
		||||
#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1)
 | 
			
		||||
 | 
			
		||||
/* Bonding section */
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,7 @@ struct udphdr {
 | 
			
		|||
#define UDP_ENCAP_ESPINUDP_NON_IKE	1 /* draft-ietf-ipsec-nat-t-ike-00/01 */
 | 
			
		||||
#define UDP_ENCAP_ESPINUDP	2 /* draft-ietf-ipsec-udp-encaps-06 */
 | 
			
		||||
#define UDP_ENCAP_L2TPINUDP	3 /* rfc2661 */
 | 
			
		||||
 | 
			
		||||
#define UDP_ENCAP_GTP0		4 /* GSM TS 09.60 */
 | 
			
		||||
#define UDP_ENCAP_GTP1U		5 /* 3GPP TS 29.060 */
 | 
			
		||||
 | 
			
		||||
#endif /* _UAPI_LINUX_UDP_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue