1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
Test and Demonstrate SRv6 Mobile User Plane Plugin
========================
## Getting started
To play with SRv6 Mobile User Plane on VPP, you need to install following packages:
docker
python3
pip3
Python packages (use pip):
docker
scapy
jinja2
### Quick-start
1. Build up the docker container image as following:
```
$ git clone https://github.com/filvarga/srv6-mobile.git
$ cd ./srv6-mobile/src/plugins/srv6-mobile/extra
$ ./runner.py infra build
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
srv6m-image latest 577e786b7ec6 2 days ago 8GB
ubuntu 18.04 4c108a37151f 4 weeks ago 64.2MB
```
The runner script [runner.py](runner.py) has features to automate configurations and procedures for the test.
2. Instantiate test Scenario
Let's try following command to instantiate a topology:
```
$ ./runner.py infra start
```
This command instantiates 4 VPP containers with following topology:
![Topology Diagram](topo-init.png)
You can check the instantiated docker instances with "docker ps".
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44cb98994500 srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-4
6d65fff8aee9 srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-3
ad123b516b24 srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-2
5efed405b96a srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-1
```
You can login to and configure each instantiated container.
```
$ ./runner.py cmd vppctl 0
Verified image: None
connecting to: hck-vpp-1
_______ _ _ _____ ___
__/ __/ _ \ (_)__ | | / / _ \/ _ \
_/ _// // / / / _ \ | |/ / ___/ ___/
/_/ /____(_)_/\___/ |___/_/ /_/
vpp#
```
## Test Scenarios
### SRv6 Drop-in between GTP-U tunnel
This test scenario introduces SRv6 path between GTP-U tunnel transparently. A GTP-U packet sent out from one end to another is translated to SRv6 and then back to GTP-U. All GTP-U tunnel identifiers are preserved in IPv6 header and SRH.
#### GTP-U over UDP/IPv4 case
This case uses SRv6 end functions, T.M.GTP4.D and End.M.GTP4.E.
![Topology Diagram](topo-test_gtp4d.png)
VPP1 is configured with "T.M.GTP4.D", and VPP4 is configured with "End.M.GTP4.E". Others are configured with "End". The packet generator sends a GTP-U packet over UDP/IPv4 toward the packet capture. VPP1 translates it to SRv6 toward D4::TEID with SR policy <D2::, D3::> in SRH. VPP4 translates the SRv6 packet to the original GTP-U packet and send out to the packet capture.
To start this case with IPv4 payload over GTP-U, you can run:
```
$ ./runner.py test gtp4
```
If you want to use IPv6 payload instead of IPv4, you can run:
```
$ ./runner.py test gtp4_ipv6
```
If you use the latest scapy codes from the master branch, you can test the functions with GTP-U packet in 5G format:
```
$ ./runner.py test gtp4_5g
```
#### GTP-U over UDP/IPv6 case
This case uses SRv6 end functions, End.M.GTP6.D.Di and End.M.GTP6.E.
![Topology Diagram](topo-test_gtp6d.png)
VPP1 is configured with "End.M.GTP6.D.Di", and VPP4 is configured with "End.M.GTP4.E". Others are configured with "End". The packet generator sends a GTP-U packet over UDP/IPv6 toward D:: of the packet capture. VPP1 translates it to SRv6 toward D:: with SR policy <D2::, D3::, D4::TEID> in SRH. VPP4 translates the SRv6 packet to the original GTP-U packet and send out to the packet capture.
To start this case with IPv4 payload over GTP-U, you can run:
```
$ ./runner.py test gtp6_drop_in
```
If you want to use IPv6 payload instead of IPv4, you can run:
```
$ ./runner.py test gtp6_drop_in_ipv6
```
### GTP-U to SRv6
This test scenario demonstrates GTP-U to SRv6 translation. A GTP-U packet sent out from one end to another is translated to SRv6.
#### GTP-U over UDP/IPv6 case
##### IPv4 payload
This case uses SRv6 end functions, End.M.GTP6.D and End.DT4.
![Topology Diagram](topo-test_gtp6.png)
VPP1 is configured with "End.M.GTP6.D", and VPP4 is configured with "End.DT4". Others are configured with "End". The packet generator sends a GTP-U packet over UDP/IPv6 toward D::2. VPP1 translates it to SRv6 toward the IPv6 destination consists of D4:: and TEID of GTP-U with SR policy <D2::, D3::> in SRH. VPP4 decapsulates the SRv6 packet and lookup the table for the inner IPv4 packet and send out to the packet capture.
To start this case, you can run:
```
$ ./runner.py test gtp6
```
##### IPv6 payload
This case uses SRv6 end functions, End.M.GTP6.D and End.DT6.
![Topology Diagram](topo-test_gtp6ip6.png)
The configurations are same with IPv4 payload case, except D4:: is configured as "End.DT6" in VPP4. VPP4 decapsulates the SRv6 packet and lookup the table for the inner IPv6 packet and send out to the packet capture.
If you want to use IPv6 payload instead of IPv4, you can run:
```
$ ./runner.py test gtp6_ipv6
```
## More information
- @subpage runner_doc.md
|