diff options
Diffstat (limited to 'drivers/net/xen-netback')
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 5 | ||||
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 64 | 
2 files changed, 25 insertions, 44 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 74dc2bf71428..e30ffd29b7e9 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -302,7 +302,7 @@ static int xenvif_close(struct net_device *dev)  static int xenvif_change_mtu(struct net_device *dev, int mtu)  {  	struct xenvif *vif = netdev_priv(dev); -	int max = vif->can_sg ? 65535 - VLAN_ETH_HLEN : ETH_DATA_LEN; +	int max = vif->can_sg ? ETH_MAX_MTU - VLAN_ETH_HLEN : ETH_DATA_LEN;  	if (mtu > max)  		return -EINVAL; @@ -471,6 +471,9 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,  	dev->tx_queue_len = XENVIF_QUEUE_LENGTH; +	dev->min_mtu = 0; +	dev->max_mtu = ETH_MAX_MTU - VLAN_ETH_HLEN; +  	/*  	 * Initialise a dummy MAC address. We choose the numerically  	 * largest non-broadcast address to prevent the address getting diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 8674e188b697..3124eaec9427 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -785,12 +785,9 @@ static void xen_mcast_ctrl_changed(struct xenbus_watch *watch,  	struct xenvif *vif = container_of(watch, struct xenvif,  					  mcast_ctrl_watch);  	struct xenbus_device *dev = xenvif_to_xenbus_device(vif); -	int val; -	if (xenbus_scanf(XBT_NIL, dev->otherend, -			 "request-multicast-control", "%d", &val) < 0) -		val = 0; -	vif->multicast_control = !!val; +	vif->multicast_control = !!xenbus_read_unsigned(dev->otherend, +					"request-multicast-control", 0);  }  static int xen_register_mcast_ctrl_watch(struct xenbus_device *dev, @@ -889,16 +886,16 @@ static int connect_ctrl_ring(struct backend_info *be)  	unsigned int evtchn;  	int err; -	err = xenbus_gather(XBT_NIL, dev->otherend, -			    "ctrl-ring-ref", "%u", &val, NULL); -	if (err) +	err = xenbus_scanf(XBT_NIL, dev->otherend, +			   "ctrl-ring-ref", "%u", &val); +	if (err < 0)  		goto done; /* The frontend does not have a control ring */  	ring_ref = val; -	err = xenbus_gather(XBT_NIL, dev->otherend, -			    "event-channel-ctrl", "%u", &val, NULL); -	if (err) { +	err = xenbus_scanf(XBT_NIL, dev->otherend, +			   "event-channel-ctrl", "%u", &val); +	if (err < 0) {  		xenbus_dev_fatal(dev, err,  				 "reading %s/event-channel-ctrl",  				 dev->otherend); @@ -934,14 +931,11 @@ static void connect(struct backend_info *be)  	/* Check whether the frontend requested multiple queues  	 * and read the number requested.  	 */ -	err = xenbus_scanf(XBT_NIL, dev->otherend, -			   "multi-queue-num-queues", -			   "%u", &requested_num_queues); -	if (err < 0) { -		requested_num_queues = 1; /* Fall back to single queue */ -	} else if (requested_num_queues > xenvif_max_queues) { +	requested_num_queues = xenbus_read_unsigned(dev->otherend, +					"multi-queue-num-queues", 1); +	if (requested_num_queues > xenvif_max_queues) {  		/* buggy or malicious guest */ -		xenbus_dev_fatal(dev, err, +		xenbus_dev_fatal(dev, -EINVAL,  				 "guest requested %u queues, exceeding the maximum of %u.",  				 requested_num_queues, xenvif_max_queues);  		return; @@ -1134,7 +1128,7 @@ static int read_xenbus_vif_flags(struct backend_info *be)  	struct xenvif *vif = be->vif;  	struct xenbus_device *dev = be->dev;  	unsigned int rx_copy; -	int err, val; +	int err;  	err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u",  			   &rx_copy); @@ -1150,10 +1144,7 @@ static int read_xenbus_vif_flags(struct backend_info *be)  	if (!rx_copy)  		return -EOPNOTSUPP; -	if (xenbus_scanf(XBT_NIL, dev->otherend, -			 "feature-rx-notify", "%d", &val) < 0) -		val = 0; -	if (!val) { +	if (!xenbus_read_unsigned(dev->otherend, "feature-rx-notify", 0)) {  		/* - Reduce drain timeout to poll more frequently for  		 *   Rx requests.  		 * - Disable Rx stall detection. @@ -1162,34 +1153,21 @@ static int read_xenbus_vif_flags(struct backend_info *be)  		be->vif->stall_timeout = 0;  	} -	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", -			 "%d", &val) < 0) -		val = 0; -	vif->can_sg = !!val; +	vif->can_sg = !!xenbus_read_unsigned(dev->otherend, "feature-sg", 0);  	vif->gso_mask = 0; -	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4", -			 "%d", &val) < 0) -		val = 0; -	if (val) +	if (xenbus_read_unsigned(dev->otherend, "feature-gso-tcpv4", 0))  		vif->gso_mask |= GSO_BIT(TCPV4); -	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv6", -			 "%d", &val) < 0) -		val = 0; -	if (val) +	if (xenbus_read_unsigned(dev->otherend, "feature-gso-tcpv6", 0))  		vif->gso_mask |= GSO_BIT(TCPV6); -	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload", -			 "%d", &val) < 0) -		val = 0; -	vif->ip_csum = !val; +	vif->ip_csum = !xenbus_read_unsigned(dev->otherend, +					     "feature-no-csum-offload", 0); -	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-ipv6-csum-offload", -			 "%d", &val) < 0) -		val = 0; -	vif->ipv6_csum = !!val; +	vif->ipv6_csum = !!xenbus_read_unsigned(dev->otherend, +						"feature-ipv6-csum-offload", 0);  	return 0;  }  |