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))
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))
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()
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))
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()