4 * Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 #include <rte_common.h>
41 #include <rte_malloc.h>
43 #include <rte_byteorder.h>
44 #include <rte_table_lpm.h>
45 #include <rte_table_hash.h>
46 #include <rte_pipeline.h>
48 #include "pipeline_routing_be.h"
49 #include "pipeline_actions_common.h"
50 #include "hash_func.h"
52 struct pipeline_routing {
54 pipeline_msg_req_handler custom_handlers[PIPELINE_ROUTING_MSG_REQS];
57 uint32_t n_arp_entries;
58 uint32_t ip_da_offset;
59 uint32_t arp_key_offset;
60 } __rte_cache_aligned;
63 pipeline_routing_msg_req_custom_handler(struct pipeline *p, void *msg);
65 static pipeline_msg_req_handler handlers[] = {
66 [PIPELINE_MSG_REQ_PING] =
67 pipeline_msg_req_ping_handler,
68 [PIPELINE_MSG_REQ_STATS_PORT_IN] =
69 pipeline_msg_req_stats_port_in_handler,
70 [PIPELINE_MSG_REQ_STATS_PORT_OUT] =
71 pipeline_msg_req_stats_port_out_handler,
72 [PIPELINE_MSG_REQ_STATS_TABLE] =
73 pipeline_msg_req_stats_table_handler,
74 [PIPELINE_MSG_REQ_PORT_IN_ENABLE] =
75 pipeline_msg_req_port_in_enable_handler,
76 [PIPELINE_MSG_REQ_PORT_IN_DISABLE] =
77 pipeline_msg_req_port_in_disable_handler,
78 [PIPELINE_MSG_REQ_CUSTOM] =
79 pipeline_routing_msg_req_custom_handler,
83 pipeline_routing_msg_req_route_add_handler(struct pipeline *p,
87 pipeline_routing_msg_req_route_del_handler(struct pipeline *p,
91 pipeline_routing_msg_req_route_add_default_handler(struct pipeline *p,
95 pipeline_routing_msg_req_route_del_default_handler(struct pipeline *p,
99 pipeline_routing_msg_req_arp_add_handler(struct pipeline *p,
103 pipeline_routing_msg_req_arp_del_handler(struct pipeline *p,
107 pipeline_routing_msg_req_arp_add_default_handler(struct pipeline *p,
111 pipeline_routing_msg_req_arp_del_default_handler(struct pipeline *p,
114 static pipeline_msg_req_handler custom_handlers[] = {
115 [PIPELINE_ROUTING_MSG_REQ_ROUTE_ADD] =
116 pipeline_routing_msg_req_route_add_handler,
117 [PIPELINE_ROUTING_MSG_REQ_ROUTE_DEL] =
118 pipeline_routing_msg_req_route_del_handler,
119 [PIPELINE_ROUTING_MSG_REQ_ROUTE_ADD_DEFAULT] =
120 pipeline_routing_msg_req_route_add_default_handler,
121 [PIPELINE_ROUTING_MSG_REQ_ROUTE_DEL_DEFAULT] =
122 pipeline_routing_msg_req_route_del_default_handler,
123 [PIPELINE_ROUTING_MSG_REQ_ARP_ADD] =
124 pipeline_routing_msg_req_arp_add_handler,
125 [PIPELINE_ROUTING_MSG_REQ_ARP_DEL] =
126 pipeline_routing_msg_req_arp_del_handler,
127 [PIPELINE_ROUTING_MSG_REQ_ARP_ADD_DEFAULT] =
128 pipeline_routing_msg_req_arp_add_default_handler,
129 [PIPELINE_ROUTING_MSG_REQ_ARP_DEL_DEFAULT] =
130 pipeline_routing_msg_req_arp_del_default_handler,
136 struct routing_table_entry {
137 struct rte_pipeline_table_entry head;
139 uint32_t port_id; /* Output port ID */
140 uint32_t ip; /* Next hop IP address (only valid for remote routes) */
145 struct rte_mbuf *pkt,
146 struct rte_pipeline_table_entry *table_entry,
149 struct routing_table_entry *entry =
150 (struct routing_table_entry *) table_entry;
151 struct pipeline_routing *p_rt = arg;
153 struct pipeline_routing_arp_key_ipv4 *arp_key =
154 (struct pipeline_routing_arp_key_ipv4 *)
155 RTE_MBUF_METADATA_UINT8_PTR(pkt, p_rt->arp_key_offset);
156 uint32_t ip = RTE_MBUF_METADATA_UINT32(pkt, p_rt->ip_da_offset);
158 arp_key->port_id = entry->port_id;
159 arp_key->ip = entry->ip;
160 if (entry->flags & PIPELINE_ROUTING_ROUTE_LOCAL)
166 struct rte_mbuf **pkts,
167 struct rte_pipeline_table_entry **table_entries,
170 struct routing_table_entry *entry0 =
171 (struct routing_table_entry *) table_entries[0];
172 struct routing_table_entry *entry1 =
173 (struct routing_table_entry *) table_entries[1];
174 struct routing_table_entry *entry2 =
175 (struct routing_table_entry *) table_entries[2];
176 struct routing_table_entry *entry3 =
177 (struct routing_table_entry *) table_entries[3];
178 struct pipeline_routing *p_rt = arg;
180 struct pipeline_routing_arp_key_ipv4 *arp_key0 =
181 (struct pipeline_routing_arp_key_ipv4 *)
182 RTE_MBUF_METADATA_UINT8_PTR(pkts[0], p_rt->arp_key_offset);
183 struct pipeline_routing_arp_key_ipv4 *arp_key1 =
184 (struct pipeline_routing_arp_key_ipv4 *)
185 RTE_MBUF_METADATA_UINT8_PTR(pkts[1], p_rt->arp_key_offset);
186 struct pipeline_routing_arp_key_ipv4 *arp_key2 =
187 (struct pipeline_routing_arp_key_ipv4 *)
188 RTE_MBUF_METADATA_UINT8_PTR(pkts[2], p_rt->arp_key_offset);
189 struct pipeline_routing_arp_key_ipv4 *arp_key3 =
190 (struct pipeline_routing_arp_key_ipv4 *)
191 RTE_MBUF_METADATA_UINT8_PTR(pkts[3], p_rt->arp_key_offset);
193 uint32_t ip0 = RTE_MBUF_METADATA_UINT32(pkts[0], p_rt->ip_da_offset);
194 uint32_t ip1 = RTE_MBUF_METADATA_UINT32(pkts[1], p_rt->ip_da_offset);
195 uint32_t ip2 = RTE_MBUF_METADATA_UINT32(pkts[2], p_rt->ip_da_offset);
196 uint32_t ip3 = RTE_MBUF_METADATA_UINT32(pkts[3], p_rt->ip_da_offset);
198 arp_key0->port_id = entry0->port_id;
199 arp_key1->port_id = entry1->port_id;
200 arp_key2->port_id = entry2->port_id;
201 arp_key3->port_id = entry3->port_id;
203 arp_key0->ip = entry0->ip;
204 if (entry0->flags & PIPELINE_ROUTING_ROUTE_LOCAL)
207 arp_key1->ip = entry1->ip;
208 if (entry1->flags & PIPELINE_ROUTING_ROUTE_LOCAL)
211 arp_key2->ip = entry2->ip;
212 if (entry2->flags & PIPELINE_ROUTING_ROUTE_LOCAL)
215 arp_key3->ip = entry3->ip;
216 if (entry3->flags & PIPELINE_ROUTING_ROUTE_LOCAL)
220 PIPELINE_TABLE_AH_HIT(routing_table_ah_hit,
227 struct arp_table_entry {
228 struct rte_pipeline_table_entry head;
234 struct rte_mbuf *pkt,
235 struct rte_pipeline_table_entry *table_entry,
236 __rte_unused void *arg)
238 struct arp_table_entry *entry = (struct arp_table_entry *) table_entry;
240 /* Read: pkt buffer - mbuf */
241 uint8_t *raw = rte_pktmbuf_mtod(pkt, uint8_t *);
243 /* Read: table entry */
244 uint64_t mac_addr_dst = entry->macaddr;
245 uint64_t mac_addr_src = 0;
247 /* Compute: Ethernet header */
248 uint64_t slab0 = mac_addr_dst | (mac_addr_src << 48);
249 uint32_t slab1 = mac_addr_src >> 16;
251 /* Write: pkt buffer - pkt headers */
252 *((uint64_t *) raw) = slab0;
253 *((uint32_t *) (raw + 8)) = slab1;
258 struct rte_mbuf **pkts,
259 struct rte_pipeline_table_entry **table_entries,
260 __rte_unused void *arg)
262 struct arp_table_entry *entry0 =
263 (struct arp_table_entry *) table_entries[0];
264 struct arp_table_entry *entry1 =
265 (struct arp_table_entry *) table_entries[1];
266 struct arp_table_entry *entry2 =
267 (struct arp_table_entry *) table_entries[2];
268 struct arp_table_entry *entry3 =
269 (struct arp_table_entry *) table_entries[3];
271 /* Read: pkt buffer - mbuf */
272 uint8_t *raw0 = rte_pktmbuf_mtod(pkts[0], uint8_t *);
273 uint8_t *raw1 = rte_pktmbuf_mtod(pkts[1], uint8_t *);
274 uint8_t *raw2 = rte_pktmbuf_mtod(pkts[2], uint8_t *);
275 uint8_t *raw3 = rte_pktmbuf_mtod(pkts[3], uint8_t *);
277 /* Read: table entry */
278 uint64_t mac_addr_dst0 = entry0->macaddr;
279 uint64_t mac_addr_dst1 = entry1->macaddr;
280 uint64_t mac_addr_dst2 = entry2->macaddr;
281 uint64_t mac_addr_dst3 = entry3->macaddr;
283 uint64_t mac_addr_src0 = 0;
284 uint64_t mac_addr_src1 = 0;
285 uint64_t mac_addr_src2 = 0;
286 uint64_t mac_addr_src3 = 0;
288 /* Compute: Ethernet header */
289 uint64_t pkt0_slab0 = mac_addr_dst0 | (mac_addr_src0 << 48);
290 uint64_t pkt1_slab0 = mac_addr_dst1 | (mac_addr_src1 << 48);
291 uint64_t pkt2_slab0 = mac_addr_dst2 | (mac_addr_src2 << 48);
292 uint64_t pkt3_slab0 = mac_addr_dst3 | (mac_addr_src3 << 48);
294 uint32_t pkt0_slab1 = mac_addr_src0 >> 16;
295 uint32_t pkt1_slab1 = mac_addr_src1 >> 16;
296 uint32_t pkt2_slab1 = mac_addr_src2 >> 16;
297 uint32_t pkt3_slab1 = mac_addr_src3 >> 16;
299 /* Write: pkt buffer - pkt headers */
300 *((uint64_t *) raw0) = pkt0_slab0;
301 *((uint32_t *) (raw0 + 8)) = pkt0_slab1;
302 *((uint64_t *) raw1) = pkt1_slab0;
303 *((uint32_t *) (raw1 + 8)) = pkt1_slab1;
304 *((uint64_t *) raw2) = pkt2_slab0;
305 *((uint32_t *) (raw2 + 8)) = pkt2_slab1;
306 *((uint64_t *) raw3) = pkt3_slab0;
307 *((uint32_t *) (raw3 + 8)) = pkt3_slab1;
310 PIPELINE_TABLE_AH_HIT(arp_table_ah_hit,
315 pipeline_routing_parse_args(struct pipeline_routing *p,
316 struct pipeline_params *params)
318 uint32_t n_routes_present = 0;
319 uint32_t n_arp_entries_present = 0;
320 uint32_t ip_da_offset_present = 0;
321 uint32_t arp_key_offset_present = 0;
324 for (i = 0; i < params->n_args; i++) {
325 char *arg_name = params->args_name[i];
326 char *arg_value = params->args_value[i];
329 if (strcmp(arg_name, "n_routes") == 0) {
330 if (n_routes_present)
332 n_routes_present = 1;
334 p->n_routes = atoi(arg_value);
335 if (p->n_routes == 0)
342 if (strcmp(arg_name, "n_arp_entries") == 0) {
343 if (n_arp_entries_present)
345 n_arp_entries_present = 1;
347 p->n_arp_entries = atoi(arg_value);
348 if (p->n_arp_entries == 0)
355 if (strcmp(arg_name, "ip_da_offset") == 0) {
356 if (ip_da_offset_present)
358 ip_da_offset_present = 1;
360 p->ip_da_offset = atoi(arg_value);
366 if (strcmp(arg_name, "arp_key_offset") == 0) {
367 if (arp_key_offset_present)
369 arp_key_offset_present = 1;
371 p->arp_key_offset = atoi(arg_value);
380 /* Check that mandatory arguments are present */
381 if ((n_routes_present == 0) ||
382 (n_arp_entries_present == 0) ||
383 (ip_da_offset_present == 0) ||
384 (n_arp_entries_present && (arp_key_offset_present == 0)))
391 pipeline_routing_init(struct pipeline_params *params,
392 __rte_unused void *arg)
395 struct pipeline_routing *p_rt;
398 /* Check input arguments */
399 if ((params == NULL) ||
400 (params->n_ports_in == 0) ||
401 (params->n_ports_out == 0))
404 /* Memory allocation */
405 size = RTE_CACHE_LINE_ROUNDUP(sizeof(struct pipeline_routing));
406 p = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);
407 p_rt = (struct pipeline_routing *) p;
411 strcpy(p->name, params->name);
412 p->log_level = params->log_level;
414 PLOG(p, HIGH, "Routing");
416 /* Parse arguments */
417 if (pipeline_routing_parse_args(p_rt, params))
422 struct rte_pipeline_params pipeline_params = {
423 .name = params->name,
424 .socket_id = params->socket_id,
428 p->p = rte_pipeline_create(&pipeline_params);
436 p->n_ports_in = params->n_ports_in;
437 for (i = 0; i < p->n_ports_in; i++) {
438 struct rte_pipeline_port_in_params port_params = {
439 .ops = pipeline_port_in_params_get_ops(
440 ¶ms->port_in[i]),
441 .arg_create = pipeline_port_in_params_convert(
442 ¶ms->port_in[i]),
445 .burst_size = params->port_in[i].burst_size,
448 int status = rte_pipeline_port_in_create(p->p,
453 rte_pipeline_free(p->p);
460 p->n_ports_out = params->n_ports_out;
461 for (i = 0; i < p->n_ports_out; i++) {
462 struct rte_pipeline_port_out_params port_params = {
463 .ops = pipeline_port_out_params_get_ops(
464 ¶ms->port_out[i]),
465 .arg_create = pipeline_port_out_params_convert(
466 ¶ms->port_out[i]),
468 .f_action_bulk = NULL,
472 int status = rte_pipeline_port_out_create(p->p,
477 rte_pipeline_free(p->p);
486 struct rte_table_lpm_params table_lpm_params = {
487 .n_rules = p_rt->n_routes,
488 .entry_unique_size = sizeof(struct routing_table_entry),
489 .offset = p_rt->ip_da_offset,
492 struct rte_pipeline_table_params table_params = {
493 .ops = &rte_table_lpm_ops,
494 .arg_create = &table_lpm_params,
495 .f_action_hit = routing_table_ah_hit,
496 .f_action_miss = NULL,
499 sizeof(struct routing_table_entry) -
500 sizeof(struct rte_pipeline_table_entry),
505 status = rte_pipeline_table_create(p->p,
510 rte_pipeline_free(p->p);
516 /* ARP table configuration */
517 if (p_rt->n_arp_entries) {
518 struct rte_table_hash_key8_ext_params table_arp_params = {
519 .n_entries = p_rt->n_arp_entries,
520 .n_entries_ext = p_rt->n_arp_entries,
521 .f_hash = hash_default_key8,
523 .signature_offset = 0, /* Unused */
524 .key_offset = p_rt->arp_key_offset,
527 struct rte_pipeline_table_params table_params = {
528 .ops = &rte_table_hash_key8_ext_dosig_ops,
529 .arg_create = &table_arp_params,
530 .f_action_hit = arp_table_ah_hit,
531 .f_action_miss = NULL,
533 .action_data_size = sizeof(struct arp_table_entry) -
534 sizeof(struct rte_pipeline_table_entry),
539 status = rte_pipeline_table_create(p->p,
544 rte_pipeline_free(p->p);
552 /* Connecting input ports to tables */
553 for (i = 0; i < p->n_ports_in; i++) {
554 int status = rte_pipeline_port_in_connect_to_table(p->p,
559 rte_pipeline_free(p->p);
565 /* Enable input ports */
566 for (i = 0; i < p->n_ports_in; i++) {
567 int status = rte_pipeline_port_in_enable(p->p,
571 rte_pipeline_free(p->p);
577 /* Check pipeline consistency */
578 if (rte_pipeline_check(p->p) < 0) {
579 rte_pipeline_free(p->p);
585 p->n_msgq = params->n_msgq;
586 for (i = 0; i < p->n_msgq; i++)
587 p->msgq_in[i] = params->msgq_in[i];
588 for (i = 0; i < p->n_msgq; i++)
589 p->msgq_out[i] = params->msgq_out[i];
591 /* Message handlers */
592 memcpy(p->handlers, handlers, sizeof(p->handlers));
593 memcpy(p_rt->custom_handlers,
595 sizeof(p_rt->custom_handlers));
601 pipeline_routing_free(void *pipeline)
603 struct pipeline *p = (struct pipeline *) pipeline;
605 /* Check input arguments */
610 rte_pipeline_free(p->p);
616 pipeline_routing_track(void *pipeline,
617 __rte_unused uint32_t port_in,
620 struct pipeline *p = (struct pipeline *) pipeline;
622 /* Check input arguments */
624 (port_in >= p->n_ports_in) ||
628 if (p->n_ports_in == 1) {
637 pipeline_routing_timer(void *pipeline)
639 struct pipeline *p = (struct pipeline *) pipeline;
641 pipeline_msg_req_handle(p);
642 rte_pipeline_flush(p->p);
648 pipeline_routing_msg_req_custom_handler(struct pipeline *p,
651 struct pipeline_routing *p_rt = (struct pipeline_routing *) p;
652 struct pipeline_custom_msg_req *req = msg;
653 pipeline_msg_req_handler f_handle;
655 f_handle = (req->subtype < PIPELINE_ROUTING_MSG_REQS) ?
656 p_rt->custom_handlers[req->subtype] :
657 pipeline_msg_req_invalid_handler;
659 if (f_handle == NULL)
660 f_handle = pipeline_msg_req_invalid_handler;
662 return f_handle(p, req);
666 pipeline_routing_msg_req_route_add_handler(struct pipeline *p, void *msg)
668 struct pipeline_routing_route_add_msg_req *req = msg;
669 struct pipeline_routing_route_add_msg_rsp *rsp = msg;
671 struct rte_table_lpm_key key = {
672 .ip = req->key.key.ipv4.ip,
673 .depth = req->key.key.ipv4.depth,
676 struct routing_table_entry entry = {
678 .action = RTE_PIPELINE_ACTION_TABLE,
679 {.table_id = p->table_id[1]},
683 .port_id = req->port_id,
684 .ip = rte_bswap32(req->ip),
687 if (req->key.type != PIPELINE_ROUTING_ROUTE_IPV4) {
692 rsp->status = rte_pipeline_table_entry_add(p->p,
695 (struct rte_pipeline_table_entry *) &entry,
697 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
703 pipeline_routing_msg_req_route_del_handler(struct pipeline *p, void *msg)
705 struct pipeline_routing_route_delete_msg_req *req = msg;
706 struct pipeline_routing_route_delete_msg_rsp *rsp = msg;
708 struct rte_table_lpm_key key = {
709 .ip = req->key.key.ipv4.ip,
710 .depth = req->key.key.ipv4.depth,
713 if (req->key.type != PIPELINE_ROUTING_ROUTE_IPV4) {
718 rsp->status = rte_pipeline_table_entry_delete(p->p,
728 pipeline_routing_msg_req_route_add_default_handler(struct pipeline *p,
731 struct pipeline_routing_route_add_default_msg_req *req = msg;
732 struct pipeline_routing_route_add_default_msg_rsp *rsp = msg;
734 struct routing_table_entry default_entry = {
736 .action = RTE_PIPELINE_ACTION_PORT,
737 {.port_id = p->port_out_id[req->port_id]},
745 rsp->status = rte_pipeline_table_default_entry_add(p->p,
747 (struct rte_pipeline_table_entry *) &default_entry,
748 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
754 pipeline_routing_msg_req_route_del_default_handler(struct pipeline *p,
757 struct pipeline_routing_route_delete_default_msg_rsp *rsp = msg;
759 rsp->status = rte_pipeline_table_default_entry_delete(p->p,
767 pipeline_routing_msg_req_arp_add_handler(struct pipeline *p, void *msg)
769 struct pipeline_routing_arp_add_msg_req *req = msg;
770 struct pipeline_routing_arp_add_msg_rsp *rsp = msg;
772 struct pipeline_routing_arp_key_ipv4 key = {
773 .port_id = req->key.key.ipv4.port_id,
774 .ip = rte_bswap32(req->key.key.ipv4.ip),
777 struct arp_table_entry entry = {
779 .action = RTE_PIPELINE_ACTION_PORT,
780 {.port_id = p->port_out_id[req->key.key.ipv4.port_id]},
783 .macaddr = 0, /* set below */
786 if (req->key.type != PIPELINE_ROUTING_ARP_IPV4) {
791 *((struct ether_addr *) &entry.macaddr) = req->macaddr;
793 rsp->status = rte_pipeline_table_entry_add(p->p,
796 (struct rte_pipeline_table_entry *) &entry,
798 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
804 pipeline_routing_msg_req_arp_del_handler(struct pipeline *p, void *msg)
806 struct pipeline_routing_arp_delete_msg_req *req = msg;
807 struct pipeline_routing_arp_delete_msg_rsp *rsp = msg;
809 struct pipeline_routing_arp_key_ipv4 key = {
810 .port_id = req->key.key.ipv4.port_id,
811 .ip = rte_bswap32(req->key.key.ipv4.ip),
814 if (req->key.type != PIPELINE_ROUTING_ARP_IPV4) {
819 rsp->status = rte_pipeline_table_entry_delete(p->p,
829 pipeline_routing_msg_req_arp_add_default_handler(struct pipeline *p, void *msg)
831 struct pipeline_routing_arp_add_default_msg_req *req = msg;
832 struct pipeline_routing_arp_add_default_msg_rsp *rsp = msg;
834 struct arp_table_entry default_entry = {
836 .action = RTE_PIPELINE_ACTION_PORT,
837 {.port_id = p->port_out_id[req->port_id]},
843 rsp->status = rte_pipeline_table_default_entry_add(p->p,
845 (struct rte_pipeline_table_entry *) &default_entry,
846 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
852 pipeline_routing_msg_req_arp_del_default_handler(struct pipeline *p, void *msg)
854 struct pipeline_routing_arp_delete_default_msg_rsp *rsp = msg;
856 rsp->status = rte_pipeline_table_default_entry_delete(p->p,
863 struct pipeline_be_ops pipeline_routing_be_ops = {
864 .f_init = pipeline_routing_init,
865 .f_free = pipeline_routing_free,
867 .f_timer = pipeline_routing_timer,
868 .f_track = pipeline_routing_track,