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