Thanks for the report Solomon

Please apply the following diff to 2.10

diff --git a/lib/conntrack.c b/lib/conntrack.c
index 5410ab4..f36a2eb 100644
--- a/lib/conntrack.c
+++ b/lib/conntrack.c
@@ -2540,16 +2540,18 @@ int
 conntrack_flush(struct conntrack *ct, const uint16_t *zone)
 {
     for (unsigned i = 0; i < CONNTRACK_BUCKETS; i++) {
-        struct conn *conn, *next;
-
-        ct_lock_lock(&ct->buckets[i].lock);
-        HMAP_FOR_EACH_SAFE (conn, next, node, &ct->buckets[i].connections)
{
-            if ((!zone || *zone == conn->key.zone) &&
-                (conn->conn_type == CT_CONN_TYPE_DEFAULT)) {
-                conn_clean(ct, conn, &ct->buckets[i]);
+        struct conntrack_bucket *ctb = &ct->buckets[i];
+        ct_lock_lock(&ctb->lock);
+        for (unsigned j = 0; j < N_CT_TM; j++) {
+            struct conn *conn, *next;
+            LIST_FOR_EACH_SAFE (conn, next, exp_node, &ctb->exp_lists[j]) {
+                if (!zone || *zone == conn->key.zone) {
+                    ovs_assert(conn->conn_type == CT_CONN_TYPE_DEFAULT);
+                    conn_clean(ct, conn, ctb);
+                }
             }
         }
-        ct_lock_unlock(&ct->buckets[i].lock);
+        ct_lock_unlock(&ctb->lock);
     }

     return 0;


which yields conntrack_flush(...) as

int
conntrack_flush(struct conntrack *ct, const uint16_t *zone)
{
    for (unsigned i = 0; i < CONNTRACK_BUCKETS; i++) {
        struct conntrack_bucket *ctb = &ct->buckets[i];
        ct_lock_lock(&ctb->lock);
        for (unsigned j = 0; j < N_CT_TM; j++) {
            struct conn *conn, *next;
            LIST_FOR_EACH_SAFE (conn, next, exp_node, &ctb->exp_lists[j]) {
                if (!zone || *zone == conn->key.zone) {
                    ovs_assert(conn->conn_type == CT_CONN_TYPE_DEFAULT);
                    conn_clean(ct, conn, ctb);
                }
            }
        }
        ct_lock_unlock(&ctb->lock);
    }

    return 0;
}

Thanks Darrell



On Wed, Mar 6, 2019 at 8:06 PM solomon <[email protected]> wrote:

>
>    When i test conntrack, i catch a panic of ovs.
>
> Core was generated by `ovs-vswitchd unix:/var/run/openvswitch/db.sock
> -vconsole:emer -vsyslog:err -vfi'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  0x00005605c5cd7553 in hmap_remove (node=0x7f734cde0218,
> hmap=0x7f8178c7fd70) at ./include/openvswitch/hmap.h:287
> 287         while (*bucket != node) {
> [Current thread is 1 (Thread 0x7f8178dccb00 (LWP 2024338))]
> (gdb) bt
> #0  0x00005605c5cd7553 in hmap_remove (node=0x7f734cde0218,
> hmap=0x7f8178c7fd70) at ./include/openvswitch/hmap.h:287
> #1  conn_clean (ct=ct@entry=0x7f8178c75d98, conn=0x7f734cde0170,
> ctb=ctb@entry=0x7f8178c7fd40) at lib/conntrack.c:815
> #2  0x00005605c5cdd66a in conntrack_flush (ct=0x7f8178c75d98, zone=0x0) at
> lib/conntrack.c:2549
> #3  0x00005605c5bc2b39 in ct_dpif_flush (dpif=0x5605c68a6430,
> zone=zone@entry=0x0, tuple=tuple@entry=0x0) at lib/ct-dpif.c:140
> #4  0x00005605c5ce17a0 in dpctl_flush_conntrack (argc=argc@entry=1,
> argv=argv@entry=0x5605c697ec30, dpctl_p=dpctl_p@entry=0x7fffee718110) at
> lib/dpctl.c:1388
> #5  0x00005605c5cdeb78 in dpctl_unixctl_handler (conn=0x5605c6959ca0,
> argc=1, argv=0x5605c697ec30, aux=0x5605c5ce1610 <dpctl_flush_conntrack>) at
> lib/dpctl.c:2312
> #6  0x00005605c5c806ea in process_command (request=<optimized out>,
> conn=0x5605c6959ca0) at lib/unixctl.c:308
> #7  run_connection (conn=0x5605c6959ca0) at lib/unixctl.c:342
> #8  unixctl_server_run (server=0x5605c6868230) at lib/unixctl.c:393
> #9  0x00005605c5804217 in main (argc=<optimized out>, argv=<optimized
> out>) at vswitchd/ovs-vswitchd.c:126
>
>
> Environment:
> ovs-2.10.1
> dpdk-18.0.2.2
>
> How-To-Repeat:
> 1. configure ovs with snat aciton.
>
> ovs-ofctl  -O OpenFlow15 add-group $br_name "group_id=1, type=select,
> selection_method=hash
> bucket=bucket_id=1,weight:100,actions=ct(nat(src=172.16.1.1-172.255.255.255),commit,table=40)
> "
>
> 2. syn-ddos send tcp syn packet to generate connection tracks.
> 3.
> #   ovs-appctl dpctl/ct-get-nconns
> 2063993
> #   ovs-appctl dpctl/flush-conntrack
>
> 2019-03-07T03:52:24Z|00001|unixctl|WARN|error communicating with
> unix:/var/run/openvswitch/ovs-vswitchd.2024338.ctl: End of file
> ovs-appctl: ovs-vswitchd: transaction error (End of file)
>
>
> --
> Thanks
> Solomon
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to