Commit Graph

92 Commits

Author SHA1 Message Date
Andreas Schultz 976dcfc9f1 gtp: fix the order of error cases in gtp_encap_enable
The ordering of the error case exit was wrong and would
attempt to release the wrong socket.

Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
2015-11-16 18:58:37 +01:00
Andreas Schultz b40f105841 gtp: convert the global gtp_instance_list to a per netns list
This add basic network namespace support by changing to global
gtp_instance_list into a pre namespace list.
Before this change all pdp context would be visible from all
network namespaces, now only the namespace that they belong too,
can see them.

Also selectively destroy all gtp devices when a namespace is
destroyed.

Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-16 18:58:32 +01:00
Andreas Schultz 10855555e9 gtp: remove genl_register_family_with_ops for Linux < 3.13
Remove the support for genl_register_family_with_ops for
Linux < 3.13. Also reorder the initialization to be more
in line with similar modules.

Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-16 18:33:59 +01:00
Andreas Schultz 7018f19683 gtp: remove unused local variable
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-16 18:33:20 +01:00
Andreas Schultz 6deeee8cf3 gtp: update for Linux > 4.2+, set NO_QUEUE flag on gtp device
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-07 17:55:47 +01:00
Andreas Schultz 6bc7645c24 gtp: update for Linux > 4.1+, genlmsg_end return should be ignored
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-07 17:51:50 +01:00
Andreas Schultz 090d6d1b89 gtp: update for Linux > 4.1+, __ip_select_ident arguments have changed
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-07 17:51:33 +01:00
Andreas Schultz 3a45fc68e0 gtp: remove genl_ops compat ifdef for Linux < 3.13
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
2015-11-07 17:50:55 +01:00
Harald Welte fba534b95a Add copright headers and license files, list Pablo as author
The kernel module still only listed me as author, even though Pablo
was doing most of the work on it after my initial incomplete version.
2014-04-03 09:37:38 -04:00
Pablo Neira Ayuso a03b3754d6 gtp: set flow ID for PDP context created throught GTPv0
This field is very important, downlink and uplink packet shall use
the same flow ID.
2014-03-20 13:43:04 +01:00
Pablo Neira Ayuso 57c6ecb185 gtp: add attribute validation for GTPA_TID
Make sure userspace passes a u64.
2014-03-20 12:55:43 +01:00
Pablo Neira Ayuso 0eca321846 gtp: fix hashing of GTPv0 entries in the forwarding base
Use the corresponding hash function depending on the version
type. Using ipv4_hashfn was working with GTPv1 because the
TEI is also 32-bits, bit GTPv0 was broken.
2014-03-20 12:55:41 +01:00
Pablo Neira Ayuso 65af4b0a0e gtp: use proper netdev_dbg dynamic debugging infrastructure
Add some instruction in the proper way that can be enabled on the
demand to debug problems. Let's make it quite verbose at this stage
to relax this later.

Make sure debugfs is mounted:

 # mount -t debugfs nodev /sys/kernel/debug

To enable:

  echo -n 'file gtp.c +p' > /sys/kernel/debug/dynamic_debug/control

To disable:

  echo -n 'file gtp.c -p' > /sys/kernel/debug/dynamic_debug/control

More information here on how to use this: http://lwn.net/Articles/434856/
2014-03-19 15:43:20 +01:00
Pablo Neira Ayuso 3e71452952 gtp: implement gtp_genl_tunnel_get
This function allows you to check if there is a MS address or TEID
that already exists in the gtp forwarding base in a very fast way,
without having to dump the entire forwarding base and doing a search
from userspace.
2014-03-19 15:12:06 +01:00
Pablo Neira Ayuso 23ddc1f778 gtp: fix incorrect UDP header length field
With this fix, osmo-sgsn doesn't ignore our tunneled packet
anymore. It was complaining about incorrect packet length
for received packets.

And osmo-ggsn is working in my testbed :-).
2014-03-18 18:30:05 +01:00
Pablo Neira Ayuso 2cbf0a1483 gtp: fix wrong handling of option header fields in GTPv1
TS 29.060 expresses thing is a quite complicated way just to say
that if any of the optional fields is there, then all optional
fields become mandatory :-).

"This field shall be present if and only if any one or more of the S,
PN and E flags are set.".

