ITEM_META_DATA,
ITEM_GRE_KEY,
ITEM_GRE_KEY_VALUE,
+ ITEM_GRE_OPTION,
+ ITEM_GRE_OPTION_CHECKSUM,
+ ITEM_GRE_OPTION_KEY,
+ ITEM_GRE_OPTION_SEQUENCE,
ITEM_GTP_PSC,
ITEM_GTP_PSC_QFI,
ITEM_GTP_PSC_PDU_T,
ITEM_ICMP6_ND_OPT_TLA_ETH,
ITEM_META,
ITEM_GRE_KEY,
+ ITEM_GRE_OPTION,
ITEM_GTP_PSC,
ITEM_PPPOES,
ITEM_PPPOED,
ZERO,
};
+static const enum index item_gre_option[] = {
+ ITEM_GRE_OPTION_CHECKSUM,
+ ITEM_GRE_OPTION_KEY,
+ ITEM_GRE_OPTION_SEQUENCE,
+ ITEM_NEXT,
+ ZERO,
+};
+
static const enum index item_gtp[] = {
ITEM_GTP_FLAGS,
ITEM_GTP_MSG_TYPE,
item_param),
.args = ARGS(ARG_ENTRY_HTON(rte_be32_t)),
},
+ [ITEM_GRE_OPTION] = {
+ .name = "gre_option",
+ .help = "match GRE optional fields",
+ .priv = PRIV_ITEM(GRE_OPTION,
+ sizeof(struct rte_flow_item_gre_opt)),
+ .next = NEXT(item_gre_option),
+ .call = parse_vc,
+ },
+ [ITEM_GRE_OPTION_CHECKSUM] = {
+ .name = "checksum",
+ .help = "match GRE checksum",
+ .next = NEXT(item_gre_option, NEXT_ENTRY(COMMON_UNSIGNED),
+ item_param),
+ .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre_opt,
+ checksum_rsvd.checksum)),
+ },
+ [ITEM_GRE_OPTION_KEY] = {
+ .name = "key",
+ .help = "match GRE key",
+ .next = NEXT(item_gre_option, NEXT_ENTRY(COMMON_UNSIGNED),
+ item_param),
+ .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre_opt,
+ key.key)),
+ },
+ [ITEM_GRE_OPTION_SEQUENCE] = {
+ .name = "sequence",
+ .help = "match GRE sequence",
+ .next = NEXT(item_gre_option, NEXT_ENTRY(COMMON_UNSIGNED),
+ item_param),
+ .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre_opt,
+ sequence.sequence)),
+ },
[ITEM_GTP_PSC] = {
.name = "gtp_psc",
.help = "match GTP extension header with type 0x85",
((const struct rte_flow_item_flex *)
item->spec)->length : 0;
break;
+ case RTE_FLOW_ITEM_TYPE_GRE_OPTION:
+ size = 0;
+ if (item->spec) {
+ const struct rte_flow_item_gre_opt
+ *opt = item->spec;
+ if (opt->checksum_rsvd.checksum) {
+ *total_size +=
+ sizeof(opt->checksum_rsvd);
+ rte_memcpy(data_tail - (*total_size),
+ &opt->checksum_rsvd,
+ sizeof(opt->checksum_rsvd));
+ }
+ if (opt->key.key) {
+ *total_size += sizeof(opt->key.key);
+ rte_memcpy(data_tail - (*total_size),
+ &opt->key.key,
+ sizeof(opt->key.key));
+ }
+ if (opt->sequence.sequence) {
+ *total_size += sizeof(opt->sequence.sequence);
+ rte_memcpy(data_tail - (*total_size),
+ &opt->sequence.sequence,
+ sizeof(opt->sequence.sequence));
+ }
+ }
+ proto = 0x2F;
+ break;
default:
fprintf(stderr, "Error - Not supported item\n");
goto error;