#!/usr/bin/env python """ Script to generate files with n Map-Request packets and n Map-Register packets with EID records increasing sequentially and (optionally) files with n Map-Request packets and n Map-Register packets that have random EIDs Use `./create_lisp_control_plane_pcap.py --help` to see options """ import argparse import netaddr import lisp import random __author__ = "Lori Jakab" __copyright__ = "Copyright (c) 2015, Cisco Systems, Inc." __license__ = "New-style BSD" __email__ = "lojakab@cisco.com" __version__ = "0.0.3" def generate_eids_random(base, n): """Generate n number of EIDs in random order starting from base Args: :param base: A string used as the first EID :param n: An integer, number of EIDs to generate Returns: :return : returns list containing string EIDs """ eids = [] for i in range(0, n): eids.append( str(netaddr.IPAddress(base) + random.randint(0, (n - 1) * increment)) ) return eids def generate_eids_sequential(base, n): """Generate n number of EIDs in sequential order starting from base Args: :param base: A string used as the first EID :param n: An integer, number of EIDs to generate Returns: :return : returns list containing string EIDs """ eids = [] for i in range(0, n): eids.append(str(netaddr.IPAddress(base) + i * increment)) return eids def generate_map_request(eid): """Create a LISP Map-Request packet as a Scapy object Args: :param eid: A string used as the EID record Returns: :return : returns a Scapy Map-Request packet object """ sport1 = random.randint(60000, 65000) sport2 = random.randint(60000, 65000) rnonce = random.randint(0, 2**63) itr_rloc = [lisp.LISP_AFI_Address(address=src_rloc, afi=1)] record = [ lisp.LISP_MapRequestRecord(request_address=eid, request_afi=1, eid_mask_len=32) ] packet = lisp.Ether(dst=dst_mac, src=src_mac) packet /= lisp.IP(dst=dst_rloc, src=src_rloc) packet /= lisp.UDP(sport=sport1, dport=4342) packet /= lisp.LISP_Encapsulated_Control_Message(ptype=8) packet /= lisp.IP(dst=eid, src=src_eid) packet /= lisp.UDP(sport=sport2, dport=4342) packet /= lisp.LISP_MapRequest( nonce=rnonce, request_afi=1, address=src_eid, ptype=1, itr_rloc_records=itr_rloc, request_records=record, ) return packet def generate_map_register(eid, rloc, key_id): """Create a LISP Map-Register packet as a Scapy object Args: :param eid: A string used as the EID record :param rloc: A string used as the RLOC :param key_id: Integer value specifying the authentication type Returns: :return : returns a Scapy Map-Request packet object """ sport1 = random.randint(60000, 65000) rnonce = random.randint(0, 2**63) rlocs = [ lisp.LISP_Locator_Record( priority=1, weight=1, multicast_priority=255, multicast_weight=0, reserved=0, locator_flags=5, locator_afi=1, address=rloc, ) ] record = [ lisp.LISP_MapRecord( record_ttl=1440, locator_count=1, eid_prefix_length=32, action=0, authoritative=1, reserved=0, map_version_number=0, record_afi=1, record_address=eid, locators=rlocs, ) ] packet = lisp.Ether(dst=dst_mac, src=src_mac) packet /= lisp.IP(dst=dst_rloc, src=src_rloc) packet /= lisp.UDP(sport=sport1, dport=4342) packet /= lisp.LISP_MapRegister( ptype=3, nonce=rnonce, register_flags=10, additional_register_flags=1, register_count=1, key_id=key_id, register_records=record, xtr_id_low=netaddr.IPAddress(eid), ) return packet parser = argparse.ArgumentParser(description="Create a Map-Request trace file") parser.add_argument( "--dst-mac", default="00:00:00:00:00:00", help="Map-Request destination MAC address \ (default is 00:00:00:00:00:00)", ) parser.add_argument( "--src-mac", default="00:00:00:00:00:00", help="Map-Request source MAC address \ (default is 00:00:00:00:00:00)", ) parser.add_argument( "--dst-rloc", default="127.0.0.1", help="Send Map-Request to the Map-Server with this RLOC \ (default is 127.0.0.1)", ) parser.add_argument( "--src-rloc", default="127.0.0.1", help="Send Map-Request with this source RLOC \ (default is 127.0.0.1)", ) parser.add_argument( "--src-eid", default="192.0.2.1", help="Send Map-Request with this source EID \ (default is 192.0.2.1)", ) parser.add_argument( "--base-eid", default="10.0.0.0", help="Start incrementing EID from this address \ (default is 10.0.0.0)", ) parser.add_argument( "--requests", type=int, default=1, help="Number of requests to create (default 1)" ) parser.add_argument( "--increment", type=int, default=1, help="Increment EID requests (default 1)" ) parser.add_argument( "--random", type=bool, default=False, help="Create random EID requests (default False)", ) in_args = parser.parse_args() dst_mac = in_args.dst_mac src_mac = in_args.src_mac dst_rloc = in_args.dst_rloc src_rloc = in_args.src_rloc src_eid = in_args.src_eid increment = in_args.increment seq_eids = generate_eids_sequential(in_args.base_eid, in_args.requests) seq_pkts_mreq = [] seq_pkts_mreg = [] seq_pkts_mrga = [] for eid in seq_eids: seq_pkts_mreq.append(generate_map_request(eid)) seq_pkts_mreg.append(generate_map_register(eid, eid, 0)) seq_pkts_mrga.append(generate_map_register(eid, eid, 1)) lisp.wrpcap("encapsulated-map-requests-sequential.pcap", seq_pkts_mreq) lisp.wrpcap("map-registers-sequential-no-auth.pcap", seq_pkts_mreg) lisp.wrpcap("map-registers-sequential-sha1-auth.pcap", seq_pkts_mrga) if in_args.random is True: rand_eids = generate_eids_random(in_args.base_eid, in_args.requests) rand_pkts_mreq = [] rand_pkts_mreg = [] rand_pkts_mrga = [] for eid in rand_eids: rand_pkts_mreq.append(generate_map_request(eid)) rand_pkts_mreg.append(generate_map_register(eid, eid, 0)) rand_pkts_mrga.append(generate_map_register(eid, eid, 1)) lisp.wrpcap("encapsulated-map-requests-random.pcap", rand_pkts_mreq) lisp.wrpcap("map-registers-random-no-auth.pcap", rand_pkts_mreg) lisp.wrpcap("map-registers-random-sha1-auth.pcap", rand_pkts_mreg)