struct flow_keys *keys1 = &f1->fkeys;
        struct flow_keys *keys2 = &f2->fkeys;
 
-       if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src &&
-           keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst &&
-           keys1->ports.ports == keys2->ports.ports &&
-           keys1->basic.ip_proto == keys2->basic.ip_proto &&
-           keys1->basic.n_proto == keys2->basic.n_proto &&
+       if (keys1->basic.n_proto != keys2->basic.n_proto ||
+           keys1->basic.ip_proto != keys2->basic.ip_proto)
+               return false;
+
+       if (keys1->basic.n_proto == htons(ETH_P_IP)) {
+               if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src ||
+                   keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst)
+                       return false;
+       } else {
+               if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src,
+                          sizeof(keys1->addrs.v6addrs.src)) ||
+                   memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst,
+                          sizeof(keys1->addrs.v6addrs.dst)))
+                       return false;
+       }
+
+       if (keys1->ports.ports == keys2->ports.ports &&
            keys1->control.flags == keys2->control.flags &&
            ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
            ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))