dev: _with_ptr process node calls 40/41740/2
authorDamjan Marion <[email protected]>
Wed, 23 Oct 2024 16:38:18 +0000 (18:38 +0200)
committerFlorin Coras <[email protected]>
Wed, 23 Oct 2024 18:41:55 +0000 (18:41 +0000)
Type: improvement
Change-Id: Ib392d74e7629cef5d335e4320a71ceec25ddb020
Signed-off-by: Damjan Marion <[email protected]>
src/vnet/dev/dev.h
src/vnet/dev/process.c

index eb06eeb..744dc5a 100644 (file)
@@ -104,6 +104,11 @@ typedef void (vnet_dev_rx_queue_op_no_rv_t) (vlib_main_t *,
                                             vnet_dev_rx_queue_t *);
 typedef void (vnet_dev_tx_queue_op_no_rv_t) (vlib_main_t *,
                                             vnet_dev_tx_queue_t *);
+typedef vnet_dev_rv_t (vnet_dev_op_with_ptr_t) (vlib_main_t *, vnet_dev_t *,
+                                               void *);
+typedef vnet_dev_rv_t (vnet_dev_port_op_with_ptr_t) (vlib_main_t *,
+                                                    vnet_dev_port_t *,
+                                                    void *);
 
 typedef u16 vnet_dev_queue_id_t;
 typedef u16 vnet_dev_bus_index_t;
@@ -612,6 +617,9 @@ vnet_dev_rv_t vnet_dev_process_call_op (vlib_main_t *, vnet_dev_t *,
                                        vnet_dev_op_t *);
 vnet_dev_rv_t vnet_dev_process_call_op_no_rv (vlib_main_t *, vnet_dev_t *,
                                              vnet_dev_op_no_rv_t *);
+vnet_dev_rv_t vnet_dev_process_call_op_with_ptr (vlib_main_t *, vnet_dev_t *,
+                                                vnet_dev_op_with_ptr_t *,
+                                                void *);
 void vnet_dev_process_call_op_no_wait (vlib_main_t *, vnet_dev_t *,
                                       vnet_dev_op_no_rv_t *);
 vnet_dev_rv_t vnet_dev_process_call_port_op (vlib_main_t *, vnet_dev_port_t *,
@@ -619,6 +627,9 @@ vnet_dev_rv_t vnet_dev_process_call_port_op (vlib_main_t *, vnet_dev_port_t *,
 vnet_dev_rv_t vnet_dev_process_call_port_op_no_rv (vlib_main_t *vm,
                                                   vnet_dev_port_t *,
                                                   vnet_dev_port_op_no_rv_t *);
+vnet_dev_rv_t
+vnet_dev_process_call_port_op_with_ptr (vlib_main_t *, vnet_dev_port_t *,
+                                       vnet_dev_port_op_with_ptr_t *, void *);
 void vnet_dev_process_call_port_op_no_wait (vlib_main_t *, vnet_dev_port_t *,
                                            vnet_dev_port_op_no_rv_t *);
 vnet_dev_rv_t
index 3d3b49c..4df5629 100644 (file)
@@ -20,9 +20,11 @@ typedef enum
   VNET_DEV_EVENT_PROCESS_QUIT,
   VNET_DEV_EVENT_CALL_OP,
   VNET_DEV_EVENT_CALL_OP_NO_RV,
+  VNET_DEV_EVENT_CALL_OP_WITH_PTR,
   VNET_DEV_EVENT_CALL_OP_NO_WAIT,
   VNET_DEV_EVENT_CALL_PORT_OP,
   VNET_DEV_EVENT_CALL_PORT_OP_NO_RV,
+  VNET_DEV_EVENT_CALL_PORT_OP_WITH_PTR,
   VNET_DEV_EVENT_CALL_PORT_OP_NO_WAIT,
   VNET_DEV_EVENT_CLOCK = ~0
 } __clib_packed vnet_dev_event_t;
@@ -50,6 +52,11 @@ typedef struct
       vnet_dev_op_no_rv_t *op;
     } call_op_no_rv;
     struct
+    {
+      vnet_dev_op_with_ptr_t *op;
+      void *ptr;
+    } call_op_with_ptr;
+    struct
     {
       vnet_dev_op_no_rv_t *op;
     } call_op_no_wait;
