- commit_set_action(odp_actions, OVS_KEY_ATTR_TUN_ID,
- &base->tunnel.tun_id, sizeof(base->tunnel.tun_id));
+ /* A valid IPV4_TUNNEL must have non-zero ip_dst. */
+ if (flow->tunnel.ip_dst) {
+ struct ovs_key_ipv4_tunnel ipv4_tun_key;
+
+ ipv4_tun_key.tun_id = base->tunnel.tun_id;
+ ipv4_tun_key.tun_flags = flow_to_odp_flags(base->tunnel.flags);
+ ipv4_tun_key.ipv4_src = base->tunnel.ip_src;
+ ipv4_tun_key.ipv4_dst = base->tunnel.ip_dst;
+ ipv4_tun_key.ipv4_tos = base->tunnel.ip_tos;
+ ipv4_tun_key.ipv4_ttl = base->tunnel.ip_ttl;
+ memset(&ipv4_tun_key.pad, 0, sizeof ipv4_tun_key.pad);
+
+ commit_set_action(odp_actions, OVS_KEY_ATTR_IPV4_TUNNEL,
+ &ipv4_tun_key, sizeof ipv4_tun_key);
+ } else {
+ commit_set_action(odp_actions, OVS_KEY_ATTR_TUN_ID,
+ &base->tunnel.tun_id, sizeof base->tunnel.tun_id);
+ }