components/openvswitch/files/lib/dpif-solaris.c
changeset 6556 692ea531a2fc
parent 6538 a53c8be7d7b3
child 6557 dc9edc6fb773
equal deleted inserted replaced
6555:321727f908b3 6556:692ea531a2fc
   163 static int dpif_solaris_get_port_by_number(struct dpif_solaris *dpif,
   163 static int dpif_solaris_get_port_by_number(struct dpif_solaris *dpif,
   164     odp_port_t port_no, struct dpif_solaris_port **portp)
   164     odp_port_t port_no, struct dpif_solaris_port **portp)
   165     OVS_REQ_RDLOCK(dpif->port_rwlock);
   165     OVS_REQ_RDLOCK(dpif->port_rwlock);
   166 static int
   166 static int
   167 dpif_solaris_get_uplink_port_info(struct dpif_solaris *dpif,
   167 dpif_solaris_get_uplink_port_info(struct dpif_solaris *dpif,
   168     odp_port_t port_no, odp_port_t *uport_nop, int *xfdp);
   168     odp_port_t port_no, odp_port_t *uport_nop, int *xfdp,
       
   169     enum ovs_vport_type *vtypep);
   169 static void dpif_solaris_flow_remove(struct dpif_solaris *dpif,
   170 static void dpif_solaris_flow_remove(struct dpif_solaris *dpif,
   170     struct dpif_solaris_flow *flow)
   171     struct dpif_solaris_flow *flow)
   171     OVS_REQ_WRLOCK(dpif->flow_rwlock);
   172     OVS_REQ_WRLOCK(dpif->flow_rwlock);
   172 static int dpif_solaris_flow_flush__(struct dpif_solaris *dpif);
   173 static int dpif_solaris_flow_flush__(struct dpif_solaris *dpif);
   173 
   174 
   855 	return (ENOENT);
   856 	return (ENOENT);
   856 }
   857 }
   857 
   858 
   858 static int
   859 static int
   859 dpif_solaris_get_uplink_port_info(struct dpif_solaris *dpif,
   860 dpif_solaris_get_uplink_port_info(struct dpif_solaris *dpif,
   860     odp_port_t port_no, odp_port_t *uport_nop, int *xfdp)
   861     odp_port_t port_no, odp_port_t *uport_nop, int *xfdp,
       
   862     enum ovs_vport_type *vtypep)
   861 {
   863 {
   862 	struct dpif_solaris_port *port, *uport;
   864 	struct dpif_solaris_port *port, *uport;
   863 
   865 
   864 	ovs_rwlock_rdlock(&dpif->port_rwlock);
   866 	ovs_rwlock_rdlock(&dpif->port_rwlock);
   865 	HMAP_FOR_EACH(port, node, &dpif->ports)
   867 	HMAP_FOR_EACH(port, node, &dpif->ports)
   866 		if (port->port_no == port_no)
   868 		if (port->port_no == port_no)
   867 			break;
   869 			break;
   868 
   870 
   869 	if (port == NULL)
   871 	if (port == NULL)
   870 		goto done;
   872 		goto done;
       
   873 
       
   874 	if (vtypep != NULL)
       
   875 		*vtypep = port->vtype;
   871 
   876 
   872 	HMAP_FOR_EACH(uport, node, &dpif->ports) {
   877 	HMAP_FOR_EACH(uport, node, &dpif->ports) {
   873 		if (uport->is_uplink &&
   878 		if (uport->is_uplink &&
   874 		    strcmp(port->physname, uport->linkname) == 0) {
   879 		    strcmp(port->physname, uport->linkname) == 0) {
   875 			if (uport_nop != NULL)
   880 			if (uport_nop != NULL)
  1378 	ovs_rwlock_wrlock(&dpif->port_rwlock);
  1383 	ovs_rwlock_wrlock(&dpif->port_rwlock);
  1379 	error = dpif_solaris_get_port_by_number(dpif, outport, &port);
  1384 	error = dpif_solaris_get_port_by_number(dpif, outport, &port);
  1380 	ovs_rwlock_unlock(&dpif->port_rwlock);
  1385 	ovs_rwlock_unlock(&dpif->port_rwlock);
  1381 	if (error != 0) {
  1386 	if (error != 0) {
  1382 		VLOG_DBG("dpif_solaris_get_priority_details: "
  1387 		VLOG_DBG("dpif_solaris_get_priority_details: "
  1383 		"Error getting port %d\n", outport);
  1388 		"failed to get port %d\n", outport);
  1384 		return (error);
  1389 		return (error);
  1385 	}
  1390 	}
  1386 
  1391 
  1387 	netdev = port->netdev;
  1392 	netdev = port->netdev;
  1388 	error = netdev_get_queue(netdev, queueid, details);
  1393 	error = netdev_get_queue(netdev, queueid, details);
  1389 	if (error != 0) {
  1394 	if (error != 0) {
  1390 		VLOG_DBG("dpif_solaris_get_priority_details: "
  1395 		VLOG_DBG("dpif_solaris_get_priority_details: "
  1391 		" Error getting queue %d\n", queueid);
  1396 		"failed to get queue %d\n", queueid);
  1392 		return (error);
  1397 		return (error);
  1393 	}
  1398 	}
  1394 	VLOG_DBG("dpif_solaris_get_priority_details: done");
  1399 	VLOG_DBG("dpif_solaris_get_priority_details: done");
  1395 	return (0);
  1400 	return (0);
  1396 }
  1401 }
  1503 					dpif_solaris_flow_remove(dpif,
  1508 					dpif_solaris_flow_remove(dpif,
  1504 					    solaris_flow);
  1509 					    solaris_flow);
  1505 				}
  1510 				}
  1506 			} else {
  1511 			} else {
  1507 				VLOG_DBG("dpif_solaris_flow_put(): "
  1512 				VLOG_DBG("dpif_solaris_flow_put(): "
  1508 				    "Error getting inport %d\n", inport);
  1513 				    "failed to get inport %d\n", inport);
  1509 			}
  1514 			}
  1510 		} else {
  1515 		} else {
  1511 			VLOG_ERR("dpif_solaris_flow_put mask %s "
  1516 			VLOG_ERR("dpif_solaris_flow_put mask %s "
  1512 			    "actions %s not found", ds_cstr(&fs),
  1517 			    "actions %s not found", ds_cstr(&fs),
  1513 			    ds_cstr(&as));
  1518 			    ds_cstr(&as));
  1886 	int		error, fd = -1;
  1891 	int		error, fd = -1;
  1887 
  1892 
  1888 	VLOG_DBG("dpif_solaris_port_output %d tunnel %ld", port_no,
  1893 	VLOG_DBG("dpif_solaris_port_output %d tunnel %ld", port_no,
  1889 	    tnl == NULL ? 0 : tnl->tun_id);
  1894 	    tnl == NULL ? 0 : tnl->tun_id);
  1890 
  1895 
  1891 	error = dpif_solaris_get_uplink_port_info(dpif, port_no, NULL, &fd);
  1896 	error = dpif_solaris_get_uplink_port_info(dpif, port_no, NULL,
       
  1897 	    &fd, NULL);
  1892 	if (error != 0 || fd == -1) {
  1898 	if (error != 0 || fd == -1) {
  1893 		if (may_steal) {
  1899 		if (may_steal) {
  1894 			ofpbuf_delete(packet);
  1900 			ofpbuf_delete(packet);
  1895 		}
  1901 		}
  1896 		return (error);
  1902 		return (error);
  2083 {
  2089 {
  2084 	struct dpif_solaris *dpif = aux_;
  2090 	struct dpif_solaris *dpif = aux_;
  2085 	int type = nl_attr_type(a);
  2091 	int type = nl_attr_type(a);
  2086 	odp_port_t pin, pout;
  2092 	odp_port_t pin, pout;
  2087 	struct flow_tnl *tnl = NULL;
  2093 	struct flow_tnl *tnl = NULL;
       
  2094 	enum ovs_vport_type vtype;
  2088 	int err;
  2095 	int err;
  2089 
  2096 
  2090 	VLOG_DBG("dp_solaris_execute_cb type %d", type);
  2097 	VLOG_DBG("dp_solaris_execute_cb type %d", type);
  2091 
  2098 
  2092 	switch ((enum ovs_action_attr)type) {
  2099 	switch ((enum ovs_action_attr)type) {
  2099 		    "%d: inport is %d", port_no, md->in_port.odp_port);
  2106 		    "%d: inport is %d", port_no, md->in_port.odp_port);
  2100 
  2107 
  2101 		/*
  2108 		/*
  2102 		 * If in_port number is OFPP_NONE, this means this packet out
  2109 		 * If in_port number is OFPP_NONE, this means this packet out
  2103 		 * request comes from the controller.
  2110 		 * request comes from the controller.
       
  2111 		 *
       
  2112 		 * if the in or outport is the internal port, and its uplink
       
  2113 		 * can not be found, it means there is no physical uplink
       
  2114 		 * added to the bridge yet, directly drop the packet.
  2104 		 */
  2115 		 */
  2105 		if (md->in_port.odp_port != ODPP_NONE) {
  2116 		if (md->in_port.odp_port != ODPP_NONE) {
  2106 			err = dpif_solaris_get_uplink_port_info(dpif,
  2117 			err = dpif_solaris_get_uplink_port_info(dpif,
  2107 			    md->in_port.odp_port, &pin, NULL);
  2118 			    md->in_port.odp_port, &pin, NULL, &vtype);
  2108 			if (err != 0) {
  2119 			if (err != 0) {
  2109 				VLOG_DBG("dp_solaris_execute_cb "
  2120 				if (vtype != OVS_VPORT_TYPE_INTERNAL) {
  2110 				    "OVS_ACTION_ATTR_OUTPUT Error getting "
  2121 					VLOG_DBG("dp_solaris_execute_cb "
  2111 				    "uplink for inport %d ",
  2122 					    "OVS_ACTION_ATTR_OUTPUT failed to"
  2112 				    md->in_port.odp_port);
  2123 					    "get uplink for inport %d ",
       
  2124 					    md->in_port.odp_port);
       
  2125 				}
  2113 				if (may_steal)
  2126 				if (may_steal)
  2114 					ofpbuf_delete(packet);
  2127 					ofpbuf_delete(packet);
  2115 				break;
  2128 				break;
  2116 			}
  2129 			}
  2117 			err = dpif_solaris_get_uplink_port_info(dpif, port_no,
  2130 			err = dpif_solaris_get_uplink_port_info(dpif, port_no,
  2118 			    &pout, NULL);
  2131 			    &pout, NULL, &vtype);
  2119 			if (err != 0) {
  2132 			if (err != 0) {
  2120 				VLOG_DBG("dp_solaris_execute_cb "
  2133 				if (vtype != OVS_VPORT_TYPE_INTERNAL) {
  2121 				    "OVS_ACTION_ATTR_OUTPUT Error getting "
  2134 					VLOG_DBG("dp_solaris_execute_cb "
  2122 				    "uplink for outport %d ", port_no);
  2135 					    "OVS_ACTION_ATTR_OUTPUT failed to "
       
  2136 					    "get uplink for outport %d",
       
  2137 					    port_no);
       
  2138 				}
  2123 				if (may_steal)
  2139 				if (may_steal)
  2124 					ofpbuf_delete(packet);
  2140 					ofpbuf_delete(packet);
  2125 				break;
  2141 				break;
  2126 			}
  2142 			}
  2127 			/*
  2143 			/*
  2158 	 */
  2174 	 */
  2159 	case OVS_ACTION_ATTR_USERSPACE:	{	/* controller */
  2175 	case OVS_ACTION_ATTR_USERSPACE:	{	/* controller */
  2160 		VLOG_DBG("dp_solaris_execute_cb OVS_ACTION_ATTR_USERSPACE");
  2176 		VLOG_DBG("dp_solaris_execute_cb OVS_ACTION_ATTR_USERSPACE");
  2161 
  2177 
  2162 		err = dpif_solaris_get_uplink_port_info(dpif,
  2178 		err = dpif_solaris_get_uplink_port_info(dpif,
  2163 		    md->in_port.odp_port, &pin, NULL);
  2179 		    md->in_port.odp_port, &pin, NULL, &vtype);
  2164 		if (err != 0) {
  2180 		if (err != 0) {
  2165 			VLOG_DBG("dp_solaris_execute_cb OVS_ACTION_ATTR_OUTPUT "
  2181 			if (vtype != OVS_VPORT_TYPE_INTERNAL) {
  2166 			    "Error getting uplink for inport %d",
  2182 				VLOG_DBG("dp_solaris_execute_cb "
  2167 			    md->in_port.odp_port);
  2183 				    "OVS_ACTION_ATTR_USERSPACE failed to get "
       
  2184 				    "uplink for inport %d",
       
  2185 				    md->in_port.odp_port);
       
  2186 			} else {
       
  2187 				VLOG_DBG("dp_solaris_execute_cb "
       
  2188 				    "OVS_ACTION_ATTR_USERSPACE from an internal"
       
  2189 				    "port %d which is not associated with a "
       
  2190 				    "physical uplink",
       
  2191 				    md->in_port.odp_port);
       
  2192 			}
  2168 			if (may_steal)
  2193 			if (may_steal)
  2169 				ofpbuf_delete(packet);
  2194 				ofpbuf_delete(packet);
  2170 			break;
  2195 			break;
  2171 		}
  2196 		}
  2172 		if (md->tunnel.ip_dst)
  2197 		if (md->tunnel.ip_dst)