Commit Graph

109 Commits

Author SHA1 Message Date
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 d454a53f62 gtp-rtnl: remove debugging message that print netlink message 2014-03-20 10:33:18 +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 151652cc80 libgtpnl: tools: fix compilation of gtp-link-add
A typo slipped through into that file and it stopped compiling.
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 1783c7cda4 allow to specify the interface name for the GTP device
We can use this to specify 'gtp0' from openggsn, so we make sure that
it always uses the same tunnel device on creation. If it already exists,
it will return EEXIST. This is used to skip the problem of lacking
NLM_F_ECHO in the rtnetlink link interface that allows us to know the
name of the gtp device that has been dynamically allocated from the
kernel.

And, finally, I don't find any use case for having more than one tunnel
device when integrating this with openggsn.

This patch also adjusts tools/gtp-link-add.c which needs some care, since
it is not yet using any of the library functions. This tools are likely
to be useful for troubleshooting and debugging.
2014-02-24 11:41:51 +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 1afa16a16b gtp-rtnl: add gtp_dev_destroy
This function allows you to destroy the gtpX device.
2014-02-22 23:19:58 +01:00
Pablo Neira Ayuso b94023299f gtp-rtnl: refactor code to prepare the addition of gtp_dev_destroy
Add gtp_dev_talk() and gtp_put_nlmsg().
2014-02-22 23:09:38 +01:00
Pablo Neira Ayuso efdbb3bc73 gtp-rtnl: fix leak in struct mnl_socket on error in gtp_dev_create()
Release it in the error path.
2014-02-22 22:50:00 +01:00
Pablo Neira Ayuso e91a1a4ab7 tools: gtp-tunnel: fix accidentally swapped ms_addr and sgsn_addr
The output was swapping the ms and the sgsn addresses.
2014-02-22 22:38:05 +01:00
Pablo Neira Ayuso 4c2e76077a gtp-genl: fix compilation warning
Fix these compilation warning:

gtp-genl.c:131:8: warning: 'pdp.version' may be used uninitialized in this function [-Wmaybe-uninitialized]
gtp-genl.c:132:8: warning: 'pdp.tid' may be used uninitialized in this function [-Wmaybe-uninitialized]
d  CCLD   libgtpnl.la

By initializing the pdp object.
2014-02-22 22:30:23 +01:00
Pablo Neira Ayuso 2cf5c87b96 add struct gtp_tunnel and adapt functions to use it
This patch adds a gtp_tunnel structure to avoid having to deal with
functions with lots of parameters. This should also help to extend
the interfaces and the gtp_tunnel object without breaking the binary
interface (which will be good by when ipv6 support will be added).
2014-02-22 22:30:14 +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 c7e6ffadb4 add libgtpnl
This patch adds the libgtpnl library. Harald mentioned that he wanted
that the specific code that is added is well encapsulated, so let's
start a small library to interact with the GTP kernel module via netlink
interface.

This was done a bit while in the rush, so the interfaces are not nice
at all and the tools need to be ported on top of this library.

This library will be used to integrate openggsn with the GTP kernel
module.
2014-02-20 19:41:29 +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 6deca6cede gtp-tunnel: validate GTP version and interface
This patch only allows v0 and v1 as possible GTP versions and
check that the interface is valid.
2014-02-19 16:02:52 +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 bf2b3b38a7 gtp: use endian-aware types
Good to spot endianness issues via sparse.
2014-02-13 16:37:37 +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