示例#1
0
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)
示例#2
0
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)
示例#3
0
    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
示例#4
0
    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']))
示例#5
0
    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