common/sfc_efx/base: implement Tx control path for Riverhead
[dpdk.git] / drivers / net / softnic / rte_eth_softnic_internals.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Intel Corporation
3  */
4
5 #ifndef __INCLUDE_RTE_ETH_SOFTNIC_INTERNALS_H__
6 #define __INCLUDE_RTE_ETH_SOFTNIC_INTERNALS_H__
7
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <sys/queue.h>
11
12 #include <rte_mempool.h>
13 #include <rte_mbuf.h>
14 #include <rte_ring.h>
15 #include <rte_ethdev.h>
16 #include <rte_sched.h>
17 #include <rte_port_in_action.h>
18 #include <rte_table_action.h>
19 #include <rte_pipeline.h>
20
21 #include <rte_ethdev_core.h>
22 #include <rte_ethdev_driver.h>
23 #include <rte_tm_driver.h>
24 #include <rte_flow_driver.h>
25 #include <rte_mtr_driver.h>
26
27 #include "rte_eth_softnic.h"
28 #include "conn.h"
29
30 #define NAME_SIZE                                            64
31
32 /**
33  * PMD Parameters
34  */
35
36 struct pmd_params {
37         const char *name;
38         const char *firmware;
39         uint16_t conn_port;
40         uint32_t cpu_id;
41         int sc; /**< Service cores. */
42
43         /** Traffic Management (TM) */
44         struct {
45                 uint32_t n_queues; /**< Number of queues */
46                 uint16_t qsize[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
47         } tm;
48 };
49
50 /**
51  * Ethdev Flow API
52  */
53 struct rte_flow;
54
55 TAILQ_HEAD(flow_list, rte_flow);
56
57 struct flow_attr_map {
58         char pipeline_name[NAME_SIZE];
59         uint32_t table_id;
60         int valid;
61 };
62
63 #ifndef SOFTNIC_FLOW_MAX_GROUPS
64 #define SOFTNIC_FLOW_MAX_GROUPS                            64
65 #endif
66
67 struct flow_internals {
68         struct flow_attr_map ingress_map[SOFTNIC_FLOW_MAX_GROUPS];
69         struct flow_attr_map egress_map[SOFTNIC_FLOW_MAX_GROUPS];
70 };
71
72 /**
73  * Meter
74  */
75
76 /* MTR meter profile */
77 struct softnic_mtr_meter_profile {
78         TAILQ_ENTRY(softnic_mtr_meter_profile) node;
79         uint32_t meter_profile_id;
80         struct rte_mtr_meter_profile params;
81         uint32_t n_users;
82 };
83
84 TAILQ_HEAD(softnic_mtr_meter_profile_list, softnic_mtr_meter_profile);
85
86 /* MTR meter object */
87 struct softnic_mtr {
88         TAILQ_ENTRY(softnic_mtr) node;
89         uint32_t mtr_id;
90         struct rte_mtr_params params;
91         struct rte_flow *flow;
92 };
93
94 TAILQ_HEAD(softnic_mtr_list, softnic_mtr);
95
96 struct mtr_internals {
97         struct softnic_mtr_meter_profile_list meter_profiles;
98         struct softnic_mtr_list mtrs;
99 };
100
101 /**
102  * MEMPOOL
103  */
104 struct softnic_mempool_params {
105         uint32_t buffer_size;
106         uint32_t pool_size;
107         uint32_t cache_size;
108 };
109
110 struct softnic_mempool {
111         TAILQ_ENTRY(softnic_mempool) node;
112         char name[NAME_SIZE];
113         struct rte_mempool *m;
114         uint32_t buffer_size;
115 };
116
117 TAILQ_HEAD(softnic_mempool_list, softnic_mempool);
118
119 /**
120  * SWQ
121  */
122 struct softnic_swq_params {
123         uint32_t size;
124 };
125
126 struct softnic_swq {
127         TAILQ_ENTRY(softnic_swq) node;
128         char name[NAME_SIZE];
129         struct rte_ring *r;
130 };
131
132 TAILQ_HEAD(softnic_swq_list, softnic_swq);
133
134 /**
135  * LINK
136  */
137 struct softnic_link_params {
138         const char *dev_name;
139         uint16_t port_id; /**< Valid only when *dev_name* is NULL. */
140 };
141
142 struct softnic_link {
143         TAILQ_ENTRY(softnic_link) node;
144         char name[NAME_SIZE];
145         uint16_t port_id;
146         uint32_t n_rxq;
147         uint32_t n_txq;
148 };
149
150 TAILQ_HEAD(softnic_link_list, softnic_link);
151
152 /**
153  * TMGR
154  */
155
156 #ifndef TM_MAX_SUBPORTS
157 #define TM_MAX_SUBPORTS                                 8
158 #endif
159
160 #ifndef TM_MAX_PIPES_PER_SUBPORT
161 #define TM_MAX_PIPES_PER_SUBPORT                        4096
162 #endif
163
164 #ifndef TM_MAX_PIPE_PROFILE
165 #define TM_MAX_PIPE_PROFILE                             256
166 #endif
167 struct tm_params {
168         struct rte_sched_port_params port_params;
169
170         struct rte_sched_subport_params subport_params[TM_MAX_SUBPORTS];
171
172         struct rte_sched_pipe_params pipe_profiles[TM_MAX_PIPE_PROFILE];
173         uint32_t n_pipe_profiles;
174         uint32_t pipe_to_profile[TM_MAX_SUBPORTS * TM_MAX_PIPES_PER_SUBPORT];
175 };
176
177 /* TM Levels */
178 enum tm_node_level {
179         TM_NODE_LEVEL_PORT = 0,
180         TM_NODE_LEVEL_SUBPORT,
181         TM_NODE_LEVEL_PIPE,
182         TM_NODE_LEVEL_TC,
183         TM_NODE_LEVEL_QUEUE,
184         TM_NODE_LEVEL_MAX,
185 };
186
187 /* TM Shaper Profile */
188 struct tm_shaper_profile {
189         TAILQ_ENTRY(tm_shaper_profile) node;
190         uint32_t shaper_profile_id;
191         uint32_t n_users;
192         struct rte_tm_shaper_params params;
193 };
194
195 TAILQ_HEAD(tm_shaper_profile_list, tm_shaper_profile);
196
197 /* TM Shared Shaper */
198 struct tm_shared_shaper {
199         TAILQ_ENTRY(tm_shared_shaper) node;
200         uint32_t shared_shaper_id;
201         uint32_t n_users;
202         uint32_t shaper_profile_id;
203 };
204
205 TAILQ_HEAD(tm_shared_shaper_list, tm_shared_shaper);
206
207 /* TM WRED Profile */
208 struct tm_wred_profile {
209         TAILQ_ENTRY(tm_wred_profile) node;
210         uint32_t wred_profile_id;
211         uint32_t n_users;
212         struct rte_tm_wred_params params;
213 };
214
215 TAILQ_HEAD(tm_wred_profile_list, tm_wred_profile);
216
217 /* TM Node */
218 struct tm_node {
219         TAILQ_ENTRY(tm_node) node;
220         uint32_t node_id;
221         uint32_t parent_node_id;
222         uint32_t priority;
223         uint32_t weight;
224         uint32_t level;
225         struct tm_node *parent_node;
226         struct tm_shaper_profile *shaper_profile;
227         struct tm_wred_profile *wred_profile;
228         struct rte_tm_node_params params;
229         struct rte_tm_node_stats stats;
230         uint32_t n_children;
231 };
232
233 TAILQ_HEAD(tm_node_list, tm_node);
234
235 /* TM Hierarchy Specification */
236 struct tm_hierarchy {
237         struct tm_shaper_profile_list shaper_profiles;
238         struct tm_shared_shaper_list shared_shapers;
239         struct tm_wred_profile_list wred_profiles;
240         struct tm_node_list nodes;
241
242         uint32_t n_shaper_profiles;
243         uint32_t n_shared_shapers;
244         uint32_t n_wred_profiles;
245         uint32_t n_nodes;
246
247         uint32_t n_tm_nodes[TM_NODE_LEVEL_MAX];
248 };
249
250 struct tm_internals {
251         /** Hierarchy specification
252          *
253          *     -Hierarchy is unfrozen at init and when port is stopped.
254          *     -Hierarchy is frozen on successful hierarchy commit.
255          *     -Run-time hierarchy changes are not allowed, therefore it makes
256          *      sense to keep the hierarchy frozen after the port is started.
257          */
258         struct tm_hierarchy h;
259         int hierarchy_frozen;
260
261         /** Blueprints */
262         struct tm_params params;
263 };
264
265 struct softnic_tmgr_port {
266         TAILQ_ENTRY(softnic_tmgr_port) node;
267         char name[NAME_SIZE];
268         struct rte_sched_port *s;
269 };
270
271 TAILQ_HEAD(softnic_tmgr_port_list, softnic_tmgr_port);
272
273 /**
274  * TAP
275  */
276 struct softnic_tap {
277         TAILQ_ENTRY(softnic_tap) node;
278         char name[NAME_SIZE];
279         int fd;
280 };
281
282 TAILQ_HEAD(softnic_tap_list, softnic_tap);
283
284 /**
285  * Cryptodev
286  */
287 struct softnic_cryptodev_params {
288         const char *dev_name;
289         uint32_t dev_id; /**< Valid only when *dev_name* is NULL. */
290         uint32_t n_queues;
291         uint32_t queue_size;
292         uint32_t session_pool_size;
293 };
294
295 struct softnic_cryptodev {
296         TAILQ_ENTRY(softnic_cryptodev) node;
297         char name[NAME_SIZE];
298         uint16_t dev_id;
299         uint32_t n_queues;
300         struct rte_mempool *mp_create;
301         struct rte_mempool *mp_init;
302 };
303
304 TAILQ_HEAD(softnic_cryptodev_list, softnic_cryptodev);
305
306 /**
307  * Input port action
308  */
309 struct softnic_port_in_action_profile_params {
310         uint64_t action_mask;
311         struct rte_port_in_action_fltr_config fltr;
312         struct rte_port_in_action_lb_config lb;
313 };
314
315 struct softnic_port_in_action_profile {
316         TAILQ_ENTRY(softnic_port_in_action_profile) node;
317         char name[NAME_SIZE];
318         struct softnic_port_in_action_profile_params params;
319         struct rte_port_in_action_profile *ap;
320 };
321
322 TAILQ_HEAD(softnic_port_in_action_profile_list, softnic_port_in_action_profile);
323
324 /**
325  * Table action
326  */
327 struct softnic_table_action_profile_params {
328         uint64_t action_mask;
329         struct rte_table_action_common_config common;
330         struct rte_table_action_lb_config lb;
331         struct rte_table_action_mtr_config mtr;
332         struct rte_table_action_tm_config tm;
333         struct rte_table_action_encap_config encap;
334         struct rte_table_action_nat_config nat;
335         struct rte_table_action_ttl_config ttl;
336         struct rte_table_action_stats_config stats;
337         struct rte_table_action_sym_crypto_config sym_crypto;
338 };
339
340 struct softnic_table_action_profile {
341         TAILQ_ENTRY(softnic_table_action_profile) node;
342         char name[NAME_SIZE];
343         struct softnic_table_action_profile_params params;
344         struct rte_table_action_profile *ap;
345 };
346
347 TAILQ_HEAD(softnic_table_action_profile_list, softnic_table_action_profile);
348
349 struct softnic_table_meter_profile {
350         TAILQ_ENTRY(softnic_table_meter_profile) node;
351         uint32_t meter_profile_id;
352         struct rte_table_action_meter_profile profile;
353 };
354
355 TAILQ_HEAD(softnic_table_meter_profile_list,
356         softnic_table_meter_profile);
357
358 /**
359  * Pipeline
360  */
361 struct pipeline_params {
362         uint32_t timer_period_ms;
363         uint32_t offset_port_id;
364 };
365
366 enum softnic_port_in_type {
367         PORT_IN_RXQ,
368         PORT_IN_SWQ,
369         PORT_IN_TMGR,
370         PORT_IN_TAP,
371         PORT_IN_SOURCE,
372         PORT_IN_CRYPTODEV,
373 };
374
375 struct softnic_port_in_params {
376         /* Read */
377         enum softnic_port_in_type type;
378         char dev_name[NAME_SIZE];
379         union {
380                 struct {
381                         uint16_t queue_id;
382                 } rxq;
383
384                 struct {
385                         const char *mempool_name;
386                         uint32_t mtu;
387                 } tap;
388
389                 struct {
390                         const char *mempool_name;
391                         const char *file_name;
392                         uint32_t n_bytes_per_pkt;
393                 } source;
394
395                 struct {
396                         uint16_t queue_id;
397                         void *f_callback;
398                         void *arg_callback;
399                 } cryptodev;
400         };
401         uint32_t burst_size;
402
403         /* Action */
404         char action_profile_name[NAME_SIZE];
405 };
406
407 enum softnic_port_out_type {
408         PORT_OUT_TXQ,
409         PORT_OUT_SWQ,
410         PORT_OUT_TMGR,
411         PORT_OUT_TAP,
412         PORT_OUT_SINK,
413         PORT_OUT_CRYPTODEV,
414 };
415
416 struct softnic_port_out_params {
417         enum softnic_port_out_type type;
418         char dev_name[NAME_SIZE];
419         union {
420                 struct {
421                         uint16_t queue_id;
422                 } txq;
423
424                 struct {
425                         const char *file_name;
426                         uint32_t max_n_pkts;
427                 } sink;
428
429                 struct {
430                         uint16_t queue_id;
431                         uint32_t op_offset;
432                 } cryptodev;
433         };
434         uint32_t burst_size;
435         int retry;
436         uint32_t n_retries;
437 };
438
439 enum softnic_table_type {
440         TABLE_ACL,
441         TABLE_ARRAY,
442         TABLE_HASH,
443         TABLE_LPM,
444         TABLE_STUB,
445 };
446
447 struct softnic_table_acl_params {
448         uint32_t n_rules;
449         uint32_t ip_header_offset;
450         int ip_version;
451 };
452
453 struct softnic_table_array_params {
454         uint32_t n_keys;
455         uint32_t key_offset;
456 };
457
458 #ifndef TABLE_RULE_MATCH_SIZE_MAX
459 #define TABLE_RULE_MATCH_SIZE_MAX                          256
460 #endif
461
462 struct softnic_table_hash_params {
463         uint32_t n_keys;
464         uint32_t key_offset;
465         uint32_t key_size;
466         uint8_t key_mask[TABLE_RULE_MATCH_SIZE_MAX];
467         uint32_t n_buckets;
468         int extendable_bucket;
469 };
470
471 struct softnic_table_lpm_params {
472         uint32_t n_rules;
473         uint32_t key_offset;
474         uint32_t key_size;
475 };
476
477 struct softnic_table_params {
478         /* Match */
479         enum softnic_table_type match_type;
480         union {
481                 struct softnic_table_acl_params acl;
482                 struct softnic_table_array_params array;
483                 struct softnic_table_hash_params hash;
484                 struct softnic_table_lpm_params lpm;
485         } match;
486
487         /* Action */
488         char action_profile_name[NAME_SIZE];
489 };
490
491 struct softnic_port_in {
492         struct softnic_port_in_params params;
493         struct softnic_port_in_action_profile *ap;
494         struct rte_port_in_action *a;
495 };
496
497 struct softnic_port_out {
498         struct softnic_port_out_params params;
499 };
500
501 struct softnic_table {
502         struct softnic_table_params params;
503         struct softnic_table_action_profile *ap;
504         struct rte_table_action *a;
505         struct flow_list flows;
506         struct rte_table_action_dscp_table dscp_table;
507         struct softnic_table_meter_profile_list meter_profiles;
508 };
509
510 struct pipeline {
511         TAILQ_ENTRY(pipeline) node;
512         char name[NAME_SIZE];
513
514         struct rte_pipeline *p;
515         struct pipeline_params params;
516         struct softnic_port_in port_in[RTE_PIPELINE_PORT_IN_MAX];
517         struct softnic_port_out port_out[RTE_PIPELINE_PORT_OUT_MAX];
518         struct softnic_table table[RTE_PIPELINE_TABLE_MAX];
519         uint32_t n_ports_in;
520         uint32_t n_ports_out;
521         uint32_t n_tables;
522
523         struct rte_ring *msgq_req;
524         struct rte_ring *msgq_rsp;
525         uint32_t timer_period_ms;
526
527         int enabled;
528         uint32_t thread_id;
529         uint32_t cpu_id;
530 };
531
532 TAILQ_HEAD(pipeline_list, pipeline);
533
534 /**
535  * Thread
536  */
537 #ifndef THREAD_PIPELINES_MAX
538 #define THREAD_PIPELINES_MAX                               256
539 #endif
540
541 #ifndef THREAD_MSGQ_SIZE
542 #define THREAD_MSGQ_SIZE                                   64
543 #endif
544
545 #ifndef THREAD_TIMER_PERIOD_MS
546 #define THREAD_TIMER_PERIOD_MS                             100
547 #endif
548
549 /**
550  * Master thead: data plane thread context
551  */
552 struct softnic_thread {
553         struct rte_ring *msgq_req;
554         struct rte_ring *msgq_rsp;
555
556         uint32_t service_id;
557 };
558
559 /**
560  * Data plane threads: context
561  */
562 #ifndef TABLE_RULE_ACTION_SIZE_MAX
563 #define TABLE_RULE_ACTION_SIZE_MAX                         2048
564 #endif
565
566 struct softnic_table_data {
567         struct rte_table_action *a;
568 };
569
570 struct pipeline_data {
571         struct rte_pipeline *p;
572         struct softnic_table_data table_data[RTE_PIPELINE_TABLE_MAX];
573         uint32_t n_tables;
574
575         struct rte_ring *msgq_req;
576         struct rte_ring *msgq_rsp;
577         uint64_t timer_period; /* Measured in CPU cycles. */
578         uint64_t time_next;
579
580         uint8_t buffer[TABLE_RULE_ACTION_SIZE_MAX];
581 };
582
583 struct softnic_thread_data {
584         struct rte_pipeline *p[THREAD_PIPELINES_MAX];
585         uint32_t n_pipelines;
586
587         struct pipeline_data pipeline_data[THREAD_PIPELINES_MAX];
588         struct rte_ring *msgq_req;
589         struct rte_ring *msgq_rsp;
590         uint64_t timer_period; /* Measured in CPU cycles. */
591         uint64_t time_next;
592         uint64_t time_next_min;
593         uint64_t iter;
594 } __rte_cache_aligned;
595
596 /**
597  * PMD Internals
598  */
599 struct pmd_internals {
600         /** Params */
601         struct pmd_params params;
602
603         struct {
604                 struct tm_internals tm; /**< Traffic Management */
605         } soft;
606
607         struct flow_internals flow;
608         struct mtr_internals mtr;
609
610         struct softnic_conn *conn;
611         struct softnic_mempool_list mempool_list;
612         struct softnic_swq_list swq_list;
613         struct softnic_link_list link_list;
614         struct softnic_tmgr_port_list tmgr_port_list;
615         struct softnic_tap_list tap_list;
616         struct softnic_cryptodev_list cryptodev_list;
617         struct softnic_port_in_action_profile_list port_in_action_profile_list;
618         struct softnic_table_action_profile_list table_action_profile_list;
619         struct pipeline_list pipeline_list;
620         struct softnic_thread thread[RTE_MAX_LCORE];
621         struct softnic_thread_data thread_data[RTE_MAX_LCORE];
622 };
623
624 static inline struct rte_eth_dev *
625 ETHDEV(struct pmd_internals *softnic)
626 {
627         uint16_t port_id;
628         int status;
629
630         if (softnic == NULL)
631                 return NULL;
632
633         status = rte_eth_dev_get_port_by_name(softnic->params.name, &port_id);
634         if (status)
635                 return NULL;
636
637         return &rte_eth_devices[port_id];
638 }
639
640 /**
641  * Ethdev Flow API
642  */
643 int
644 flow_attr_map_set(struct pmd_internals *softnic,
645                 uint32_t group_id,
646                 int ingress,
647                 const char *pipeline_name,
648                 uint32_t table_id);
649
650 struct flow_attr_map *
651 flow_attr_map_get(struct pmd_internals *softnic,
652                 uint32_t group_id,
653                 int ingress);
654
655 extern const struct rte_flow_ops pmd_flow_ops;
656
657 /**
658  * Meter
659  */
660 int
661 softnic_mtr_init(struct pmd_internals *p);
662
663 void
664 softnic_mtr_free(struct pmd_internals *p);
665
666 struct softnic_mtr *
667 softnic_mtr_find(struct pmd_internals *p,
668         uint32_t mtr_id);
669
670 struct softnic_mtr_meter_profile *
671 softnic_mtr_meter_profile_find(struct pmd_internals *p,
672         uint32_t meter_profile_id);
673
674 extern const struct rte_mtr_ops pmd_mtr_ops;
675
676 /**
677  * MEMPOOL
678  */
679 int
680 softnic_mempool_init(struct pmd_internals *p);
681
682 void
683 softnic_mempool_free(struct pmd_internals *p);
684
685 struct softnic_mempool *
686 softnic_mempool_find(struct pmd_internals *p,
687         const char *name);
688
689 struct softnic_mempool *
690 softnic_mempool_create(struct pmd_internals *p,
691         const char *name,
692         struct softnic_mempool_params *params);
693
694 /**
695  * SWQ
696  */
697 int
698 softnic_swq_init(struct pmd_internals *p);
699
700 void
701 softnic_swq_free(struct pmd_internals *p);
702
703 void
704 softnic_softnic_swq_free_keep_rxq_txq(struct pmd_internals *p);
705
706 struct softnic_swq *
707 softnic_swq_find(struct pmd_internals *p,
708         const char *name);
709
710 struct softnic_swq *
711 softnic_swq_create(struct pmd_internals *p,
712         const char *name,
713         struct softnic_swq_params *params);
714
715 /**
716  * LINK
717  */
718 int
719 softnic_link_init(struct pmd_internals *p);
720
721 void
722 softnic_link_free(struct pmd_internals *p);
723
724 struct softnic_link *
725 softnic_link_find(struct pmd_internals *p,
726         const char *name);
727
728 struct softnic_link *
729 softnic_link_create(struct pmd_internals *p,
730         const char *name,
731         struct softnic_link_params *params);
732
733 /**
734  * TMGR
735  */
736 int
737 softnic_tmgr_init(struct pmd_internals *p);
738
739 void
740 softnic_tmgr_free(struct pmd_internals *p);
741
742 struct softnic_tmgr_port *
743 softnic_tmgr_port_find(struct pmd_internals *p,
744         const char *name);
745
746 struct softnic_tmgr_port *
747 softnic_tmgr_port_create(struct pmd_internals *p,
748         const char *name);
749
750 void
751 tm_hierarchy_init(struct pmd_internals *p);
752
753 void
754 tm_hierarchy_free(struct pmd_internals *p);
755
756 static inline int
757 tm_used(struct rte_eth_dev *dev)
758 {
759         struct pmd_internals *p = dev->data->dev_private;
760
761         return p->soft.tm.h.n_tm_nodes[TM_NODE_LEVEL_PORT];
762 }
763
764 extern const struct rte_tm_ops pmd_tm_ops;
765
766 /**
767  * TAP
768  */
769 int
770 softnic_tap_init(struct pmd_internals *p);
771
772 void
773 softnic_tap_free(struct pmd_internals *p);
774
775 struct softnic_tap *
776 softnic_tap_find(struct pmd_internals *p,
777         const char *name);
778
779 struct softnic_tap *
780 softnic_tap_create(struct pmd_internals *p,
781         const char *name);
782
783 /**
784  * Sym Crypto
785  */
786 int
787 softnic_cryptodev_init(struct pmd_internals *p);
788
789 void
790 softnic_cryptodev_free(struct pmd_internals *p);
791
792 struct softnic_cryptodev *
793 softnic_cryptodev_find(struct pmd_internals *p,
794         const char *name);
795
796 struct softnic_cryptodev *
797 softnic_cryptodev_create(struct pmd_internals *p,
798         const char *name,
799         struct softnic_cryptodev_params *params);
800
801 /**
802  * Input port action
803  */
804 int
805 softnic_port_in_action_profile_init(struct pmd_internals *p);
806
807 void
808 softnic_port_in_action_profile_free(struct pmd_internals *p);
809
810 struct softnic_port_in_action_profile *
811 softnic_port_in_action_profile_find(struct pmd_internals *p,
812         const char *name);
813
814 struct softnic_port_in_action_profile *
815 softnic_port_in_action_profile_create(struct pmd_internals *p,
816         const char *name,
817         struct softnic_port_in_action_profile_params *params);
818
819 /**
820  * Table action
821  */
822 int
823 softnic_table_action_profile_init(struct pmd_internals *p);
824
825 void
826 softnic_table_action_profile_free(struct pmd_internals *p);
827
828 struct softnic_table_action_profile *
829 softnic_table_action_profile_find(struct pmd_internals *p,
830         const char *name);
831
832 struct softnic_table_action_profile *
833 softnic_table_action_profile_create(struct pmd_internals *p,
834         const char *name,
835         struct softnic_table_action_profile_params *params);
836
837 enum rte_table_action_policer
838 softnic_table_action_policer(enum rte_mtr_policer_action action);
839
840 /**
841  * Pipeline
842  */
843 int
844 softnic_pipeline_init(struct pmd_internals *p);
845
846 void
847 softnic_pipeline_free(struct pmd_internals *p);
848
849 void
850 softnic_pipeline_disable_all(struct pmd_internals *p);
851
852 uint32_t
853 softnic_pipeline_thread_count(struct pmd_internals *p, uint32_t thread_id);
854
855 struct pipeline *
856 softnic_pipeline_find(struct pmd_internals *p, const char *name);
857
858 struct pipeline *
859 softnic_pipeline_create(struct pmd_internals *p,
860         const char *name,
861         struct pipeline_params *params);
862
863 int
864 softnic_pipeline_port_in_create(struct pmd_internals *p,
865         const char *pipeline_name,
866         struct softnic_port_in_params *params,
867         int enabled);
868
869 int
870 softnic_pipeline_port_in_connect_to_table(struct pmd_internals *p,
871         const char *pipeline_name,
872         uint32_t port_id,
873         uint32_t table_id);
874
875 int
876 softnic_pipeline_port_out_create(struct pmd_internals *p,
877         const char *pipeline_name,
878         struct softnic_port_out_params *params);
879
880 int
881 softnic_pipeline_port_out_find(struct pmd_internals *softnic,
882                 const char *pipeline_name,
883                 const char *name,
884                 uint32_t *port_id);
885
886 int
887 softnic_pipeline_table_create(struct pmd_internals *p,
888         const char *pipeline_name,
889         struct softnic_table_params *params);
890
891 struct softnic_table_meter_profile *
892 softnic_pipeline_table_meter_profile_find(struct softnic_table *table,
893         uint32_t meter_profile_id);
894
895 struct softnic_table_rule_match_acl {
896         int ip_version;
897
898         RTE_STD_C11
899         union {
900                 struct {
901                         uint32_t sa;
902                         uint32_t da;
903                 } ipv4;
904
905                 struct {
906                         uint8_t sa[16];
907                         uint8_t da[16];
908                 } ipv6;
909         };
910
911         uint32_t sa_depth;
912         uint32_t da_depth;
913         uint16_t sp0;
914         uint16_t sp1;
915         uint16_t dp0;
916         uint16_t dp1;
917         uint8_t proto;
918         uint8_t proto_mask;
919         uint32_t priority;
920 };
921
922 struct softnic_table_rule_match_array {
923         uint32_t pos;
924 };
925
926 struct softnic_table_rule_match_hash {
927         uint8_t key[TABLE_RULE_MATCH_SIZE_MAX];
928 };
929
930 struct softnic_table_rule_match_lpm {
931         int ip_version;
932
933         RTE_STD_C11
934         union {
935                 uint32_t ipv4;
936                 uint8_t ipv6[16];
937         };
938
939         uint8_t depth;
940 };
941
942 struct softnic_table_rule_match {
943         enum softnic_table_type match_type;
944
945         union {
946                 struct softnic_table_rule_match_acl acl;
947                 struct softnic_table_rule_match_array array;
948                 struct softnic_table_rule_match_hash hash;
949                 struct softnic_table_rule_match_lpm lpm;
950         } match;
951 };
952
953 #ifndef SYM_CRYPTO_MAX_KEY_SIZE
954 #define SYM_CRYPTO_MAX_KEY_SIZE         (256)
955 #endif
956 struct softnic_table_rule_action {
957         uint64_t action_mask;
958         struct rte_table_action_fwd_params fwd;
959         struct rte_table_action_lb_params lb;
960         struct rte_table_action_mtr_params mtr;
961         struct rte_table_action_tm_params tm;
962         struct rte_table_action_encap_params encap;
963         struct rte_table_action_nat_params nat;
964         struct rte_table_action_ttl_params ttl;
965         struct rte_table_action_stats_params stats;
966         struct rte_table_action_time_params time;
967         struct rte_table_action_tag_params tag;
968         struct rte_table_action_decap_params decap;
969         struct rte_table_action_sym_crypto_params sym_crypto;
970         uint8_t sym_crypto_key[SYM_CRYPTO_MAX_KEY_SIZE];
971 };
972
973 struct rte_flow {
974         TAILQ_ENTRY(rte_flow) node;
975         struct softnic_table_rule_match match;
976         struct softnic_table_rule_action action;
977         void *data;
978         struct pipeline *pipeline;
979         uint32_t table_id;
980 };
981
982 int
983 softnic_pipeline_port_in_stats_read(struct pmd_internals *p,
984         const char *pipeline_name,
985         uint32_t port_id,
986         struct rte_pipeline_port_in_stats *stats,
987         int clear);
988
989 int
990 softnic_pipeline_port_in_enable(struct pmd_internals *p,
991         const char *pipeline_name,
992         uint32_t port_id);
993
994 int
995 softnic_pipeline_port_in_disable(struct pmd_internals *p,
996         const char *pipeline_name,
997         uint32_t port_id);
998
999 int
1000 softnic_pipeline_port_out_stats_read(struct pmd_internals *p,
1001         const char *pipeline_name,
1002         uint32_t port_id,
1003         struct rte_pipeline_port_out_stats *stats,
1004         int clear);
1005
1006 int
1007 softnic_pipeline_table_stats_read(struct pmd_internals *p,
1008         const char *pipeline_name,
1009         uint32_t table_id,
1010         struct rte_pipeline_table_stats *stats,
1011         int clear);
1012
1013 int
1014 softnic_pipeline_table_rule_add(struct pmd_internals *p,
1015         const char *pipeline_name,
1016         uint32_t table_id,
1017         struct softnic_table_rule_match *match,
1018         struct softnic_table_rule_action *action,
1019         void **data);
1020
1021 int
1022 softnic_pipeline_table_rule_add_bulk(struct pmd_internals *p,
1023         const char *pipeline_name,
1024         uint32_t table_id,
1025         struct softnic_table_rule_match *match,
1026         struct softnic_table_rule_action *action,
1027         void **data,
1028         uint32_t *n_rules);
1029
1030 int
1031 softnic_pipeline_table_rule_add_default(struct pmd_internals *p,
1032         const char *pipeline_name,
1033         uint32_t table_id,
1034         struct softnic_table_rule_action *action,
1035         void **data);
1036
1037 int
1038 softnic_pipeline_table_rule_delete(struct pmd_internals *p,
1039         const char *pipeline_name,
1040         uint32_t table_id,
1041         struct softnic_table_rule_match *match);
1042
1043 int
1044 softnic_pipeline_table_rule_delete_default(struct pmd_internals *p,
1045         const char *pipeline_name,
1046         uint32_t table_id);
1047
1048 int
1049 softnic_pipeline_table_rule_stats_read(struct pmd_internals *p,
1050         const char *pipeline_name,
1051         uint32_t table_id,
1052         void *data,
1053         struct rte_table_action_stats_counters *stats,
1054         int clear);
1055
1056 int
1057 softnic_pipeline_table_mtr_profile_add(struct pmd_internals *p,
1058         const char *pipeline_name,
1059         uint32_t table_id,
1060         uint32_t meter_profile_id,
1061         struct rte_table_action_meter_profile *profile);
1062
1063 int
1064 softnic_pipeline_table_mtr_profile_delete(struct pmd_internals *p,
1065         const char *pipeline_name,
1066         uint32_t table_id,
1067         uint32_t meter_profile_id);
1068
1069 int
1070 softnic_pipeline_table_rule_mtr_read(struct pmd_internals *p,
1071         const char *pipeline_name,
1072         uint32_t table_id,
1073         void *data,
1074         uint32_t tc_mask,
1075         struct rte_table_action_mtr_counters *stats,
1076         int clear);
1077
1078 int
1079 softnic_pipeline_table_dscp_table_update(struct pmd_internals *p,
1080         const char *pipeline_name,
1081         uint32_t table_id,
1082         uint64_t dscp_mask,
1083         struct rte_table_action_dscp_table *dscp_table);
1084
1085 int
1086 softnic_pipeline_table_rule_ttl_read(struct pmd_internals *p,
1087         const char *pipeline_name,
1088         uint32_t table_id,
1089         void *data,
1090         struct rte_table_action_ttl_counters *stats,
1091         int clear);
1092
1093 /**
1094  * Thread
1095  */
1096 int
1097 softnic_thread_init(struct pmd_internals *p);
1098
1099 void
1100 softnic_thread_free(struct pmd_internals *p);
1101
1102 int
1103 softnic_thread_pipeline_enable(struct pmd_internals *p,
1104         uint32_t thread_id,
1105         const char *pipeline_name);
1106
1107 int
1108 softnic_thread_pipeline_disable(struct pmd_internals *p,
1109         uint32_t thread_id,
1110         const char *pipeline_name);
1111
1112 /**
1113  * CLI
1114  */
1115 void
1116 softnic_cli_process(char *in,
1117         char *out,
1118         size_t out_size,
1119         void *arg);
1120
1121 int
1122 softnic_cli_script_process(struct pmd_internals *softnic,
1123         const char *file_name,
1124         size_t msg_in_len_max,
1125         size_t msg_out_len_max);
1126
1127 #endif /* __INCLUDE_RTE_ETH_SOFTNIC_INTERNALS_H__ */