xref: /freebsd/tests/sys/netinet6/ra.py (revision e2afbc45258f2fa4bdcf126e959ac660e76fc802)
1#
2# SPDX-License-Identifier: BSD-2-Clause
3#
4# Copyright (c) 2024 Klara, Inc.
5#
6
7import argparse
8import scapy.all as sp
9import sys
10
11
12#
13# Emit a router advertisement with the specified prefix.
14#
15def main():
16    parser = argparse.ArgumentParser("ra.py",
17                                     description="Emits Router Advertisement packets")
18    parser.add_argument('--sendif', nargs=1, required=True,
19                        help='The interface through which the packet will be sent')
20    parser.add_argument('--src', nargs=1, required=True,
21                        help='The source IP address')
22    parser.add_argument('--dst', nargs=1, required=True,
23                        help='The destination IP address')
24    parser.add_argument('--prefix', nargs=1, required=True,
25                        help='The prefix to be advertised')
26    parser.add_argument('--prefixlen', nargs=1, required=True, type=int,
27                        help='The prefix length to be advertised')
28    parser.add_argument('--validlifetime', nargs=1, required=False,
29                        type=int, default=4294967295,
30                        help='The valid lifetime of the prefix')
31    parser.add_argument('--preferredlifetime', nargs=1, required=False,
32                        type=int, default=4294967295,
33                        help='The preferred lifetime of the prefix')
34
35    args = parser.parse_args()
36    pkt = sp.Ether() / \
37        sp.IPv6(src=args.src, dst=args.dst) / \
38        sp.ICMPv6ND_RA(chlim=64) / \
39        sp.ICMPv6NDOptPrefixInfo(prefix=args.prefix,
40                                 prefixlen=args.prefixlen,
41                                 validlifetime=args.validlifetime,
42                                 preferredlifetime=args.preferredlifetime)
43
44    sp.sendp(pkt, iface=args.sendif[0], verbose=False)
45    sys.exit(0)
46
47
48if __name__ == '__main__':
49    main()
50