components/openvswitch/files/lib/dpif-solaris.c
changeset 7590 5461fab14904
parent 7396 8545c0cb4601
--- a/components/openvswitch/files/lib/dpif-solaris.c	Thu Jan 19 14:29:43 2017 -0800
+++ b/components/openvswitch/files/lib/dpif-solaris.c	Thu Jan 19 16:57:09 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -1914,8 +1914,8 @@
 
 		ofpbuf_use_stack(&buf, &state->maskbuf,
 		    sizeof (state->maskbuf));
-		odp_flow_key_from_mask(&buf, &flow->m, &flow->m,
-		    flow->f.in_port.odp_port, SIZE_MAX);
+		odp_flow_key_from_mask(&buf, &flow->m, &flow->f,
+		    UINT32_MAX, SIZE_MAX);
 
 		*mask = ofpbuf_data(&buf);
 		*mask_len = ofpbuf_size(&buf);
@@ -2998,6 +2998,52 @@
 	return (err);
 }
 
+void
+dpif_solaris_send_rarp(const char *name)
+{
+	struct dpif_solaris	*dpif;
+	int			fd = -1;
+	odp_port_t		port_no;
+	boolean_t		port_found = B_FALSE;
+	struct dpif_solaris_port	*port = NULL;
+	uint8_t			hwaddr[ETHERADDRL];
+
+	VLOG_DBG("dpif_get_uplink_fd: getting TX socket for %s\n", name);
+	dpif = get_dp_by_name("ovs-system");
+	if (dpif == NULL) {
+		VLOG_DBG("dpif_solaris_send_rarp: error getting datapath\n");
+		return;
+	}
+	ovs_rwlock_rdlock(&dpif->port_rwlock);
+	HMAP_FOR_EACH(port, node, &dpif->ports) {
+		if (strcmp(port->name, name) == 0) {
+			port_no = port->port_no;
+			port_found = B_TRUE;
+			break;
+		}
+	}
+	ovs_rwlock_unlock(&dpif->port_rwlock);
+	if (!port_found) {
+		VLOG_DBG("dpif_solaris_send_rarp: Error getting port for %s\n",
+		    name);
+		return;
+	}
+
+	if (netdev_get_etheraddr(port->netdev, hwaddr) != 0) {
+		VLOG_DBG("dpif_solaris_send_rarp: Error getting port %s's "
+		    "ethernet address\n", name);
+		return;
+	}
+
+	if (dpif_solaris_get_uplink_port_info(dpif, port_no,
+	    NULL, &fd, NULL) == 0) {
+		if (solaris_send_rarp(fd, hwaddr) == 0)
+			VLOG_DBG("dpif_get_uplink_fd: RARP success!");
+		else
+			VLOG_ERR("dpif_get_uplink_fd: RARP error!");
+	}
+}
+
 const struct dpif_class dpif_solaris_class = {
 	"system",
 	dpif_solaris_enumerate,