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:
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
16 from scapy.all import *
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"
32 def mac_to_vppmac(mac):
33 mac = mac.replace(':', '')
34 return mac[0:4]+"."+mac[4:8]+"."+mac[8:12]
37 map = mapalgs.MapCalc( rulev6 = 'bbbb::/32',
38 rulev4 = '20.0.0.0/24',
41 dmr = mapalgs.DmrCalc('cccc:bbbb::/96')
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"
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"
84 c += " mtu "+str(map_mtu)
86 c += " ip6-src cccc:bbbb::/96 map-t"
88 c += " ip6-src cccc:bbbb::ffff"
93 def send_packet(ip_header, ip_content):
96 if ip_header.version == 4:
97 frags = fragment(ip_header/ip_content, fragsize=fragsize)
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)
104 print("Fragmented IPv6 packet")
105 sendp(Ether(dst=vpp_mac, src=loc_v6_mac)/f, iface=ifname)
107 sendp(Ether(dst=vpp_mac)/ip_header/ip_content, iface=ifname)
109 def send_packet_frag_inner(packet, inner_header, inner_content):
110 print("Send packet with inner ICMP packet")
112 if packet.version == 4:
113 frags = fragment(inner_header/inner_content, fragsize=fragsize)
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)
120 print("Fragmented IPv6 inner packet")
121 sendp(Ether(dst=vpp_mac, src=loc_v6_mac)/packet/f, iface=ifname)
123 sendp(Ether(dst=vpp_mac)/packet/inner_header/inner_content, iface=ifname)
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))
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))
138 def sendv4udp(src, dst, port):
139 send_packet(IP(dst=dst, src=src), UDP(dport=port)/('X'*900))
141 def sendv4tcp(src, dst, port):
142 send_packet(IP(dst=dst, src=src), TCP(dport=port)/('X'*900))
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))
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))
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)
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)
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)
179 #TODO: Check wrong paramater with different pointer values
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)
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)
207 if len(sys.argv) <= 1:
208 print("Usage: conf|traffic")
211 if sys.argv[1] == "conf":
213 elif sys.argv[1] == "traffic":