examples/pipeline: fix VXLAN script permission
[dpdk.git] / examples / pipeline / examples / vxlan_table.py
1 #!/usr/bin/env python3
2 # SPDX-License-Identifier: BSD-3-Clause
3 # Copyright(c) 2020 Intel Corporation
4 #
5
6 """
7 A Python program that generates the VXLAN tunnels for this example.
8 """
9
10 import argparse
11
12 DESCRIPTION = 'Table Generator'
13
14 KEY = '0xaabbccdd{0:04x}'
15 ACTION = 'vxlan_encap'
16 ETHERNET_HEADER = 'ethernet_dst_addr N(0xa0a1a2a3{0:04x}) ' \
17     'ethernet_src_addr N(0xb0b1b2b3{0:04x}) ' \
18     'ethernet_ether_type N(0x0800)'
19 IPV4_HEADER = 'ipv4_ver_ihl N(0x45) ' \
20     'ipv4_diffserv N(0) ' \
21     'ipv4_total_len N(50) ' \
22     'ipv4_identification N(0) ' \
23     'ipv4_flags_offset N(0) ' \
24     'ipv4_ttl N(64) ' \
25     'ipv4_protocol N(17) ' \
26     'ipv4_hdr_checksum N(0x{1:04x}) ' \
27     'ipv4_src_addr N(0xc0c1{0:04x}) ' \
28     'ipv4_dst_addr N(0xd0d1{0:04x})'
29 UDP_HEADER = 'udp_src_port N(0xe0{0:02x}) ' \
30     'udp_dst_port N(4789) ' \
31     'udp_length N(30) ' \
32     'udp_checksum N(0)'
33 VXLAN_HEADER = 'vxlan_flags N(0) ' \
34     'vxlan_reserved N(0) ' \
35     'vxlan_vni N({0:d}) ' \
36     'vxlan_reserved2 N(0)'
37 PORT_OUT = 'port_out H({0:d})'
38
39 def ipv4_header_checksum(i):
40     cksum = (0x4500 + 0x0032) + (0x0000 + 0x0000) + (0x4011 + 0x0000) + (0xc0c1 + i) + (0xd0d1 + i)
41     cksum = (cksum & 0xFFFF) + (cksum >> 16)
42     cksum = (cksum & 0xFFFF) + (cksum >> 16)
43     cksum = ~cksum & 0xFFFF
44     return cksum
45
46 def table_generate(n, p):
47     for i in range(0, n):
48         print("match %s action %s %s %s %s %s %s" %
49               (KEY.format(i), ACTION,
50                ETHERNET_HEADER.format(i),
51                IPV4_HEADER.format(i, ipv4_header_checksum(i)),
52                UDP_HEADER.format(i % 256),
53                VXLAN_HEADER.format(i),
54                PORT_OUT.format(i % p)))
55
56 if __name__ == '__main__':
57     parser = argparse.ArgumentParser(description=DESCRIPTION)
58
59     parser.add_argument(
60         '-n',
61         help='number of table entries (default: 65536)',
62         required=False,
63         default=65536)
64
65     parser.add_argument(
66         '-p',
67         help='number of network ports (default: 4)',
68         required=False,
69         default=4)
70
71     args = parser.parse_args()
72     table_generate(int(args.n), int(args.p))