X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_pipeline%2Frte_table_action.c;h=8a2bb13dc79189387177b6a38b75a288dc35fe61;hb=efad0db1ff58461a53d803bc4df1820cbb3ae500;hp=fb7eaf91807a9f4575942833865e0a416535333d;hpb=a63e06d7068897171645043fbe8ee4c6264d9d3a;p=dpdk.git diff --git a/lib/librte_pipeline/rte_table_action.c b/lib/librte_pipeline/rte_table_action.c index fb7eaf9180..8a2bb13dc7 100644 --- a/lib/librte_pipeline/rte_table_action.c +++ b/lib/librte_pipeline/rte_table_action.c @@ -107,14 +107,6 @@ mtr_cfg_check(struct rte_table_action_mtr_config *mtr) return 0; } -#define MBUF_SCHED_QUEUE_TC_COLOR(queue, tc, color) \ - ((uint16_t)((((uint64_t)(queue)) & 0x3) | \ - ((((uint64_t)(tc)) & 0x3) << 2) | \ - ((((uint64_t)(color)) & 0x3) << 4))) - -#define MBUF_SCHED_COLOR(sched, color) \ - (((sched) & (~0x30LLU)) | ((color) << 4)) - struct mtr_trtcm_data { struct rte_meter_trtcm trtcm; uint64_t stats[e_RTE_METER_COLORS]; @@ -176,7 +168,7 @@ mtr_data_size(struct rte_table_action_mtr_config *mtr) struct dscp_table_entry_data { enum rte_meter_color color; uint16_t tc; - uint16_t queue_tc_color; + uint16_t tc_queue; }; struct dscp_table_data { @@ -319,8 +311,7 @@ pkt_work_mtr(struct rte_mbuf *mbuf, uint32_t dscp, uint16_t total_length) { - uint64_t drop_mask, sched; - uint64_t *sched_ptr = (uint64_t *) &mbuf->hash.sched; + uint64_t drop_mask; struct dscp_table_entry_data *dscp_entry = &dscp_table->entry[dscp]; enum rte_meter_color color_in, color_meter, color_policer; uint32_t tc, mp_id; @@ -329,7 +320,6 @@ pkt_work_mtr(struct rte_mbuf *mbuf, color_in = dscp_entry->color; data += tc; mp_id = MTR_TRTCM_DATA_METER_PROFILE_ID_GET(data); - sched = *sched_ptr; /* Meter */ color_meter = rte_meter_trtcm_color_aware_check( @@ -346,7 +336,7 @@ pkt_work_mtr(struct rte_mbuf *mbuf, drop_mask = MTR_TRTCM_DATA_POLICER_ACTION_DROP_GET(data, color_meter); color_policer = MTR_TRTCM_DATA_POLICER_ACTION_COLOR_GET(data, color_meter); - *sched_ptr = MBUF_SCHED_COLOR(sched, color_policer); + rte_mbuf_sched_color_set(mbuf, (uint8_t)color_policer); return drop_mask; } @@ -368,9 +358,8 @@ tm_cfg_check(struct rte_table_action_tm_config *tm) } struct tm_data { - uint16_t queue_tc_color; - uint16_t subport; - uint32_t pipe; + uint32_t queue_id; + uint32_t reserved; } __attribute__((__packed__)); static int @@ -397,9 +386,9 @@ tm_apply(struct tm_data *data, return status; /* Apply */ - data->queue_tc_color = 0; - data->subport = (uint16_t) p->subport_id; - data->pipe = p->pipe_id; + data->queue_id = p->subport_id << + (__builtin_ctz(cfg->n_pipes_per_subport) + 4) | + p->pipe_id << 4; return 0; } @@ -411,12 +400,11 @@ pkt_work_tm(struct rte_mbuf *mbuf, uint32_t dscp) { struct dscp_table_entry_data *dscp_entry = &dscp_table->entry[dscp]; - struct tm_data *sched_ptr = (struct tm_data *) &mbuf->hash.sched; - struct tm_data sched; - - sched = *data; - sched.queue_tc_color = dscp_entry->queue_tc_color; - *sched_ptr = sched; + uint32_t queue_id = data->queue_id | + (dscp_entry->tc << 2) | + dscp_entry->tc_queue; + rte_mbuf_sched_set(mbuf, queue_id, dscp_entry->tc, + (uint8_t)dscp_entry->color); } /** @@ -1694,10 +1682,9 @@ get_block_size(const struct rte_crypto_sym_xform *xform, uint8_t cdev_id) rte_cryptodev_info_get(cdev_id, &dev_info); - for (i = 0;; i++) { + for (i = 0; dev_info.capabilities[i].op != RTE_CRYPTO_OP_TYPE_UNDEFINED; + i++) { cap = &dev_info.capabilities[i]; - if (!cap) - break; if (cap->sym.xform_type != xform->type) continue; @@ -2055,6 +2042,83 @@ pkt4_work_tag(struct rte_mbuf *mbuf0, mbuf3->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; } +/** + * RTE_TABLE_ACTION_DECAP + */ +struct decap_data { + uint16_t n; +} __attribute__((__packed__)); + +static int +decap_apply(struct decap_data *data, + struct rte_table_action_decap_params *p) +{ + data->n = p->n; + return 0; +} + +static __rte_always_inline void +pkt_work_decap(struct rte_mbuf *mbuf, + struct decap_data *data) +{ + uint16_t data_off = mbuf->data_off; + uint16_t data_len = mbuf->data_len; + uint32_t pkt_len = mbuf->pkt_len; + uint16_t n = data->n; + + mbuf->data_off = data_off + n; + mbuf->data_len = data_len - n; + mbuf->pkt_len = pkt_len - n; +} + +static __rte_always_inline void +pkt4_work_decap(struct rte_mbuf *mbuf0, + struct rte_mbuf *mbuf1, + struct rte_mbuf *mbuf2, + struct rte_mbuf *mbuf3, + struct decap_data *data0, + struct decap_data *data1, + struct decap_data *data2, + struct decap_data *data3) +{ + uint16_t data_off0 = mbuf0->data_off; + uint16_t data_len0 = mbuf0->data_len; + uint32_t pkt_len0 = mbuf0->pkt_len; + + uint16_t data_off1 = mbuf1->data_off; + uint16_t data_len1 = mbuf1->data_len; + uint32_t pkt_len1 = mbuf1->pkt_len; + + uint16_t data_off2 = mbuf2->data_off; + uint16_t data_len2 = mbuf2->data_len; + uint32_t pkt_len2 = mbuf2->pkt_len; + + uint16_t data_off3 = mbuf3->data_off; + uint16_t data_len3 = mbuf3->data_len; + uint32_t pkt_len3 = mbuf3->pkt_len; + + uint16_t n0 = data0->n; + uint16_t n1 = data1->n; + uint16_t n2 = data2->n; + uint16_t n3 = data3->n; + + mbuf0->data_off = data_off0 + n0; + mbuf0->data_len = data_len0 - n0; + mbuf0->pkt_len = pkt_len0 - n0; + + mbuf1->data_off = data_off1 + n1; + mbuf1->data_len = data_len1 - n1; + mbuf1->pkt_len = pkt_len1 - n1; + + mbuf2->data_off = data_off2 + n2; + mbuf2->data_len = data_len2 - n2; + mbuf2->pkt_len = pkt_len2 - n2; + + mbuf3->data_off = data_off3 + n3; + mbuf3->data_len = data_len3 - n3; + mbuf3->pkt_len = pkt_len3 - n3; +} + /** * Action profile */ @@ -2073,6 +2137,7 @@ action_valid(enum rte_table_action_type action) case RTE_TABLE_ACTION_TIME: case RTE_TABLE_ACTION_SYM_CRYPTO: case RTE_TABLE_ACTION_TAG: + case RTE_TABLE_ACTION_DECAP: return 1; default: return 0; @@ -2210,6 +2275,9 @@ action_data_size(enum rte_table_action_type action, case RTE_TABLE_ACTION_TAG: return sizeof(struct tag_data); + case RTE_TABLE_ACTION_DECAP: + return sizeof(struct decap_data); + default: return 0; } @@ -2471,6 +2539,10 @@ rte_table_action_apply(struct rte_table_action *action, return tag_apply(action_data, action_params); + case RTE_TABLE_ACTION_DECAP: + return decap_apply(action_data, + action_params); + default: return -EINVAL; } @@ -2496,17 +2568,13 @@ rte_table_action_dscp_table_update(struct rte_table_action *action, &action->dscp_table.entry[i]; struct rte_table_action_dscp_table_entry *entry = &table->entry[i]; - uint16_t queue_tc_color = - MBUF_SCHED_QUEUE_TC_COLOR(entry->tc_queue_id, - entry->tc_id, - entry->color); if ((dscp_mask & (1LLU << i)) == 0) continue; data->color = entry->color; data->tc = entry->tc_id; - data->queue_tc_color = queue_tc_color; + data->tc_queue = entry->tc_queue_id; } return 0; @@ -2801,6 +2869,14 @@ pkt_work(struct rte_mbuf *mbuf, dscp); } + if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) { + void *data = action_data_get(table_entry, + action, + RTE_TABLE_ACTION_DECAP); + + pkt_work_decap(mbuf, data); + } + if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) { void *data = action_data_get(table_entry, action, RTE_TABLE_ACTION_ENCAP); @@ -3034,6 +3110,24 @@ pkt4_work(struct rte_mbuf **mbufs, dscp3); } + if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) { + void *data0 = action_data_get(table_entry0, + action, + RTE_TABLE_ACTION_DECAP); + void *data1 = action_data_get(table_entry1, + action, + RTE_TABLE_ACTION_DECAP); + void *data2 = action_data_get(table_entry2, + action, + RTE_TABLE_ACTION_DECAP); + void *data3 = action_data_get(table_entry3, + action, + RTE_TABLE_ACTION_DECAP); + + pkt4_work_decap(mbuf0, mbuf1, mbuf2, mbuf3, + data0, data1, data2, data3); + } + if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) { void *data0 = action_data_get(table_entry0, action, RTE_TABLE_ACTION_ENCAP);