So, if any flag is set, we *always* have 4 extra bytes.
2014-03-18 18:30:05 +01:00
Pablo Neira Ayuso f427e3fc9d gtp: fix wrong stripping of UDP and GTP headers
We cannot strip the UDP header until we are sure that this is
a data packet, otherwise this passes a malformed packet to
userspace. The header stripping is now the very last operation
in the processing of GTP packets.
2014-03-18 18:30:01 +01:00
Pablo Neira Ayuso 4c86bcaab4 gtp: remove leftover workqueue
Not needed anymore after 5747406dbb.
2014-02-24 12:31:26 +01:00
Pablo Neira Ayuso 5747406dbb gtp: create socket from userspace and pass them as configuration
openggsn already sets up the UDP sockets that we need for the control
and user planes of GTP. Since we cannot bind two UDP sockets (one from
userspace and another from the kernel) to the same port, change the
current code to pass the socket descriptors that has been allocated
by openggsn (or whatever daemon which uses the GTP kernel
infrastructure).

Two new attributes are added to set up the tunnel device: IFLA_GTP_FD0
(for GTP0) and IFLA_GTP_FD1 (for GTP1u), which specify the UDP socket
created from userspace. Thus, the GTP kernel code only takes care of
enabling the kernel UDP encapsulation routine.
2014-02-23 23:09:59 +01:00
Pablo Neira Ayuso 1b00243775 gtp: delay initialization if compiled built-in
Make sure the IPv4/IPv6 sockets are ready to be used before gtp needs
them.
2014-02-21 16:18:22 +01:00
Pablo Neira Ayuso dd9a15af4d gtp: fix missing initialization of iph->id
This is required by a sane stack to reassemble fragments.
2014-02-21 13:03:18 +01:00
Pablo Neira Ayuso a3ab375c9a gtp: get rid of tid variable
It's only used once.
2014-02-20 12:49:35 +01:00
Pablo Neira Ayuso 20d702b90e gtp: ensure sufficient room for the header in gtp0_udp_encap_recv 2014-02-20 12:49:35 +01:00
Pablo Neira Ayuso d123a0c0f5 gtp: fix handling of messages in the encap input path
* pass up to the stack if we don't know what to do.
* drop packet if not well-formed or not found in our PDP ctx database.
2014-02-20 12:48:40 +01:00
Pablo Neira Ayuso d7cdbddebd gtp: compile with Linux kernel 3.10.28
Add tweak to get this compiling with 3.10.28. Test shows that works
for me.
2014-02-20 02:34:40 +01:00
Pablo Neira Ayuso 4e93f63f6f gtp: don't care if GTP socket is not yet ready in gtp_dev_xmit()
If we receive any packet, it will be just ignored. I don't find
any reason to prematurely drop this in the xmit patch.
2014-02-20 01:14:07 +01:00
Pablo Neira Ayuso e29789755f gtp: kill unused fields in struct pdp_ctx
This is using the sgsn_addr to know where to send the GTP packets,
I guess that was the intention of those fields.
2014-02-20 01:12:03 +01:00
Pablo Neira Ayuso c63d5c5b86 gtp: remove dead code in gtp_link_setup()
I don't find a good reason why this can't be used with pktgen
(IFF_TX_SKB_SHARING) and the tx_queue is already zero if not
initialized.
2014-02-20 01:04:23 +01:00
Pablo Neira Ayuso 972c2a20b0 gtp: use GTP_V0 and GTP_V1 whenever possible
Just a cleanup.
2014-02-20 00:24:24 +01:00
Pablo Neira Ayuso 1fa0cd93f8 gtp: rework handling of GTPv1 extensions
* Conditional check if we can pull the extensions (if any).
* Pull the GTPv1 header (8 bytes) and the extensions (if any).

