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 = {
488 .n_rules = p_rt->n_routes,
489 .entry_unique_size = sizeof(struct routing_table_entry),
490 .offset = p_rt->ip_da_offset,
493 struct rte_pipeline_table_params table_params = {
494 .ops = &rte_table_lpm_ops,
495 .arg_create = &table_lpm_params,
496 .f_action_hit = routing_table_ah_hit,
497 .f_action_miss = NULL,
500 sizeof(struct routing_table_entry) -
501 sizeof(struct rte_pipeline_table_entry),
506 status = rte_pipeline_table_create(p->p,
511 rte_pipeline_free(p->p);
517 /* ARP table configuration */
518 if (p_rt->n_arp_entries) {
519 struct rte_table_hash_key8_ext_params table_arp_params = {
520 .n_entries = p_rt->n_arp_entries,
521 .n_entries_ext = p_rt->n_arp_entries,
522 .f_hash = hash_default_key8,
524 .signature_offset = 0, /* Unused */
525 .key_offset = p_rt->arp_key_offset,
528 struct rte_pipeline_table_params table_params = {
529 .ops = &rte_table_hash_key8_ext_dosig_ops,
530 .arg_create = &table_arp_params,
531 .f_action_hit = arp_table_ah_hit,
532 .f_action_miss = NULL,
534 .action_data_size = sizeof(struct arp_table_entry) -
535 sizeof(struct rte_pipeline_table_entry),
540 status = rte_pipeline_table_create(p->p,
545 rte_pipeline_free(p->p);
553 /* Connecting input ports to tables */
554 for (i = 0; i < p->n_ports_in; i++) {
555 int status = rte_pipeline_port_in_connect_to_table(p->p,
560 rte_pipeline_free(p->p);
566 /* Enable input ports */
567 for (i = 0; i < p->n_ports_in; i++) {
568 int status = rte_pipeline_port_in_enable(p->p,
572 rte_pipeline_free(p->p);
578 /* Check pipeline consistency */
579 if (rte_pipeline_check(p->p) < 0) {
580 rte_pipeline_free(p->p);
586 p->n_msgq = params->n_msgq;
587 for (i = 0; i < p->n_msgq; i++)
588 p->msgq_in[i] = params->msgq_in[i];
589 for (i = 0; i < p->n_msgq; i++)
590 p->msgq_out[i] = params->msgq_out[i];
592 /* Message handlers */
593 memcpy(p->handlers, handlers, sizeof(p->handlers));
594 memcpy(p_rt->custom_handlers,
596 sizeof(p_rt->custom_handlers));
602 pipeline_routing_free(void *pipeline)
604 struct pipeline *p = (struct pipeline *) pipeline;
606 /* Check input arguments */
611 rte_pipeline_free(p->p);
617 pipeline_routing_track(void *pipeline,
618 __rte_unused uint32_t port_in,
621 struct pipeline *p = (struct pipeline *) pipeline;
623 /* Check input arguments */
625 (port_in >= p->n_ports_in) ||
629 if (p->n_ports_in == 1) {
638 pipeline_routing_timer(void *pipeline)
640 struct pipeline *p = (struct pipeline *) pipeline;
642 pipeline_msg_req_handle(p);
643 rte_pipeline_flush(p->p);
649 pipeline_routing_msg_req_custom_handler(struct pipeline *p,
652 struct pipeline_routing *p_rt = (struct pipeline_routing *) p;
653 struct pipeline_custom_msg_req *req = msg;
654 pipeline_msg_req_handler f_handle;
656 f_handle = (req->subtype < PIPELINE_ROUTING_MSG_REQS) ?
657 p_rt->custom_handlers[req->subtype] :
658 pipeline_msg_req_invalid_handler;
660 if (f_handle == NULL)
661 f_handle = pipeline_msg_req_invalid_handler;
663 return f_handle(p, req);
667 pipeline_routing_msg_req_route_add_handler(struct pipeline *p, void *msg)
669 struct pipeline_routing_route_add_msg_req *req = msg;
670 struct pipeline_routing_route_add_msg_rsp *rsp = msg;
672 struct rte_table_lpm_key key = {
673 .ip = req->key.key.ipv4.ip,
674 .depth = req->key.key.ipv4.depth,
677 struct routing_table_entry entry = {
679 .action = RTE_PIPELINE_ACTION_TABLE,
680 {.table_id = p->table_id[1]},
684 .port_id = req->port_id,
685 .ip = rte_bswap32(req->ip),
688 if (req->key.type != PIPELINE_ROUTING_ROUTE_IPV4) {
693 rsp->status = rte_pipeline_table_entry_add(p->p,
696 (struct rte_pipeline_table_entry *) &entry,
698 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
704 pipeline_routing_msg_req_route_del_handler(struct pipeline *p, void *msg)
706 struct pipeline_routing_route_delete_msg_req *req = msg;
707 struct pipeline_routing_route_delete_msg_rsp *rsp = msg;
709 struct rte_table_lpm_key key = {
710 .ip = req->key.key.ipv4.ip,
711 .depth = req->key.key.ipv4.depth,
714 if (req->key.type != PIPELINE_ROUTING_ROUTE_IPV4) {
719 rsp->status = rte_pipeline_table_entry_delete(p->p,
729 pipeline_routing_msg_req_route_add_default_handler(struct pipeline *p,
732 struct pipeline_routing_route_add_default_msg_req *req = msg;
733 struct pipeline_routing_route_add_default_msg_rsp *rsp = msg;
735 struct routing_table_entry default_entry = {
737 .action = RTE_PIPELINE_ACTION_PORT,
738 {.port_id = p->port_out_id[req->port_id]},
746 rsp->status = rte_pipeline_table_default_entry_add(p->p,
748 (struct rte_pipeline_table_entry *) &default_entry,
749 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
755 pipeline_routing_msg_req_route_del_default_handler(struct pipeline *p,
758 struct pipeline_routing_route_delete_default_msg_rsp *rsp = msg;
760 rsp->status = rte_pipeline_table_default_entry_delete(p->p,
768 pipeline_routing_msg_req_arp_add_handler(struct pipeline *p, void *msg)
770 struct pipeline_routing_arp_add_msg_req *req = msg;
771 struct pipeline_routing_arp_add_msg_rsp *rsp = msg;
773 struct pipeline_routing_arp_key_ipv4 key = {
774 .port_id = req->key.key.ipv4.port_id,
775 .ip = rte_bswap32(req->key.key.ipv4.ip),
778 struct arp_table_entry entry = {
780 .action = RTE_PIPELINE_ACTION_PORT,
781 {.port_id = p->port_out_id[req->key.key.ipv4.port_id]},
784 .macaddr = 0, /* set below */
787 if (req->key.type != PIPELINE_ROUTING_ARP_IPV4) {
792 *((struct ether_addr *) &entry.macaddr) = req->macaddr;
794 rsp->status = rte_pipeline_table_entry_add(p->p,
797 (struct rte_pipeline_table_entry *) &entry,
799 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
805 pipeline_routing_msg_req_arp_del_handler(struct pipeline *p, void *msg)
807 struct pipeline_routing_arp_delete_msg_req *req = msg;
808 struct pipeline_routing_arp_delete_msg_rsp *rsp = msg;
810 struct pipeline_routing_arp_key_ipv4 key = {
811 .port_id = req->key.key.ipv4.port_id,
812 .ip = rte_bswap32(req->key.key.ipv4.ip),
815 if (req->key.type != PIPELINE_ROUTING_ARP_IPV4) {
820 rsp->status = rte_pipeline_table_entry_delete(p->p,
830 pipeline_routing_msg_req_arp_add_default_handler(struct pipeline *p, void *msg)
832 struct pipeline_routing_arp_add_default_msg_req *req = msg;
833 struct pipeline_routing_arp_add_default_msg_rsp *rsp = msg;
835 struct arp_table_entry default_entry = {
837 .action = RTE_PIPELINE_ACTION_PORT,
838 {.port_id = p->port_out_id[req->port_id]},
844 rsp->status = rte_pipeline_table_default_entry_add(p->p,
846 (struct rte_pipeline_table_entry *) &default_entry,
847 (struct rte_pipeline_table_entry **) &rsp->entry_ptr);
853 pipeline_routing_msg_req_arp_del_default_handler(struct pipeline *p, void *msg)
855 struct pipeline_routing_arp_delete_default_msg_rsp *rsp = msg;
857 rsp->status = rte_pipeline_table_default_entry_delete(p->p,
864 struct pipeline_be_ops pipeline_routing_be_ops = {
865 .f_init = pipeline_routing_init,
866 .f_free = pipeline_routing_free,
868 .f_timer = pipeline_routing_timer,
869 .f_track = pipeline_routing_track,