from socket import socket, AF_UNIX, SOCK_DGRAM from select import select from time import time from struct import unpack, calcsize from util import ppc from scapy.layers.l2 import Ether client_uds_socket_name = "client-uds-socket" vpp_uds_socket_name = "vpp-uds-socket" VPP_PUNT_HEADER_FMT = '=Ii' VPP_PUNT_HEADER_SIZE = calcsize(VPP_PUNT_HEADER_FMT) class VppPuntAction: PUNT_L2 = 0 PUNT_IP4_ROUTED = 1 PUNT_IP6_ROUTED = 2 class VppUDSPuntSocket(object): def __init__(self, testcase, port, is_ip4=1, l4_protocol=0x11): client_path = '%s/%s-%s-%s' % (testcase.tempdir, client_uds_socket_name, "4" if is_ip4 else "6", port) testcase.vapi.punt_socket_register( port, client_path, is_ip4=is_ip4, l4_protocol=l4_protocol) self.testcase = testcase self.uds = socket(AF_UNIX, SOCK_DGRAM) self.uds.bind(client_path) self.uds.connect(testcase.punt_socket_path) def wait_for_packets(self, count, timeout=1): packets = [] now = time() deadline = now + timeout while len(packets) < count and now < deadline: r, w, e = select([self.uds], [], [self.uds], deadline - now) if self.uds in r: x = self.uds.recv(1024 * 1024) sw_if_index, punt_action = unpack( VPP_PUNT_HEADER_FMT, x[:VPP_PUNT_HEADER_SIZE]) packets.append({'sw_if_index': sw_if_index, 'punt_action': punt_action, 'packet': x[VPP_PUNT_HEADER_SIZE:]}) if self.uds in e: raise Exception("select() indicates error on UDS socket") now = time() if len(packets) != count: raise Exception("Unexpected packet count received, got %s packets," " expected %s packets" % (len(packets), count)) self.testcase.logger.debug( "Got %s packets via punt socket" % len(packets)) return packets def assert_nothing_captured(self, timeout=.25): packets = [] now = time() deadline = now + timeout while now < deadline: r, w, e = select([self.uds], [], [self.uds], deadline - now) if self.uds in r: x = self.uds.recv(1024 * 1024) packets.append(Ether(x[VPP_PUNT_HEADER_SIZE:])) if self.uds in e: raise Exception("select() indicates error on UDS socket") now = time() if len(packets) > 0: self.testcase.logger.error( ppc("Unexpected packets captured:", packets)) raise Exception("Unexpected packet count received, got %s packets," " expected no packets" % len(packets))