@@ -64,6 +71,12 @@ typedef struct
       vnet_dev_port_t *port;
     } call_port_op_no_rv;
     struct
+    {
+      vnet_dev_port_op_with_ptr_t *op;
+      vnet_dev_port_t *port;
+      void *ptr;
+    } call_port_op_with_ptr;
+    struct
     {
       vnet_dev_port_op_no_rv_t *op;
       vnet_dev_port_t *port;
@@ -132,6 +145,10 @@ vnet_dev_process_one_event (vlib_main_t *vm, vnet_dev_t *dev,
       ev_log_debug (vm, dev, ed, "call op no rv");
       ed->call_op_no_rv.op (vm, dev);
       break;
+    case VNET_DEV_EVENT_CALL_OP_WITH_PTR:
+      ev_log_debug (vm, dev, ed, "call op woth ptr");
+      rv = ed->call_op_with_ptr.op (vm, dev, ed->call_op_with_ptr.ptr);
+      break;
     case VNET_DEV_EVENT_CALL_OP_NO_WAIT:
       ev_log_debug (vm, dev, ed, "call op no wait");
       ed->call_op_no_wait.op (vm, dev);
@@ -144,6 +161,11 @@ vnet_dev_process_one_event (vlib_main_t *vm, vnet_dev_t *dev,
       ev_log_debug (vm, dev, ed, "call port op no rv");
       ed->call_port_op_no_rv.op (vm, ed->call_port_op_no_rv.port);
       break;
+    case VNET_DEV_EVENT_CALL_PORT_OP_WITH_PTR:
+      ev_log_debug (vm, dev, ed, "call port op woth ptr");
+      rv = ed->call_port_op_with_ptr.op (vm, ed->call_port_op_with_ptr.port,
+                                        ed->call_port_op_with_ptr.ptr);
+      break;
     case VNET_DEV_EVENT_CALL_PORT_OP_NO_WAIT:
       ev_log_debug (vm, dev, ed, "call port op no wait");
       ed->call_port_op_no_wait.op (vm, ed->call_port_op_no_wait.port);
@@ -477,6 +499,19 @@ vnet_dev_process_call_op_no_rv (vlib_main_t *vm, vnet_dev_t *dev,
   return vnet_dev_process_event_send_and_wait (vm, dev, ed);
 }
 
+vnet_dev_rv_t
+vnet_dev_process_call_op_with_ptr (vlib_main_t *vm, vnet_dev_t *dev,
+                                  vnet_dev_op_with_ptr_t *op, void *p)
+{
+  vnet_dev_event_data_t *ed = vnet_dev_event_data_alloc (vm, dev);
+  *ed = (vnet_dev_event_data_t){
+    .event = VNET_DEV_EVENT_CALL_OP_WITH_PTR,
+    .call_op_with_ptr = { .op = op, .ptr = p },
+  };
+
+  return vnet_dev_process_event_send_and_wait (vm, dev, ed);
+}
+
 void
 vnet_dev_process_call_op_no_wait (vlib_main_t *vm, vnet_dev_t *dev,
                                  vnet_dev_op_no_rv_t *op)
@@ -516,6 +551,20 @@ vnet_dev_process_call_port_op_no_rv (vlib_main_t *vm, vnet_dev_port_t *port,
   return vnet_dev_process_event_send_and_wait (vm, port->dev, ed);
 }
 
+vnet_dev_rv_t
+vnet_dev_process_call_port_op_with_ptr (vlib_main_t *vm, vnet_dev_port_t *port,
+                                       vnet_dev_port_op_with_ptr_t *op,
+                                       void *p)
+{
+  vnet_dev_event_data_t *ed = vnet_dev_event_data_alloc (vm, port->dev);
+  *ed = (vnet_dev_event_data_t){
+    .event = VNET_DEV_EVENT_CALL_PORT_OP_WITH_PTR,
+    .call_port_op_with_ptr = { .op = op, .port = port, .ptr = p },
+  };
+
+  return vnet_dev_process_event_send_and_wait (vm, port->dev, ed);
+}
+
 void
 vnet_dev_process_call_port_op_no_wait (vlib_main_t *vm, vnet_dev_port_t *port,
                                       vnet_dev_port_op_no_rv_t *op)