Пример #1
0
    def send_gre_nsh(self):
        # create a raw socket
        try:
            s = socket.socket(
                socket.AF_INET, socket.SOCK_RAW,
                socket.IPPROTO_GRE)  # set port to GRE encapsulation

        except socket.error as msg:
            print('Socket could not be created. Error Code : ' + str(msg[0]) +
                  ' Message ' + msg[1])
            sys.exit()

        # Building client packet to send to SFF
        packet = build_nsh_eth_header(self.encapsulate_header_values,
                                      self.base_header_values,
                                      self.ctx_header_values,
                                      self.ethernet_values)

        udp_inner_packet = build_udp_packet("172.20.33.195", "10.0.1.1", 10000,
                                            self.dest_port,
                                            "test".encode('utf-8'))
        gre_nsh_ethernet_packet = packet + udp_inner_packet
        logger.info("Sending %s packet to SFF: %s", self.encapsulate_type,
                    self.dest_addr)
        logger.debug("Packet dump: %s",
                     binascii.hexlify(gre_nsh_ethernet_packet))

        s.sendto(gre_nsh_ethernet_packet, (self.dest_addr, 0))
Пример #2
0
 def connection_made(self, transport):
     self.transport = transport
     # Building client packet to send to SFF
     packet = build_nsh_header(self.encapsulate_header_values,
                               self.base_header_values,
                               self.ctx_header_values)
     udp_inner_packet = build_udp_packet(self.inner_header.inner_src_ip,
                                         self.inner_header.inner_dest_ip,
                                         self.inner_header.inner_src_port,
                                         self.inner_header.inner_dest_port,
                                         "test".encode('utf-8'))
     logger.info("Sending %s packet to SFF: %s", self.encapsulate_type,
                 (self.remote_sff_ip, self.remote_sff_port))
     logger.debug("Packet dump: %s", binascii.hexlify(packet))
     # Send the packet
     signal.signal(signal.SIGALRM, self.alarm_handler)
     signal.alarm(2)
     try:
         self.transport.sendto(packet + udp_inner_packet,
                               (self.remote_sff_ip, self.remote_sff_port))
     except socket.error as msg:
         print('Failed to send packet. Error Code : ' + str(msg))
         sys.exit()
     except Exception as e:
         logger.error("Error processing client: %s" % str(e))
Пример #3
0
    def connection_made(self, transport):
        self.transport = transport
        # Building client IP packet to send to SFF
        packet = build_nsh_eth_header(self.encapsulate_header_values,
                                      self.base_header_values,
                                      self.ctx_header_values,
                                      self.ethernet_values)

        # VXLAN header is now built as part of nsh_eth header
        # packet = build_vxlan_header(self.encapsulate_header_values,
        # self.ethernet_values)
        udp_inner_packet = build_udp_packet(self.inner_header.inner_src_ip,
                                            self.inner_header.inner_dest_ip,
                                            self.inner_header.inner_src_port,
                                            self.inner_header.inner_dest_port,
                                            "test".encode('utf-8'))

        gpe_nsh_ethernet_packet = packet + udp_inner_packet
        logger.debug("Ethernet dump: ",
                     binascii.hexlify(gpe_nsh_ethernet_packet))
        logger.info("Sending %s packet to SFF: %s", self.encapsulate_type,
                    (self.remote_sff_ip, self.remote_sff_port))
        # Send the packet
        signal.signal(signal.SIGALRM, self.alarm_handler)
        signal.alarm(5)
        try:
            self.transport.sendto(gpe_nsh_ethernet_packet,
                                  (self.remote_sff_ip, self.remote_sff_port))
        except socket.error as msg:
            print('Failed to send packet. Error Code : ' + str(msg))
            sys.exit()
Пример #4
0
    def connection_made(self, transport):
        self.transport = transport
        # Building client IP packet to send to SFF
        packet = build_nsh_eth_header(self.encapsulate_header_values,
                                      self.base_header_values,
                                      self.ctx_header_values,
                                      self.ethernet_values)

        # VXLAN header is now built as part of nsh_eth header
        # packet = build_vxlan_header(self.encapsulate_header_values,
        # self.ethernet_values)
        udp_inner_packet = build_udp_packet(self.inner_header.inner_src_ip, self.inner_header.inner_dest_ip,
                                            self.inner_header.inner_src_port,
                                            self.inner_header.inner_dest_port, "test".encode('utf-8'))

        gpe_nsh_ethernet_packet = packet + udp_inner_packet
        logger.debug("Ethernet dump: ", binascii.hexlify(gpe_nsh_ethernet_packet))
        logger.info("Sending %s packet to SFF: %s", self.encapsulate_type, (self.remote_sff_ip, self.remote_sff_port))
        # Send the packet
        signal.signal(signal.SIGALRM, self.alarm_handler)
        signal.alarm(5)
        try:
            self.transport.sendto(gpe_nsh_ethernet_packet, (self.remote_sff_ip, self.remote_sff_port))
        except socket.error as msg:
            print('Failed to send packet. Error Code : ' + str(msg))
            sys.exit()
