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