Package gtp provides simple and painless handling of GTP(GPRS Tunneling Protocol), implemented in the Go Programming Language.
- Flexible enough to control everything in GTP protocol.;
- For developing mobile core network nodes (see examples).
- For developing testing tools like traffic simulators or fuzzers.
- Many helpers kind to developers provided, like session, bearer, and TEID associations.
- Easy handling of multiple connections with fixed IP and Port with UDP (or other
net.PacketConn
). No platform-specific codes inside, so it works almost everywhere Golang works.Currently it works only on Linux and macOS since netlink support is introduced. I'll make them separated from the base to let it work even on Windows in the future.
The following packages should be installed before starting.
go get -u github.com/pkg/errors
go get -u github.com/google/go-cmp/cmp
go get -u github.com/pascaldekloe/goe/verify
If you use Go 1.11+, you can also use Go Modules.
GO111MODULE=on go [test | build | run | etc...]
Examples works as it is by go build
and executing commands in the following way.
-
Open four terminals on a machine and start capturing on loopback interface.
-
Start P-GW on terminal #1 and #2
// on terminal #1
./pgw
// on terminal #2
./pgw -s5c 127.0.0.53:2123 -s5u 127.0.0.5:2152
- Start S-GW on terminal #3
// on terminal #3
./sgw
- Start MME on terminal #4
// on terminal #4
./mme
- You will see the nodes exchanging Create Session and Modify Bearer on C-Plane, and ICMP Echo on U-Plane afterwards.
If you want to see fewer number of subscribers, please comment-out the v2.Subscriber
definitions in example/mme/main.go
.
Each version has net.PacketConn
-like APIs and GTP-specific ones which is often version-specific.
The basic idea behind the current implementation is;
Dial()
orListenAndServe()
to create a connection(Conn
) between nodes.- Register handlers to the
Conn
for specific messages withAddHandler()
, which allows users to handle the messages coming from the remote endpoint as flexible as possible, with less pain. CreateXXX()
to create session or PDP context with arbitrary IEs given. Session/PDP context is structured and they also have some helpers likeAddTEID()
to handle known TEID properly.
For the detailed usage of specific version, see README.md under each version's directory.
Version | Details |
---|---|
GTPv0 | README.md |
GTPv1 | README.md |
GTPv2 | README.md |
Note that "supported" means that the package provides helpers which makes it easier to handle. In other words, even if a message/IE is not marked as "Yes", you can make it work with some additional effort.
Your contribution is welcome to implement helpers for all the types, of course!
Version | Messages | IEs | Networking (state machine) | Details |
---|---|---|---|---|
GTPv0 | 35.7% | 81.8% | not implemented yet | Supported Features |
GTPv1 | 26.6% | 30.1% | v1-U is functional, v1-C is not implemented yet |
Supported Features |
GTPv2 | 41.0% | 43.2% | almost functional | Supported Features |
GTP' (Prime) |
N/A | N/A | N/A | not planned |
This is still an experimental project. Any part of implementations(including exported APIs) may be changed before released as v1.0.0.
Yoshiyuki Kurauchi (Twitter / LinkedIn)
I'm always open to welcome co-authors! Please feel free to talk to me.