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