Tested with emulated replayed pcap traffic, works for me.
2014-02-20 00:06:05 +01:00
Pablo Neira Ayuso 5df6cd2115 gtp: fix flags field for GTPv1
Now wireshark shows a well-formed GTPv1 message.
2014-02-19 23:16:04 +01:00
Pablo Neira Ayuso f33f89787b gtp: fix wrong version in header
v1 is 001 (as interpreted in binary), not 0001 (which is interpreted
as v0.
2014-02-19 16:23:20 +01:00
Pablo Neira Ayuso b2309afc4d gtp: inconditionally set don't fragment flag
Don't use the inner header frag_off, this breaks GTP with fragments.
Instead, inconditionally set the DF flag, this should force us to
fragment the GTP traffic and I think this should also help with wrong
network topologies that result in network loops (that may
encapsulated GTP traffic over and over again).

Other tunnel implementation allows you to configure this.
2014-02-19 15:48:18 +01:00
Pablo Neira Ayuso 943da964ec gtp: remove GTP_CMD_CFG_* genetlink and use rtnetlink interface
This patch converts GTP_CMD_CFG_* genetlink commands to rtnl to
configure the socket address and the hashtable. The trick is to
use a workqueue to configure the socket.

This simplifies the netlink interface, now we have two:

* One to bring up the interface and the socket via rtnl.
* Another to configure tunnels / GTP version.

Before the socket configuration was separated from the the device
setup, which was sloppy.
2014-02-18 19:20:11 +01:00
Pablo Neira Ayuso 0d61da7cab gtp: fix handling of gso packets
Don't get confused with big GSO packets, we should not send
icmp frag needed as the temporary internal mtu of the linux
stack is not bounded to the real device mtu.
2014-02-18 17:22:46 +01:00
Pablo Neira Ayuso 2734d0fa31 gtp: fix MTU handling
Fix MTU handling by using the real device hardware address length
and substract the IP header + UDP header + GTPvX header.

While at it, remove flags that are not required to be reset.
2014-02-18 17:22:26 +01:00
Pablo Neira Ayuso 60f54097ba gtp: use netdev_dbg in prepare_xmit_ipv4
Instead of early debugging with pr_info.
2014-02-18 17:22:24 +01:00
Pablo Neira Ayuso c993e26f15 gtp: use lookup table to calculate gtp1u header length
Based on Harald's suggestion from the code.
2014-02-18 16:27:01 +01:00
Pablo Neira Ayuso 28da979257 gtp: consolidate error path in gtp_ip4_prepare_xmit 2014-02-13 18:31:41 +01:00
Pablo Neira Ayuso 3bc7019c7a gtp: more code preparation to add IPv6 support in the xmit path
This patch refactorizes the xmit path to consolidate the common
handling and move the specific IPv4/IPv6 handling to helper
functions. The IPv6 support is incomplete though.

This patch adds the struct gtp_pktinfo that contains the context
information for tunneling this packet. This should help to avoid
functions with lots of parameters.

Tested with IPv4, still working.
2014-02-13 18:21:39 +01:00
Pablo Neira Ayuso b4cfa8fde5 gtp: no hardcoded values in ipv6_hashfn
Use sizeof(u32) instead of 4, cleanup for readability.
2014-02-13 17:16:19 +01:00
Pablo Neira Ayuso e0ffa33de9 gtp: fix wrong header length validation in gtp1u_udp_encap_recv
Should check for gtp1_hdrlen which is the real length of the gtp1
header with all the available extensions in it.
2014-02-13 17:07:51 +01:00
Pablo Neira Ayuso 9ac4626ffa gtp: remove tid variable from gtp1u_udp_encap_recv
It's only used once.
2014-02-13 16:54:59 +01:00
Pablo Neira Ayuso bea2ae5e46 gtp: add GTP_F_* flags for GTPv1 2014-02-13 16:54:09 +01:00
Pablo Neira Ayuso ddb03d0551 gtp: use gtp1_header in gtp1u_udp_encap_recv
According to what I read in TS 29.060, that header should be enough.
2014-02-13 16:51:04 +01:00
Pablo Neira Ayuso d6eb80503d gtp: remove reference to gtp1u_header
use struct gtp1_header instead.
2014-02-13 16:45:13 +01:00
Pablo Neira Ayuso 19980460cc gtp: use GTP_VX constant when possible 2014-02-13 16:29:40 +01:00
Pablo Neira Ayuso 8f606efa88 gtp: remove redundant skb_reset_network_header().
Already done from the generic gtp_udp_encap_recv.
2014-02-13 15:35:37 +01:00
Pablo Neira Ayuso 4e2c9e3f14 gtp: check source IP address inner packet
Check if that mobile address is allow to send encapsulated packets.
2014-02-13 15:35:21 +01:00
Pablo Neira Ayuso 30d7dc1a0b gtp: initialize transmit sequence number
According to TS 09.60 (8.1.1.1), this has to be zero for the first T-PDU.
2014-02-11 03:20:16 +01:00