[ovs-dev] [PATCH RFC 2/2] openvswitch: Userspace tunneling.

Jarno Rajahalme jrajahalme at nicira.com
Thu Oct 9 22:41:41 UTC 2014


Some more comments:

(snip)

>> +}
>> +
>> +static void
>> +tnl_port_unref(struct cls_rule *cr)
>> +{
>> +    if (cr) {
>> +        struct tunnel_ports *p;
>> +
>> +        p = tnl_port_cast(cr);
>> +        if (ovs_refcount_unref_relaxed(&p->ref_cnt) == 1) {
>> +           classifier_remove(&cls, cr);

You must also free the resources with ovsrcu_postpone() here:

- must call cls_rule_destroy(cr)
- must free the tunnel port

>> +        }
>> +    }
>> +}
>> +

(snip)

>> +
>> +static void
>> +tnl_route_del(struct unixctl_conn *conn, int argc OVS_UNUSED,
>> +              const char *argv[], void *aux OVS_UNUSED)
>> +{
>> +    struct cls_rule *cr;
>> +    struct flow flow;
>> +    ovs_be32 ip, mask;
>> +
>> +    inet_aton(argv[1], (struct in_addr *)&ip);
>> +    inet_aton(argv[2], (struct in_addr *)&mask);
>> +
>> +    ovs_mutex_lock(&mutex);
>> +    memset(&flow, 0, sizeof(flow));
>> +    flow.nw_dst = ip & mask;
>> +
>> +    cr = classifier_lookup(&cls, &flow, NULL);
>> +    if (cr) {
>> +        classifier_remove(&cls, cr);


You must also free the resources with ovsrcu_postpone() here:

- must call cls_rule_destroy(cr)
- must free the tunnel route entry

>> +        version++;
>> +        unixctl_command_reply(conn, "OK");
>> +    } else {
>> +        unixctl_command_reply(conn, "Not found");
>> +    }
>> +
>> +    ovs_mutex_unlock(&mutex);
> 
> This is a bit of a bummer, but locking here is necessary to make sure that the ‘cr’ still exists in the classifier when classifier_remove is called. We should add a new function to take care of this (like classifier_remove_flow(&cls, &flow, priority) finds the exact matching rule and removes it if found.)
> 

   Jarno




More information about the dev mailing list