Esempio n. 1
0
def sniffer_thread():
    sniffer_instance = Sniffer(ServerConfig.PACKETIN_IFACE, 1500)

    newPacketIn = PacketInStruct()

    print "Sniffer Thread Started"

    while True:
        pack_data = sniffer_instance.recv_packet_in()
        if pack_data is not False and pack_data[
                0] < 4:  #TODO: Remover "and pack_data[0] < 4", esta aqui para nao capturar outros pacotes na interface de teste
            newPacketIn.packetInResponse = p4runtime_pb2.StreamMessageResponse(
            )
            newPacketIn.packetInResponse.packet.payload = pack_data[2]
            newPacketIn.metadata = newPacketIn.packetInResponse.packet.metadata.add(
            )
            newPacketIn.metadata.metadata_id = pack_data[0]
            newPacketIn.metadata.value = pack_data[1]

            print "Packet-in: interface => server %.9f" % time.time()
            ConnectionArray.sendPacketInToBuffer(newPacketIn)
    def process_streamChannel(self, request_iterator, context):
        peer_key = context.peer()
        userAuthenticated = False
        login = False

        while True:

            try:
                req = next(request_iterator)
            except grpc.RpcError as e:  # End of connection
                if login is not False:
                    ConnectionArray.remove(peer_key)
                return

            if userAuthenticated:
                packet_in = ConnectionArray.getPacketInFromBuffer(
                    login.user_name)
                if packet_in is not False:
                    print "Packet-in: server => controller %.9f" % time.time()
                    yield packet_in.packetInResponse

            # Authentication message.
            if req.HasField(
                    "other"
            ) and req.other.type_url == "type.googleapis.com/Auth":
                ServerConfig.print_debug(
                    "Received authentication message from {}({}):".format(
                        context.peer(),
                        ConnectionArray.getUsername(context.peer())))
                ServerConfig.print_debug(req)

                # Add the connection to the pool.
                login = auth_pb2.Auth.FromString(req.other.value)
                ConnectionArray.add(peer_key, login.user_name)
                username = ConnectionArray.getUsername(context.peer())

                # Authenticate the current connection if it isn't authenticated yet.
                # Keep in mind that an user with the CONNECTED state is not authenticated.
                if ConnectionArray.isConnected(context.peer()) is True:
                    if Auth.authenticate(login.user_name,
                                         login.passwd) is True:
                        userAuthenticated = True
                        ConnectionArray.authenticate(context.peer())
                    else:
                        context.set_code(grpc.StatusCode.PERMISSION_DENIED)
                        context.set_details("Invalid username or password")
                        yield p4runtime_pb2.StreamMessageResponse()

                # TODO: send authentication success message for testing purposes.
                succ = auth_pb2.Auth()
                succ.user_name = "Auth success"
                succ.passwd = ""
                resp = p4runtime_pb2.StreamMessageResponse()
                resp.other.Pack(succ)
                yield resp

            # Arbitration update.
            elif req.HasField("arbitration"):
                ServerConfig.print_debug(
                    "Received master arbitration message from peer '{}' ({}):".
                    format(context.peer(),
                           ConnectionArray.getUsername(context.peer())))
                ServerConfig.print_debug(req)
                yield RPC_mgmt.MasterArbitration(self, req, context)

            # Packet-out message.
            elif req.HasField("packet"):
                print req
                packet = req.packet
                print "Packet-out: controller => server %.9f" % time.time()
                ServerConfig.print_debug(
                    "Packet-out arrived from the controller, for switch {} input port {}"
                    .format(packet.metadata[0].metadata_id,
                            hexlify(packet.metadata[0].value)))
                # print "Payload: {}".format(hexlify(packet.payload)) # we need to be quick
                RPC_mgmt.ProcessPacketOut(packet)
Esempio n. 3
0
 def __init__(self):
     self.packetInResponse = p4runtime_pb2.StreamMessageResponse()
     self.packetInResponse.packet.payload = " "
     self.metadata = self.packetInResponse.packet.metadata.add()
     self.metadata.metadata_id = 0
     self.metadata.value = " "
 def MasterArbitration(self, request, context):
     resp = p4runtime_pb2.StreamMessageResponse()
     resp.arbitration.CopyFrom(request.arbitration)
     resp.arbitration.status.code = code_pb2.OK
     return resp