mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 18:07:40 +00:00
net_pcap is not always available in DPDK (like, in a dev environment when you forgot to install the libpcap-devel). On the other hand, OVS already has its own way to inject packets into a bridge. Let's make use of it. The generating script outputs a bulk of 8 packets per line (to save some cpu spent calling ovs-appctl). Suggested-by: Ilya Maximets <i.maximets@ovn.org> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: David Marchand <david.marchand@redhat.com> Signed-off-by: Simon Horman <horms@ovn.org>
85 lines
3.1 KiB
Python
Executable File
85 lines
3.1 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import sys
|
|
import warnings
|
|
|
|
try:
|
|
from cryptography.utils import CryptographyDeprecationWarning
|
|
warnings.filterwarnings(
|
|
"ignore",
|
|
category=CryptographyDeprecationWarning,
|
|
message=r"(blowfish|cast5)",
|
|
)
|
|
except ModuleNotFoundError:
|
|
pass
|
|
|
|
# flake8: noqa: E402
|
|
from scapy.all import RandMAC, RandIP, PcapWriter, RandIP6, RandShort, fuzz
|
|
from scapy.all import IPv6, Dot1Q, IP, Ether, UDP, TCP, random
|
|
|
|
# The number of packets generated will be size * 8.
|
|
size = int(sys.argv[1])
|
|
# Traffic option is used to choose between fuzzy or simple packet type.
|
|
if len(sys.argv) > 2:
|
|
traffic_opt = str(sys.argv[2])
|
|
else:
|
|
traffic_opt = ""
|
|
|
|
for i in range(0, size):
|
|
pkt = []
|
|
|
|
if traffic_opt == "fuzzy":
|
|
|
|
eth = Ether(src=RandMAC(), dst=RandMAC())
|
|
vlan = Dot1Q()
|
|
ipv4 = IP(src=RandIP(), dst=RandIP(), len=random.randint(0, 100))
|
|
ipv6 = IPv6(src=RandIP6(), dst=RandIP6(), plen=random.randint(0, 100))
|
|
udp = UDP(dport=RandShort(), sport=RandShort())
|
|
tcp = TCP(dport=RandShort(), sport=RandShort(), flags='S',
|
|
dataofs=random.randint(0, 15))
|
|
|
|
# IPv4 packets with fuzzing
|
|
pkt.append(fuzz(eth / ipv4 / udp).build().hex())
|
|
pkt.append(fuzz(eth / ipv4 / tcp).build().hex())
|
|
pkt.append(fuzz(eth / vlan / ipv4 / udp).build().hex())
|
|
pkt.append(fuzz(eth / vlan / ipv4 / tcp).build().hex())
|
|
|
|
# IPv6 packets with fuzzing
|
|
pkt.append(fuzz(eth / ipv6 / udp).build().hex())
|
|
pkt.append(fuzz(eth / ipv6 / tcp).build().hex())
|
|
pkt.append(fuzz(eth / vlan / ipv6 / udp).build().hex())
|
|
pkt.append(fuzz(eth / vlan / ipv6 / tcp).build().hex())
|
|
|
|
else:
|
|
mac_addr_src = "52:54:00:FF:FF:{:02X}".format(i % 0xff)
|
|
mac_addr_dst = "80:FF:FF:FF:FF:{:02X}".format(i % 0xff)
|
|
eth = Ether(src=mac_addr_src, dst=mac_addr_dst)
|
|
vlan = Dot1Q(vlan=(i % 10))
|
|
# IPv4 address range limits to 255 and IPv6 limit to 65535
|
|
ipv4_addr_src = "192.168.150." + str((i % 255))
|
|
ipv4_addr_dst = "200.100.198." + str((i % 255))
|
|
ipv6_addr_src = "2001:0db8:85a3:0000:0000:8a2e:0370:{:04x}" \
|
|
.format(i % 0xffff)
|
|
ipv6_addr_dst = "3021:ffff:85a3:ffff:0000:8a2e:0480:{:04x}" \
|
|
.format(i % 0xffff)
|
|
ipv4 = IP(src=ipv4_addr_src, dst=ipv4_addr_dst)
|
|
ipv6 = IPv6(src=ipv6_addr_src, dst=ipv6_addr_dst)
|
|
src_port = 200 + (i % 20)
|
|
dst_port = 1000 + (i % 20)
|
|
udp = UDP(dport=src_port, sport=dst_port)
|
|
tcp = TCP(dport=src_port, sport=dst_port, flags='S')
|
|
|
|
# IPv4 packets
|
|
pkt.append((eth / ipv4 / udp).build().hex())
|
|
pkt.append((eth / ipv4 / tcp).build().hex())
|
|
pkt.append((eth / vlan / ipv4 / udp).build().hex())
|
|
pkt.append((eth / vlan / ipv4 / tcp).build().hex())
|
|
|
|
# IPv6 packets
|
|
pkt.append((eth / ipv6 / udp).build().hex())
|
|
pkt.append((eth / ipv6 / tcp).build().hex())
|
|
pkt.append((eth / vlan / ipv6 / udp).build().hex())
|
|
pkt.append((eth / vlan / ipv6 / tcp).build().hex())
|
|
|
|
print(' '.join(pkt))
|