Commit Graph

80 Commits

Author SHA1 Message Date
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
Pablo Neira Ayuso 5f59df2a24 gtp: fix stats memleak when releasing the gtp0 device
Make sure that the statistics are releasing when removing the module.
2014-02-11 02:20:49 +01:00
Pablo Neira Ayuso c119c2cd8d gtp: gtp0 does not have any queue
So no need to define a lock since our gtp devices have no queues.
2014-02-11 02:16:38 +01:00
Pablo Neira Ayuso 72aa29aaa6 gtp: drop input GTP packet if malformed
Harald's code was originally dropping malformed packets. Once this
code is ported to 3.14, we'll likely use iptunnel functions that
also mangle the checksum after stripping off the UDP header. Restoring
all that is expensive, so let's assume that malformed GTP packets are
unlikely to happen.
2014-02-11 02:06:40 +01:00
Pablo Neira Ayuso 3c4f414e72 gtp: refactor common encapsulation input code
Thus, we don't need to apply the same fixes to very similar code.
2014-02-11 01:51:42 +01:00
Pablo Neira Ayuso 574a0d4d06 gtp: make sure the udp is linear in the encapsulation input path
We cannot rely on the skb->len > sizeof(struct udphdr) checking that
happens just before the encapsulation since that doesn't guarantee
that the UDP header is linear. Calling __skb_pull may result in getting
us out of the skbuff head boundary. Let's use pskb_may_pull() instead
which internally calls __pskb_pull_tail() to linearize the UDP header
if needed.
2014-02-11 01:27:53 +01:00
Pablo Neira Ayuso 3d2d342b30 gtp: remove skb_orphan call from the input encap path
This call is not required at all. In __udp4_lib_rcv, just before
the encapsulation routine is called, the skb_steal_sock() call
makes sure that skb->sk is always null.
2014-02-11 00:10:27 +01:00
Pablo Neira Ayuso ddd8a74209 gtp: remove unused struct gsn
We'll use a per netns list instead.
2014-02-11 00:08:30 +01:00
Pablo Neira Ayuso edb298ba86 gtp: don't disable bottom halves when accessing the PDP context hashtable
The lists of the hashtable are already protected by rcu and
addition/removal of objects is protected via rtnl_lock and
genl_lock.

Remove the _bh from many rcu_read_{lock,unlock}(). I don't find a good
reason to disable bottom halves.
2014-02-10 18:53:58 +01:00
Pablo Neira Ayuso ac65fe65da gtp: use kernel types
u{8,16,32,64} instead of uint{8,16,32,64}_t.

Also convert several uint32_t to struct in_addr.
2014-02-10 18:35:37 +01:00
Pablo Neira Ayuso 268455a2ae gtp: initial random seed for the hash tables
I think it's very hard to deploy any hashbomb attack since the
entries are created via netlink, but let's just avoid that someone
generates traffic to spend cycles on a busy hashtable chain.
2014-02-10 18:23:43 +01:00
Pablo Neira Ayuso bb8c47d957 gtp: remove useless comment on tree / hashtable size
We already use a hashtable, the size is still hardcoded but that
should be easy to fix. I think the hashtable is just fine, no
need to add a rb-tree here.
2014-02-10 18:19:36 +01:00
Pablo Neira Ayuso f40a5721ea gtp: reorganize headers
* gtp_nl.h now contains exported netlink attributes and commands to
  userspace.

* gtp.h contains internal definition for the GTP protocol implementation.
2014-02-10 18:04:26 +01:00