Merge "Submit initial test framework skeleton."
[vpp.git] / vnet / vnet / map / examples / map-test.py
1 #!/usr/bin/env python
2 # Copyright (c) 2015 Cisco and/or its affiliates.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at:
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import sys, time
16 from scapy.all import *
17
18 import mapalgs
19
20
21 ifname = "vpp-tap"
22
23 loc_v4_mac = "aa:aa:aa:aa:aa:a4"
24 loc_v6_mac = "aa:aa:aa:aa:aa:a6"
25 vpp_mac = "aa:aa:aa:aa:00:00"
26
27 map_t = 1
28
29 fragsize = 0
30 map_mtu = 200
31
32 def mac_to_vppmac(mac):
33     mac = mac.replace(':', '')
34     return mac[0:4]+"."+mac[4:8]+"."+mac[8:12]
35
36
37 map = mapalgs.MapCalc( rulev6 = 'bbbb::/32',
38                      rulev4 = '20.0.0.0/24',
39                      ratio = 256);
40
41 dmr = mapalgs.DmrCalc('cccc:bbbb::/96')
42
43
44 ICMP_TYPES_CODES = {
45     0: 0,
46     3: 15,
47     4: 0,
48     5: 3,
49     6: 0,
50     8: 0,
51     9: 0,
52     10: 0,
53     11: 1,
54     12: 2,
55     13: 0,
56     14: 0,
57     15: 0,
58     16: 0,
59     17: 0,
60     18: 0
61 }
62
63 ICMP6_TYPES_CODES = {
64     1: 7,
65     2: 0,
66     3: 1,
67     4: 3,
68 }
69
70 def net_conf():
71     c = ""
72     c += "tap connect "+ifname+" hwaddr "+mac_to_vppmac(vpp_mac)+" \n"
73     c += "set int state tap-0 up \n"
74     c += "set ip6 neighbor tap-0 2001:f00d::1 "+mac_to_vppmac(loc_v6_mac)+" \n"
75     c += "set ip  arp      tap-0 10.0.0.1     "+mac_to_vppmac(loc_v4_mac)+" \n"
76     c += "ip route add ::/0  via 2001:f00d::1 tap-0 \n"
77     c += "ip route add 0.0.0.0/0 via 10.0.0.1 tap-0 \n"
78     return c
79
80 def conf():
81     c = net_conf()
82     c += "map add domain ip4-pfx 20.0.0.0/24 ip6-pfx bbbb::/32 ea-bits-len 16 psid-offset 6 psid-len 8"
83     if map_mtu != 0:
84         c += " mtu "+str(map_mtu)
85     if map_t:
86         c += " ip6-src cccc:bbbb::/96 map-t"
87     else:
88         c += " ip6-src cccc:bbbb::ffff"
89
90     c += "\n"
91     return c
92
93 def send_packet(ip_header, ip_content):
94     print("Send packet")
95     if fragsize != 0:
96         if ip_header.version == 4:
97             frags = fragment(ip_header/ip_content, fragsize=fragsize)
98             for f in frags:
99                 print("Fragmented IPv4 packet")
100                 sendp(Ether(dst=vpp_mac, src=loc_v4_mac)/f, iface=ifname)
101         elif ip_header.version == 6:
102             frags = fragment6(ip_header/IPv6ExtHdrFragment()/ip_content, fragsize)
103             for f in frags:
104                 print("Fragmented IPv6 packet")
105                 sendp(Ether(dst=vpp_mac, src=loc_v6_mac)/f, iface=ifname)
106     else:
107         sendp(Ether(dst=vpp_mac)/ip_header/ip_content, iface=ifname)
108
109 def send_packet_frag_inner(packet, inner_header, inner_content):
110     print("Send packet with inner ICMP packet")
111     if fragsize != 0:
112         if packet.version == 4:
113             frags = fragment(inner_header/inner_content, fragsize=fragsize)
114             for f in frags:
115                 print("Fragmented IPv4 inner packet")
116                 sendp(Ether(dst=vpp_mac, src=loc_v4_mac)/packet/f, iface=ifname)
117         elif packet.version == 6:
118             frags = fragment6(inner_header/IPv6ExtHdrFragment()/inner_content, fragsize)
119             for f in frags:
120                 print("Fragmented IPv6 inner packet")
121                 sendp(Ether(dst=vpp_mac, src=loc_v6_mac)/packet/f, iface=ifname)
122     else:
123         sendp(Ether(dst=vpp_mac)/packet/inner_header/inner_content, iface=ifname)
124
125
126 def sendv6udp(src, dst, port):
127     psid = map.gen_psid(port)
128     ceaddr = str(map.get_mapce_addr(src, psid))
129     dst = str(dmr.embed_6052addr(dst))
130     send_packet(IPv6(dst=dst, src=ceaddr), UDP(sport=port)/('X'*900))
131
132 def sendv6tcp(src, dst, port):
133     psid = map.gen_psid(port)
134     ceaddr = str(map.get_mapce_addr(src, psid))
135     dst = str(dmr.embed_6052addr(dst))
136     send_packet(IPv6(dst=dst, src=ceaddr), TCP(sport=port)/('X'*900))
137
138 def sendv4udp(src, dst, port):
139     send_packet(IP(dst=dst, src=src), UDP(dport=port)/('X'*900))
140
141 def sendv4tcp(src, dst, port):
142     send_packet(IP(dst=dst, src=src), TCP(dport=port)/('X'*900))
143
144 def sendv6ping(src, dst, id):
145     psid = map.gen_psid(id)
146     ceaddr = str(map.get_mapce_addr(src, psid))
147     dst = str(dmr.embed_6052addr(dst))
148     send_packet(IPv6(dst=dst, src=ceaddr), ICMPv6EchoRequest(id=id, data='A'*500))
149     send_packet(IPv6(dst=dst, src=ceaddr), ICMPv6EchoReply(id=id, data='A'*500))
150
151 def sendv4ping(src, dst, id):
152     send_packet(IP(dst=dst, src=src), ICMP(id=id, type=0)/('X'*500))
153     send_packet(IP(dst=dst, src=src), ICMP(id=id, type=8)/('X'*500))
154
155 def sendv4icmperr(src, dst, type, code, port, inner_src, inner_dst, payload_length):
156     inner = IP(dst=inner_dst, src=inner_src)/TCP(sport=port, dport=8888)/('X'*payload_length)
157     send_packet_frag_inner(IP(dst=dst, src=src)/ICMP(type=type, code=code), IP(dst=inner_dst, src=inner_src), TCP(sport=port, dport=8888)/('X'*payload_length))
158     #send_packet(IP(dst=dst, src=src)/ICMP(type=type, code=code)/inner)
159
160 def sendv6icmperr(src, dst, type, code, port, payload_length):
161     psid = map.gen_psid(port)
162     src = str(map.get_mapce_addr(src, psid))
163     dst = str(dmr.embed_6052addr(dst))
164     inner_header = IPv6(dst=src, src=dst)
165     inner_content = TCP(sport=8888, dport=port)/('X'*payload_length)
166     send_packet_frag_inner(IPv6(dst=dst, src=src)/ICMPv6DestUnreach(type=type, code=code), inner_header, inner_content)
167     #send_packet(IPv6(dst=dst, src=src)/ICMPv6DestUnreach(type=type, code=code)/inner)
168
169 def sendv4icmp_errors(src, dst, port, inner_src, inner_dst, payload_length):
170     for type in ICMP_TYPES_CODES:
171         for code in range(0, ICMP_TYPES_CODES[type] + 1):
172             sendv4icmperr(src, dst, type, code, port, inner_src, inner_dst, payload_length)
173         #sendv4icmperr(src, dst, type, ICMP_TYPES_CODES[type] + 2, port, inner_src, inner_dst, payload_length)
174         #sendv4icmperr(src, dst, type, 255, port, inner_src, inner_dst, payload_length)
175     #sendv4icmperr(src, dst, 1, 0, port, inner_src, inner_dst, payload_length)
176     #sendv4icmperr(src, dst, 2, 10, port, inner_src, inner_dst, payload_length)
177     #sendv4icmperr(src, dst, 255, 255, port, inner_src, inner_dst, payload_length)
178
179     #TODO: Check wrong paramater with different pointer values
180
181 def sendv6icmp_errors(src, dst, port, payload_length):
182     for type in ICMP6_TYPES_CODES:
183         for code in range(0, ICMP6_TYPES_CODES[type] + 1):
184             sendv6icmperr(src, dst, type, code, port, payload_length)
185         #sendv6icmperr(src, dst, type, ICMP6_TYPES_CODES[type] + 2, port, payload_length)
186         #sendv6icmperr(src, dst, type, 255, port, payload_length)
187
188
189 def traffic():
190     delay = 2.0
191     while 1:
192         #sendp(Ether(dst="bb:bb:bb:bb:bb:b4")/IP(dst="20.0.0.1")/UDP(chksum=0)/('X'*900), iface="vpp-tapv4")
193         #sendp(Ether(dst="bb:bb:bb:bb:bb:b6")/IPv6(dst="cccc:bbbb::a000:0001")/ICMPv6EchoRequest()/('X'*900), iface="vpp-tapv6")
194         #sendp(Ether(dst="bb:bb:bb:bb:bb:b6")/IPv6(dst="cccc:bbbb::a000:0001")/UDP()/('X'*900), iface="vpp-tapv6")
195         sendv6udp("20.0.0.1", "10.0.0.1", 12001)
196         sendv6tcp("20.0.0.1", "10.0.0.1", 12002)
197         sendv4udp("10.0.0.1", "20.0.0.1", 12003)
198         sendv4tcp("10.0.0.1", "20.0.0.1", 12004)
199         sendv6ping("20.0.0.1", "10.0.0.1", 12005)
200         sendv4ping("10.0.0.1", "20.0.0.1", 12006)
201         sendv4icmp_errors("10.0.0.1", "20.0.0.1", 12006, "20.0.0.1", "10.0.0.1", 500)
202         sendv4icmp_errors("10.0.0.1", "20.0.0.1", 12006, "20.0.0.1", "10.0.0.1", 1500)
203         sendv6icmp_errors("20.0.0.1", "10.0.0.1", 12006, 500)
204         time.sleep(delay)
205         delay *= 0.9
206
207 if len(sys.argv) <= 1:
208     print("Usage: conf|traffic")
209     exit(1)
210
211 if sys.argv[1] == "conf":
212     print(conf())
213 elif sys.argv[1] == "traffic":
214     traffic()