Hello, I'm a developer interested in the VPP project. I have wrote my first
plugin for VPP, mostly in educational purposes. At now it can show used
protocols, headers information and payload on input and output.
I have some trouble with understanding VPP API. Please, help me to
understand it correctly in the case of writing a multi architectural
(IPv4/IPv6) plugin. I've quoted the parts of code below:
Defining the nodes and it's functions... it's ok no problem, no questions,
just for info:
vlib_node_registration_t probe_output_ip4_node;
vlib_node_registration_t probe_output_ip6_node;
static uword probe_output_ip4_node_fn (
vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
{
.....
}
static uword probe_output_ip6_node_fn (
vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
{
.....
}
This macro defines the node name and it's place in the graph. Right?
VNET_FEATURE_INIT (probe_output_ip4_feat, static) = {
.arc_name = "ip4-output",
I've got this suitable 'arc_name' from other source codes.
Where I can get the comlete list of arc_names with description?
.node_name = "data-probe-output-ip4",
.runs_before = VNET_FEATURES ("interface-output"),
};
VNET_FEATURE_INIT (probe_output_ip6_feat, static) = {
.arc_name = "ip6-output",
.node_name = "data-probe-output-ip6",
.runs_before = VNET_FEATURES ("interface-output"),
};
Node registration. What is the "vector_size' and what for? Where I can read
about other node types? What is the type of next_nodes parameter? Is there
a way to assign an array of the node names (static char * arr[][]) to this
variable? What a function of sibling_of parameter? Am I use it correctly?
VLIB_REGISTER_NODE (probe_output_ip4_node) = {
.function = probe_output_ip4_node_fn,
.name = "data-probe-output-ip4",
.vector_size = sizeof (u32),
.format_trace = format_probe_trace,
.type = VLIB_NODE_TYPE_INTERNAL,
...
.next_nodes = { [PROBE_NEXT_INTERFACE_OUTPUT] = "interface-output"
},
};
VLIB_REGISTER_NODE (probe_output_ip6_node) = {
.function = probe_output_ip6_node_fn,
.name = "data-probe-output-ip6",
...
.sibling_of = "data-probe-output-ip4",
};
I can't find any information about the macros below. What for is it?
VLIB_NODE_FUNCTION_MULTIARCH (probe_output_ip4_node,
probe_output_ip4_node_fn)
VLIB_NODE_FUNCTION_MULTIARCH (probe_output_ip6_node,
probe_output_ip6_node_fn)
Load the nodes. Can I use one node to work with both of IPv4 and IPv6
protocols? For example, can I register the node after interface-output,
before interface-tx?
vnet_feature_enable_disable ("ip4-output", "data-probe-output-ip4",
sw_if_index, enable_disable, 0, 0);
vnet_feature_enable_disable ("ip6-output", "data-probe-output-ip6",
sw_if_index, enable_disable, 0, 0);
Many thanks in advance!
Full plugin's code placed here:
https://github.com/xxald/vpp-probe