def process_and_accept(packet): packet.accept() data = packet.get_payload() address = int(binascii.hexlify(data[16:20]), 16) lookup = socket.inet_ntoa(struct.pack(">I", address)) try: if classify_map[lookup]['sff'] != '': packet = build_packet(vxlan_values, base_values, ctx_values) + data logger.info(binascii.hexlify(data)) logger.info(binascii.hexlify(packet)) UDP_IP = classify_map[lookup]['sff'] UDP_PORT = int(classify_map[lookup]['port']) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: sock.sendto(packet, (UDP_IP, UDP_PORT)) if __debug__ is False: logger.debug('Sending NSH encapsulated packet to SFF: %s', UDP_IP) except socket.error as exc: logger.exception('Socket Error: %s', exc) finally: sock.close() except KeyError as exc: logger.exception('Classification failed: %s', exc)
def process_packet(self, orig_packet): # check if not self._fw_params_set: logger.error( 'process_packet: Forwarding params not set for ' 'path_id=%d', self.path_id) return if not self._tun_params_set: logger.error( 'process_packet: Tunnel params not set for ' 'path_id=%d', self.path_id) return logger.debug('process_packet: Forwarding packet to %s:%d', self.sff_ip_addr, self.sff_port) orig_payload = orig_packet.get_payload() vxlan_packet = build_packet(self.vxlan_values, self.base_values, self.ctx_values) + orig_payload self.socket.sendto(vxlan_packet, (self.sff_ip_addr, self.sff_port)) # ! drop original packet orig_packet.drop() return
def forward_packet(self, packet, rsp_id, ipv): """ Encapsulate given packet with NSH and forward it to SFF related with currently matched RSP :param packet: packet to process :type packet: `:class:netfilterqueue.Packet` :param rsp_id: RSP identifier :type rsp_id: int :param ipv: IP version :type ipv: int """ fwd_to = self.rsp_2_sff[rsp_id]['sff'] next_protocol = ipv_2_next_protocol[ipv] # NOTES: # so far metadata are not supported -> just sending an empty ctx_header # tunnel_id (0x0500) is hard-coded, will it be always the same? ctx_header = CONTEXTHEADER(network_shared=0, service_shared=0, network_platform=0, service_platform=0) vxlan_header = VXLANGPE(vni=0x0500, reserved=0, reserved2=64, protocol_type=0x894F, flags=int('00000100', 2)) base_header = BASEHEADER(length=0x6, version=0x1, md_type=0x1, service_path=rsp_id, flags=int('00000000', 2), next_protocol=next_protocol, service_index=fwd_to['starting-index']) nsh_encapsulation = build_packet(vxlan_header, base_header, ctx_header) nsh_packet = nsh_encapsulation + packet.get_payload() self.fwd_socket.sendto(nsh_packet, (fwd_to['ip'], fwd_to['port']))
def process_packet(self, orig_packet): # check if not self._fw_params_set: logger.error('process_packet: Forwarding params not set for ' 'path_id=%d', self.path_id) return if not self._tun_params_set: logger.error('process_packet: Tunnel params not set for ' 'path_id=%d', self.path_id) return logger.debug('process_packet: Forwarding packet to %s:%d', self.sff_ip_addr, self.sff_port) orig_payload = orig_packet.get_payload() vxlan_packet = build_packet(self.vxlan_values, self.base_values, self.ctx_values) + orig_payload self.socket.sendto(vxlan_packet, (self.sff_ip_addr, self.sff_port)) # ! drop original packet orig_packet.drop() return