}
static void
-tnl_port_init_flow(struct flow *flow, ovs_be32 ip_dst, ovs_be16 udp_port)
+tnl_port_init_flow(struct flow *flow, ovs_be16 udp_port)
{
memset(flow, 0, sizeof *flow);
flow->dl_type = htons(ETH_TYPE_IP);
flow->nw_proto = IPPROTO_GRE;
}
flow->tp_dst = udp_port;
- /* When matching on incoming flow from remove tnl end point,
- * our dst ip address is source ip for them. */
- flow->nw_src = ip_dst;
}
void
-tnl_port_map_insert(odp_port_t port, ovs_be32 ip_dst, ovs_be16 udp_port,
- const char dev_name[])
+tnl_port_map_insert(odp_port_t port, ovs_be16 udp_port, const char dev_name[])
{
const struct cls_rule *cr;
struct tnl_port_in *p;
struct match match;
memset(&match, 0, sizeof match);
- tnl_port_init_flow(&match.flow, ip_dst, udp_port);
+ tnl_port_init_flow(&match.flow, udp_port);
ovs_mutex_lock(&mutex);
do {
match.wc.masks.nw_proto = 0xff;
match.wc.masks.nw_frag = 0xff; /* XXX: No fragments support. */
match.wc.masks.tp_dst = OVS_BE16_MAX;
- match.wc.masks.nw_src = OVS_BE32_MAX;
- cls_rule_init(&p->cr, &match, 0, CLS_MIN_VERSION); /* Priority == 0. */
+ cls_rule_init(&p->cr, &match, 0); /* Priority == 0. */
ovs_refcount_init(&p->ref_cnt);
ovs_strlcpy(p->dev_name, dev_name, sizeof p->dev_name);
- classifier_insert(&cls, &p->cr, NULL, 0);
+ classifier_insert(&cls, &p->cr, CLS_MIN_VERSION, NULL, 0);
}
ovs_mutex_unlock(&mutex);
}
}
void
-tnl_port_map_delete(ovs_be32 ip_dst, ovs_be16 udp_port)
+tnl_port_map_delete(ovs_be16 udp_port)
{
const struct cls_rule *cr;
struct flow flow;
- tnl_port_init_flow(&flow, ip_dst, udp_port);
+ tnl_port_init_flow(&flow, udp_port);
cr = classifier_lookup(&cls, CLS_MAX_VERSION, &flow, NULL);
tnl_port_unref(cr);
size_t key_len, mask_len;
struct flow_wildcards wc;
struct ofpbuf buf;
+ struct odp_flow_key_parms odp_parms = {
+ .flow = &flow,
+ .mask = &wc.masks,
+ };
ds_put_format(&ds, "%s (%"PRIu32") : ", p->dev_name, p->portno);
minimask_expand(&p->cr.match.mask, &wc);
miniflow_expand(&p->cr.match.flow, &flow);
/* Key. */
+ odp_parms.odp_in_port = flow.in_port.odp_port;
+ odp_parms.support.recirc = true;
ofpbuf_use_stack(&buf, &keybuf, sizeof keybuf);
- odp_flow_key_from_flow(&buf, &flow, &wc.masks,
- flow.in_port.odp_port, true);
+ odp_flow_key_from_flow(&odp_parms, &buf);
key = buf.data;
key_len = buf.size;
+
/* mask*/
+ odp_parms.odp_in_port = wc.masks.in_port.odp_port;
+ odp_parms.support.recirc = false;
ofpbuf_use_stack(&buf, &maskbuf, sizeof maskbuf);
- odp_flow_key_from_mask(&buf, &wc.masks, &flow,
- odp_to_u32(wc.masks.in_port.odp_port),
- SIZE_MAX, false);
+ odp_flow_key_from_mask(&odp_parms, &buf);
mask = buf.data;
mask_len = buf.size;