Пример #5
0
 def connection_made(self, transport):
     self.transport = transport
     # Building client packet to send to SFF
     packet = build_nsh_header(self.encapsulate_header_values,
                               self.base_header_values,
                               self.ctx_header_values)
     udp_inner_packet = build_udp_packet(self.inner_header.inner_src_ip, self.inner_header.inner_dest_ip,
                                         self.inner_header.inner_src_port,
                                         self.inner_header.inner_dest_port, "test".encode('utf-8'))
     logger.info("Sending %s packet to SFF: %s", self.encapsulate_type, (self.remote_sff_ip, self.remote_sff_port))
     logger.debug("Packet dump: %s", binascii.hexlify(packet))
     # Send the packet
     signal.signal(signal.SIGALRM, self.alarm_handler)
     signal.alarm(2)
     try:
         self.transport.sendto(packet + udp_inner_packet, (self.remote_sff_ip, self.remote_sff_port))
     except socket.error as msg:
         print('Failed to send packet. Error Code : ' + str(msg))
         sys.exit()
     except Exception as e:
         logger.error("Error processing client: %s" % str(e))
Пример #6
0
    def send_gre_nsh(self):
        # create a raw socket
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_GRE)  # set port to GRE encapsulation

        except socket.error as msg:
            print('Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
            sys.exit()

        # Building client packet to send to SFF
        packet = build_nsh_eth_header(self.encapsulate_header_values,
                                      self.base_header_values,
                                      self.ctx_header_values,
                                      self.ethernet_values)

        udp_inner_packet = build_udp_packet("172.20.33.195", "10.0.1.1", 10000, self.dest_port, "test".encode('utf-8'))
        gre_nsh_ethernet_packet = packet + udp_inner_packet
        logger.info("Sending %s packet to SFF: %s", self.encapsulate_type, self.dest_addr)
        logger.debug("Packet dump: %s", binascii.hexlify(gre_nsh_ethernet_packet))

        s.sendto(gre_nsh_ethernet_packet, (self.dest_addr, 0))
Пример #7
0
def sff_client(argv, message='ping!'):
    # global base_values

    # Some Good defaults
    remote_sff_port = 4790
    local_port = 4790
    remote_sff_ip = "127.0.0.1"
    local_ip = "0.0.0.0"
    sfp_id = 0x000001
    sfp_index = 3
    trace_req = False
    num_trace_hops = 254
    inner_src_ip = "192.168.0.1"
    inner_dest_ip = "192.168.0.2"
    inner_src_port = 10000
    inner_dest_port = 20000
    encapsulate = 'gpe-nsh-ipv4'  # make vxlan-gpe encapsulation default
    ctx1 = ctx2 = ctx3 = ctx4 = 0
    inner_src_eth_list = [0x3c, 0x15, 0xc2, 0xc9, 0x4f, 0xbc]
    inner_dest_eth_list = [0x08, 0x00, 0x27, 0xb6, 0xb0, 0x58]

    try:
        logging.basicConfig(level=logging.INFO)
        opt, args = getopt.getopt(argv, "h", [
            "help", "local-port=", "local-ip=", "inner-src-ip=",
            "inner-dest-ip=", "inner-src-port=", "inner-dest-port=",
            "remote-sff-ip=", "remote-sff-port=", "sfp-id=", "sfp-index=",
            "trace-req", "num-trace-hops=", "encapsulate=", "ctx1=", "ctx2=",
            "ctx3=", "ctx4=", "inner-src-eth=", "inner-dest-eth="
        ])
    except getopt.GetoptError:
        print(
            "sff_client --help | --local-port | --local-ip | --inner-src-ip | --inner-dest-ip | --inner-src-port | "
            "--inner-dest-port | --remote-sff-ip | --ctx1 | --ctx2 | --ctx3 | --ctx4"
            "--remote-sff-port | --sfp-id | --sfp-index | --trace-req | --num-trace-hops | --encapsulate"
            "--inner-src-eth | --inner-dest-eth")
        sys.exit(2)

    for opt, arg in opt:
        if opt == "--remote-sff-port":
            remote_sff_port = arg
            continue

        if opt in ('-h', '--help'):
            print(
                "sff_client \n --remote-sff-ip=<IP address of remote SFF> \n "
                "--remote-sff-port=<UDP port of remote SFF> \n "
                "--sfp-id=<Service Function Path id> \n --sfp-index<SFP starting index> \n "
                "--encapsulate=<gpe-nsh-ethernet|gre|gpe-nsh-ipv4|vxlan-nsh-ethernet-legacy> \n "
                "--inner-src-ip=<source IP of inner packet> \n --inner-dest-ip=<destination IP of inner packet> \n "
                "--ctx1=<context header 1> \n --ctx2=<context header 2> \n --ctx3=<context header 3> \n "
                "--ctx4=<context header 4> \n --local-port=<source port> \n --local-ip=<source IP> \n"
                "--inner-src-eth=<inner src ethernet address> \n --inner-dest-eth=<inner dest ethernet address>"
            )
            sys.exit()

        if opt == "--inner-src-eth":
            inner_src_eth_list = arg.split(':')
            if len(inner_src_eth_list) == ETHERNET_ADDR_SIZE:
                for i, val in enumerate(inner_src_eth_list):
                    inner_src_eth_list[i] = int(val, 16)
            else:
                logger.error(
                    "Ethernet address must be in the form aa:bb:cc:dd:ee:ff")
                sys.exit(2)
            continue

        if opt == "--inner-dest-eth":
            inner_dest_eth_list = arg.split(':')
            if len(inner_dest_eth_list) == ETHERNET_ADDR_SIZE:
                for i, val in enumerate(inner_dest_eth_list):
                    inner_dest_eth_list[i] = int(val, 16)
            else:
                logger.error(
                    "Ethernet address must be in the form aa:bb:cc:dd:ee:ff")
                sys.exit(2)
            continue

        if opt == "--remote-sff-ip":
            remote_sff_ip = arg
            continue

        if opt == "--sfp-id":
            sfp_id = arg
            continue

        if opt == "--sfp-index":
            sfp_index = arg
            continue

        if opt == "--trace-req":
            trace_req = True
            continue

        if opt == "--num-trace-hops":
            num_trace_hops = arg
            continue

        if opt == "--encapsulate":
            encapsulate = arg
            continue

        if opt == "--local-port":
            local_port = int(arg)
            continue

        if opt == "--local-ip":
            local_ip = arg
            continue

        if opt == "--inner-dest-port":
            inner_dest_port = int(arg)
            continue

        if opt == "--inner-dest-ip":
            inner_dest_ip = arg
            continue

        if opt == "--inner-src-port":
            inner_src_port = int(arg)
            continue

        if opt == "--inner-src-ip":
            inner_src_ip = arg
            continue

        if opt == "--ctx1":
            ctx1 = arg
            continue

        if opt == "--ctx2":
            ctx2 = arg
            continue

        if opt == "--ctx3":
            ctx3 = arg
            continue

        if opt == "--ctx4":
            ctx4 = arg
            continue

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    loop = asyncio.get_event_loop()

    # Common initializations for all encapsulations types
    base_header_values = BASEHEADER(service_path=int(sfp_id),
                                    service_index=int(sfp_index),
                                    proto=NSH_NEXT_PROTO_ETH)

    context_headers = process_context_headers(ctx1, ctx2, ctx3, ctx4)

    ctx_values = CONTEXTHEADER(context_headers[0], context_headers[1],
                               context_headers[2], context_headers[3])
    inner_header = InnerHeader(inner_src_ip, inner_dest_ip, inner_src_port,
                               inner_dest_port)

    # NSH type 1
    vxlan_header_values = VXLANGPE()
    #  override encap type
    base_header_values.next_protocol = NSH_NEXT_PROTO_IPV4

    # udpclient = MyVxlanGpeNshIpClient(loop, vxlan_header_values, base_header_values,
    #                                   ctx_values, remote_sff_ip, int(remote_sff_port), inner_header,
    #                                   message=message)
    # start_client(loop, (local_ip, local_port), (remote_sff_ip, remote_sff_port), udpclient)

    packet = build_nsh_header(vxlan_header_values, base_header_values,
                              ctx_values)
    udp_inner_packet = build_udp_packet(inner_header.inner_src_ip,
                                        inner_header.inner_dest_ip,
                                        inner_src_port, inner_dest_port,
                                        message)

    transport = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    logger.debug("Client sending packet to %s",
                 (remote_sff_ip, int(remote_sff_port)))
    try:
        transport.sendto(packet + udp_inner_packet,
                         (remote_sff_ip, int(remote_sff_port)))
        transport.close()
    except socket.error as msg:
        logger.error('Failed to send packet. Error Code : ' + str(msg))
        transport.close()
        sys.exit()
    except Exception as e:
        logger.error("Error processing client: %s" % str(e))
        transport.close()