#include <stddef.h>
#include <stdint.h>
+#include <string.h>
#include "classifier.h"
#include "dynamic-string.h"
#include "hash.h"
#include "list.h"
+#include "netdev.h"
#include "ofpbuf.h"
#include "ovs-thread.h"
#include "odp-util.h"
-#include "tnl-arp-cache.h"
#include "ovs-thread.h"
#include "unixctl.h"
#include "util.h"
match.wc.masks.dl_type = OVS_BE16_MAX;
match.wc.masks.nw_proto = 0xff;
- match.wc.masks.nw_frag = 0xff; /* XXX: No fragments support. */
- match.wc.masks.tp_dst = OVS_BE16_MAX;
+ /* XXX: No fragments support. */
+ match.wc.masks.nw_frag = FLOW_NW_FRAG_MASK;
+
+ /* 'udp_port' is zero for non-UDP tunnels (e.g. GRE). In this case it
+ * doesn't make sense to match on UDP port numbers. */
+ if (udp_port) {
+ match.wc.masks.tp_dst = OVS_BE16_MAX;
+ }
if (IN6_IS_ADDR_V4MAPPED(addr)) {
match.wc.masks.nw_dst = OVS_BE32_MAX;
} else {
LIST_FOR_EACH(ip_dev, node, &addr_list) {
if (ip_dev->addr4 != INADDR_ANY) {
- struct in6_addr addr4;
- in6_addr_set_mapped_ipv4(&addr4, ip_dev->addr4);
+ struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
map_insert(p->port, ip_dev->mac, &addr4,
p->udp_port, p->dev_name);
}
}
LIST_FOR_EACH(ip_dev, node, &addr_list) {
if (ip_dev->addr4 != INADDR_ANY) {
- struct in6_addr addr4;
- in6_addr_set_mapped_ipv4(&addr4, ip_dev->addr4);
+ struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
map_delete(ip_dev->mac, &addr4, udp_port);
}
if (ipv6_addr_is_set(&ip_dev->addr6)) {
LIST_FOR_EACH(p, node, &port_list) {
if (ip_dev->addr4 != INADDR_ANY) {
- struct in6_addr addr4;
- in6_addr_set_mapped_ipv4(&addr4, ip_dev->addr4);
+ struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
map_insert(p->port, ip_dev->mac, &addr4,
p->udp_port, p->dev_name);
}
ip_dev->change_seq = netdev_get_change_seq(dev);
error = netdev_get_etheraddr(ip_dev->dev, &ip_dev->mac);
if (error) {
+ free(ip_dev);
return;
}
error4 = netdev_get_in4(ip_dev->dev, (struct in_addr *)&ip_dev->addr4, NULL);
error6 = netdev_get_in6(ip_dev->dev, &ip_dev->addr6);
if (error4 && error6) {
+ free(ip_dev);
return;
}
ovs_strlcpy(ip_dev->dev_name, netdev_get_name(dev), sizeof ip_dev->dev_name);
LIST_FOR_EACH(p, node, &port_list) {
if (ip_dev->addr4 != INADDR_ANY) {
- struct in6_addr addr4;
- in6_addr_set_mapped_ipv4(&addr4, ip_dev->addr4);
+ struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4);
map_delete(ip_dev->mac, &addr4, p->udp_port);
}
if (ipv6_addr_is_set(&ip_dev->addr6)) {