Attach to VPP.
(self, name, event_queue)
| 418 | return 0 |
| 419 | |
| 420 | async def connect(self, name, event_queue): |
| 421 | """Attach to VPP.""" |
| 422 | try: |
| 423 | reader, writer = await asyncio.open_unix_connection(self.server_address) |
| 424 | except (PermissionError, FileNotFoundError): |
| 425 | return -1 |
| 426 | self.reader = reader |
| 427 | self.writer = writer |
| 428 | |
| 429 | # Initialise sockclnt_create |
| 430 | sockclnt_create = self.messages["sockclnt_create"] |
| 431 | sockclnt_create_reply = self.messages["sockclnt_create_reply"] |
| 432 | |
| 433 | args = {"_vl_msg_id": 15, "name": name, "context": 124} |
| 434 | b = sockclnt_create.pack(args) |
| 435 | # Send header |
| 436 | hdr = self.header_struct.pack(0, len(b), 0) |
| 437 | writer.write(hdr) |
| 438 | writer.write(b) |
| 439 | await writer.drain() |
| 440 | hdr = await reader.readexactly(16) |
| 441 | _, hdrlen, _ = self.header_struct.unpack(hdr) # If at head of message |
| 442 | msg = await reader.readexactly(hdrlen) |
| 443 | header2 = VPPType("header", [["u16", "msgid"], ["u32", "client_index"]]) |
| 444 | hdr, _ = header2.unpack(msg, 0) |
| 445 | if hdr.msgid != 16: |
| 446 | # TODO: Add first numeric argument. |
| 447 | raise IOError("Invalid reply message") |
| 448 | |
| 449 | r, length = sockclnt_create_reply.unpack(msg) |
| 450 | self.socket_index = r.index |
| 451 | for m in r.message_table: |
| 452 | n = m.name |
| 453 | self.message_table[n] = m.index |
| 454 | # Find the maximum index of the message table |
| 455 | self.vpp_dictionary_maxid = max(self.message_table.values() or [0]) |
| 456 | |
| 457 | # self.worker_task = asyncio.create_task(self.message_handler(event_queue)) |
| 458 | requests = {} |
| 459 | self.queue_task = asyncio.create_task(self.queue_worker(requests)) |
| 460 | self.socket_task = asyncio.create_task( |
| 461 | self.socket_reader(requests, event_queue) |
| 462 | ) |
| 463 | |
| 464 | # Register the functions we have (memclnt.json) |
| 465 | await self.get_api_definitions() |
| 466 | |
| 467 | self._register_functions() |
| 468 | |
| 469 | # Initialise control ping |
| 470 | crc = self.messages["control_ping"].crc |
| 471 | self.control_ping_index = self.get_msg_index(("control_ping" + "_" + crc[2:])) |
| 472 | self.control_ping_msgdef = self.messages["control_ping"] |
| 473 | |
| 474 | return 0 |
| 475 | |
| 476 | async def disconnect(self): |
| 477 | """Detach from VPP.""" |
nothing calls this directly
no test coverage detected