Store a full rte_flow description. */
| 1156 | |
| 1157 | /** Store a full rte_flow description. */ |
| 1158 | size_t |
| 1159 | rte_flow_copy(struct rte_flow_desc *desc, size_t len, |
| 1160 | const struct rte_flow_attr *attr, |
| 1161 | const struct rte_flow_item *items, |
| 1162 | const struct rte_flow_action *actions) |
| 1163 | { |
| 1164 | /* |
| 1165 | * Overlap struct rte_flow_conv with struct rte_flow_desc in order |
| 1166 | * to convert the former to the latter without wasting space. |
| 1167 | */ |
| 1168 | struct rte_flow_conv_rule *dst = |
| 1169 | len ? |
| 1170 | (void *)((uintptr_t)desc + |
| 1171 | (offsetof(struct rte_flow_desc, actions) - |
| 1172 | offsetof(struct rte_flow_conv_rule, actions))) : |
| 1173 | NULL; |
| 1174 | size_t dst_size = |
| 1175 | len > sizeof(*desc) - sizeof(*dst) ? |
| 1176 | len - (sizeof(*desc) - sizeof(*dst)) : |
| 1177 | 0; |
| 1178 | struct rte_flow_conv_rule src = { |
| 1179 | .attr_ro = NULL, |
| 1180 | .pattern_ro = items, |
| 1181 | .actions_ro = actions, |
| 1182 | }; |
| 1183 | int ret; |
| 1184 | |
| 1185 | RTE_BUILD_BUG_ON(sizeof(struct rte_flow_desc) < |
| 1186 | sizeof(struct rte_flow_conv_rule)); |
| 1187 | if (dst_size && |
| 1188 | (&dst->pattern != &desc->items || |
| 1189 | &dst->actions != &desc->actions || |
| 1190 | (uintptr_t)(dst + 1) != (uintptr_t)(desc + 1))) { |
| 1191 | rte_errno = EINVAL; |
| 1192 | return 0; |
| 1193 | } |
| 1194 | ret = rte_flow_conv(RTE_FLOW_CONV_OP_RULE, dst, dst_size, &src, NULL); |
| 1195 | if (ret < 0) |
| 1196 | return 0; |
| 1197 | ret += sizeof(*desc) - sizeof(*dst); |
| 1198 | rte_memcpy(desc, |
| 1199 | (&(struct rte_flow_desc){ |
| 1200 | .size = ret, |
| 1201 | .attr = *attr, |
| 1202 | .items = dst_size ? dst->pattern : NULL, |
| 1203 | .actions = dst_size ? dst->actions : NULL, |
| 1204 | }), |
| 1205 | len > sizeof(*desc) ? sizeof(*desc) : len); |
| 1206 | |
| 1207 | rte_flow_trace_copy(desc, len, attr, items, actions, ret); |
| 1208 | |
| 1209 | return ret; |
| 1210 | } |
| 1211 | |
| 1212 | int |
| 1213 | rte_flow_dev_dump(uint16_t port_id, struct rte_flow *flow, |
nothing calls this directly
no test coverage detected