aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/dev/dev.h11
-rw-r--r--src/vnet/dev/process.c49
2 files changed, 60 insertions, 0 deletions
diff --git a/src/vnet/dev/dev.h b/src/vnet/dev/dev.h
index eb06eeba34e..744dc5ac819 100644
--- a/src/vnet/dev/dev.h
+++ b/src/vnet/dev/dev.h
@@ -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
diff --git a/src/vnet/dev/process.c b/src/vnet/dev/process.c
index 3d3b49c01b6..4df56296444 100644
--- a/src/vnet/dev/process.c
+++ b/src/vnet/dev/process.c
@@ -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;
@@ -51,6 +53,11 @@ typedef struct
} 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;
struct
@@ -65,6 +72,12 @@ typedef struct
} 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;
} call_port_op_no_wait;
@@ -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)