rndis_filter.c 37.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * Copyright (c) 2009, Microsoft Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
14
 * this program; if not, see <http://www.gnu.org/licenses/>.
15 16 17 18 19
 *
 * Authors:
 *   Haiyang Zhang <haiyangz@microsoft.com>
 *   Hank Janssen  <hjanssen@microsoft.com>
 */
20
#include <linux/kernel.h>
21 22
#include <linux/sched.h>
#include <linux/wait.h>
23
#include <linux/highmem.h>
24
#include <linux/slab.h>
25
#include <linux/io.h>
26
#include <linux/if_ether.h>
27
#include <linux/netdevice.h>
28
#include <linux/if_vlan.h>
29
#include <linux/nls.h>
30
#include <linux/vmalloc.h>
S
stephen hemminger 已提交
31
#include <linux/rtnetlink.h>
32

33
#include "hyperv_net.h"
34

35
static void rndis_set_multicast(struct work_struct *w);
36

37
#define RNDIS_EXT_LEN PAGE_SIZE
38
struct rndis_request {
39
	struct list_head list_ent;
40
	struct completion  wait_event;
41

42
	struct rndis_message response_msg;
43
	/*
44 45 46 47
	 * The buffer for extended info after the RNDIS response message. It's
	 * referenced based on the data offset in the RNDIS message. Its size
	 * is enough for current needs, and should be sufficient for the near
	 * future.
48
	 */
49
	u8 response_ext[RNDIS_EXT_LEN];
50

51
	/* Simplify allocation by having a netvsc packet inline */
52
	struct hv_netvsc_packet	pkt;
53

54
	struct rndis_message request_msg;
55
	/*
56 57
	 * The buffer for the extended info after the RNDIS request message.
	 * It is referenced and sized in a similar way as response_ext.
58
	 */
59
	u8 request_ext[RNDIS_EXT_LEN];
60
};
61

62 63 64 65 66 67 68 69
static const u8 netvsc_hash_key[NETVSC_HASH_KEYLEN] = {
	0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
	0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
	0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
	0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
	0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
};

70
static struct rndis_device *get_rndis_device(void)
71
{
72
	struct rndis_device *device;
73

74
	device = kzalloc(sizeof(struct rndis_device), GFP_KERNEL);
75 76 77
	if (!device)
		return NULL;

78
	spin_lock_init(&device->request_lock);
79

80
	INIT_LIST_HEAD(&device->req_list);
81
	INIT_WORK(&device->mcast_work, rndis_set_multicast);
82

83
	device->state = RNDIS_DEV_UNINITIALIZED;
84 85 86 87

	return device;
}

88
static struct rndis_request *get_rndis_request(struct rndis_device *dev,
89 90
					     u32 msg_type,
					     u32 msg_len)
91
{
92
	struct rndis_request *request;
93
	struct rndis_message *rndis_msg;
94
	struct rndis_set_request *set;
95
	unsigned long flags;
96

97
	request = kzalloc(sizeof(struct rndis_request), GFP_KERNEL);
98 99 100
	if (!request)
		return NULL;

101
	init_completion(&request->wait_event);
102

103
	rndis_msg = &request->request_msg;
104 105
	rndis_msg->ndis_msg_type = msg_type;
	rndis_msg->msg_len = msg_len;
106

107 108
	request->pkt.q_idx = 0;

109 110 111 112 113
	/*
	 * Set the request id. This field is always after the rndis header for
	 * request/response packet types so we just used the SetRequest as a
	 * template
	 */
114 115
	set = &rndis_msg->msg.set_req;
	set->req_id = atomic_inc_return(&dev->new_req_id);
116

117
	/* Add to the request list */
118 119 120
	spin_lock_irqsave(&dev->request_lock, flags);
	list_add_tail(&request->list_ent, &dev->req_list);
	spin_unlock_irqrestore(&dev->request_lock, flags);
121 122 123 124

	return request;
}

125
static void put_rndis_request(struct rndis_device *dev,
126
			    struct rndis_request *req)
127
{
128 129
	unsigned long flags;

130 131 132
	spin_lock_irqsave(&dev->request_lock, flags);
	list_del(&req->list_ent);
	spin_unlock_irqrestore(&dev->request_lock, flags);
133

134
	kfree(req);
135 136
}

137
static void dump_rndis_message(struct net_device *netdev,
138
			       const struct rndis_message *rndis_msg)
139
{
140
	switch (rndis_msg->ndis_msg_type) {
141 142
	case RNDIS_MSG_PACKET:
		netdev_dbg(netdev, "RNDIS_MSG_PACKET (len %u, "
143 144
			   "data offset %u data len %u, # oob %u, "
			   "oob offset %u, oob len %u, pkt offset %u, "
145
			   "pkt len %u\n",
146 147 148 149 150 151 152 153
			   rndis_msg->msg_len,
			   rndis_msg->msg.pkt.data_offset,
			   rndis_msg->msg.pkt.data_len,
			   rndis_msg->msg.pkt.num_oob_data_elements,
			   rndis_msg->msg.pkt.oob_data_offset,
			   rndis_msg->msg.pkt.oob_data_len,
			   rndis_msg->msg.pkt.per_pkt_info_offset,
			   rndis_msg->msg.pkt.per_pkt_info_len);
154 155
		break;

156 157
	case RNDIS_MSG_INIT_C:
		netdev_dbg(netdev, "RNDIS_MSG_INIT_C "
158 159
			"(len %u, id 0x%x, status 0x%x, major %d, minor %d, "
			"device flags %d, max xfer size 0x%x, max pkts %u, "
160
			"pkt aligned %u)\n",
161 162 163 164 165 166 167 168 169 170 171
			rndis_msg->msg_len,
			rndis_msg->msg.init_complete.req_id,
			rndis_msg->msg.init_complete.status,
			rndis_msg->msg.init_complete.major_ver,
			rndis_msg->msg.init_complete.minor_ver,
			rndis_msg->msg.init_complete.dev_flags,
			rndis_msg->msg.init_complete.max_xfer_size,
			rndis_msg->msg.init_complete.
			   max_pkt_per_msg,
			rndis_msg->msg.init_complete.
			   pkt_alignment_factor);
172 173
		break;

174 175
	case RNDIS_MSG_QUERY_C:
		netdev_dbg(netdev, "RNDIS_MSG_QUERY_C "
176
			"(len %u, id 0x%x, status 0x%x, buf len %u, "
177
			"buf offset %u)\n",
178 179 180 181 182 183 184
			rndis_msg->msg_len,
			rndis_msg->msg.query_complete.req_id,
			rndis_msg->msg.query_complete.status,
			rndis_msg->msg.query_complete.
			   info_buflen,
			rndis_msg->msg.query_complete.
			   info_buf_offset);
185 186
		break;

187
	case RNDIS_MSG_SET_C:
188
		netdev_dbg(netdev,
189
			"RNDIS_MSG_SET_C (len %u, id 0x%x, status 0x%x)\n",
190 191 192
			rndis_msg->msg_len,
			rndis_msg->msg.set_complete.req_id,
			rndis_msg->msg.set_complete.status);
193 194
		break;

195 196
	case RNDIS_MSG_INDICATE:
		netdev_dbg(netdev, "RNDIS_MSG_INDICATE "
197
			"(len %u, status 0x%x, buf len %u, buf offset %u)\n",
198 199 200 201
			rndis_msg->msg_len,
			rndis_msg->msg.indicate_status.status,
			rndis_msg->msg.indicate_status.status_buflen,
			rndis_msg->msg.indicate_status.status_buf_offset);
202 203 204
		break;

	default:
205
		netdev_dbg(netdev, "0x%x (len %u)\n",
206 207
			rndis_msg->ndis_msg_type,
			rndis_msg->msg_len);
208 209 210 211
		break;
	}
}

212
static int rndis_filter_send_request(struct rndis_device *dev,
213
				  struct rndis_request *req)
214
{
215
	struct hv_netvsc_packet *packet;
216
	struct hv_page_buffer page_buf[2];
217
	struct hv_page_buffer *pb = page_buf;
218
	int ret;
219

220
	/* Setup the packet to send it */
221
	packet = &req->pkt;
222

223
	packet->total_data_buflen = req->request_msg.msg_len;
224
	packet->page_buf_cnt = 1;
225

226
	pb[0].pfn = virt_to_phys(&req->request_msg) >>
227
					PAGE_SHIFT;
228 229
	pb[0].len = req->request_msg.msg_len;
	pb[0].offset =
230
		(unsigned long)&req->request_msg & (PAGE_SIZE - 1);
231

232
	/* Add one page_buf when request_msg crossing page boundary */
233
	if (pb[0].offset + pb[0].len > PAGE_SIZE) {
234
		packet->page_buf_cnt++;
235 236 237 238 239 240 241
		pb[0].len = PAGE_SIZE -
			pb[0].offset;
		pb[1].pfn = virt_to_phys((void *)&req->request_msg
			+ pb[0].len) >> PAGE_SHIFT;
		pb[1].offset = 0;
		pb[1].len = req->request_msg.msg_len -
			pb[0].len;
242 243
	}

244
	rcu_read_lock_bh();
245
	ret = netvsc_send(dev->ndev, packet, NULL, pb, NULL);
246 247
	rcu_read_unlock_bh();

248 249 250
	return ret;
}

251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
static void rndis_set_link_state(struct rndis_device *rdev,
				 struct rndis_request *request)
{
	u32 link_status;
	struct rndis_query_complete *query_complete;

	query_complete = &request->response_msg.msg.query_complete;

	if (query_complete->status == RNDIS_STATUS_SUCCESS &&
	    query_complete->info_buflen == sizeof(u32)) {
		memcpy(&link_status, (void *)((unsigned long)query_complete +
		       query_complete->info_buf_offset), sizeof(u32));
		rdev->link_state = link_status != 0;
	}
}

267
static void rndis_filter_receive_response(struct rndis_device *dev,
268
				       struct rndis_message *resp)
269
{
270
	struct rndis_request *request = NULL;
271
	bool found = false;
272
	unsigned long flags;
273
	struct net_device *ndev = dev->ndev;
274

275 276
	spin_lock_irqsave(&dev->request_lock, flags);
	list_for_each_entry(request, &dev->req_list, list_ent) {
277 278 279 280
		/*
		 * All request/response message contains RequestId as the 1st
		 * field
		 */
281 282
		if (request->request_msg.msg.init_req.req_id
		    == resp->msg.init_complete.req_id) {
283
			found = true;
284 285 286
			break;
		}
	}
287
	spin_unlock_irqrestore(&dev->request_lock, flags);
288

289
	if (found) {
290 291
		if (resp->msg_len <=
		    sizeof(struct rndis_message) + RNDIS_EXT_LEN) {
292
			memcpy(&request->response_msg, resp,
293
			       resp->msg_len);
294 295 296 297
			if (request->request_msg.ndis_msg_type ==
			    RNDIS_MSG_QUERY && request->request_msg.msg.
			    query_req.oid == RNDIS_OID_GEN_MEDIA_CONNECT_STATUS)
				rndis_set_link_state(dev, request);
298
		} else {
299
			netdev_err(ndev,
300 301 302
				"rndis response buffer overflow "
				"detected (size %u max %zu)\n",
				resp->msg_len,
303
				sizeof(struct rndis_message));
304

305
			if (resp->ndis_msg_type ==
306
			    RNDIS_MSG_RESET_C) {
307
				/* does not have a request id field */
308
				request->response_msg.msg.reset_complete.
309
					status = RNDIS_STATUS_BUFFER_OVERFLOW;
310
			} else {
311 312
				request->response_msg.msg.
				init_complete.status =
313
					RNDIS_STATUS_BUFFER_OVERFLOW;
314 315 316
			}
		}

317
		complete(&request->wait_event);
318
	} else {
319
		netdev_err(ndev,
320 321 322 323
			"no rndis request found for this response "
			"(id 0x%x res type 0x%x)\n",
			resp->msg.init_complete.req_id,
			resp->ndis_msg_type);
324 325 326
	}
}

327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
/*
 * Get the Per-Packet-Info with the specified type
 * return NULL if not found.
 */
static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type)
{
	struct rndis_per_packet_info *ppi;
	int len;

	if (rpkt->per_pkt_info_offset == 0)
		return NULL;

	ppi = (struct rndis_per_packet_info *)((ulong)rpkt +
		rpkt->per_pkt_info_offset);
	len = rpkt->per_pkt_info_len;

	while (len > 0) {
		if (ppi->type == type)
			return (void *)((ulong)ppi + ppi->ppi_offset);
		len -= ppi->size;
		ppi = (struct rndis_per_packet_info *)((ulong)ppi + ppi->size);
	}

	return NULL;
}

353
static int rndis_filter_receive_data(struct net_device *ndev,
354
				     struct netvsc_device *nvdev,
355 356 357 358
				     struct rndis_device *dev,
				     struct rndis_message *msg,
				     struct vmbus_channel *channel,
				     void *data, u32 data_buflen)
359
{
360 361 362
	struct rndis_packet *rndis_pkt = &msg->msg.pkt;
	const struct ndis_tcp_ip_checksum_info *csum_info;
	const struct ndis_pkt_8021q_info *vlan;
363
	u32 data_offset;
364

365
	/* Remove the rndis header and pass it back up the stack */
366
	data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset;
367

368
	data_buflen -= data_offset;
369 370 371 372 373

	/*
	 * Make sure we got a valid RNDIS message, now total_data_buflen
	 * should be the data packet size plus the trailer padding size
	 */
374
	if (unlikely(data_buflen < rndis_pkt->data_len)) {
375
		netdev_err(dev->ndev, "rndis message buffer "
376 377
			   "overflow detected (got %u, min %u)"
			   "...dropping this message!\n",
378
			   data_buflen, rndis_pkt->data_len);
379
		return NVSP_STAT_FAIL;
380 381
	}

382 383
	vlan = rndis_get_ppi(rndis_pkt, IEEE_8021Q_INFO);

384 385 386 387 388
	/*
	 * Remove the rndis trailer padding from rndis packet message
	 * rndis_pkt->data_len tell us the real data length, we only copy
	 * the data packet to the stack, without the rndis trailer padding
	 */
389
	data = (void *)((unsigned long)data + data_offset);
390
	csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
391 392

	return netvsc_recv_callback(ndev, nvdev, channel,
393 394
				    data, rndis_pkt->data_len,
				    csum_info, vlan);
395 396
}

397 398 399 400
int rndis_filter_receive(struct net_device *ndev,
			 struct netvsc_device *net_dev,
			 struct vmbus_channel *channel,
			 void *data, u32 buflen)
401
{
402
	struct net_device_context *net_device_ctx = netdev_priv(ndev);
403 404
	struct rndis_device *rndis_dev = net_dev->extension;
	struct rndis_message *rndis_msg = data;
405

406
	/* Make sure the rndis device state is initialized */
407
	if (unlikely(!rndis_dev)) {
408
		netif_dbg(net_device_ctx, rx_err, ndev,
409 410
			  "got rndis message but no rndis device!\n");
		return NVSP_STAT_FAIL;
411 412
	}

413
	if (unlikely(rndis_dev->state == RNDIS_DEV_UNINITIALIZED)) {
414
		netif_dbg(net_device_ctx, rx_err, ndev,
415 416
			  "got rndis message uninitialized\n");
		return NVSP_STAT_FAIL;
417 418
	}

419
	if (netif_msg_rx_status(net_device_ctx))
420
		dump_rndis_message(ndev, rndis_msg);
421

422
	switch (rndis_msg->ndis_msg_type) {
423
	case RNDIS_MSG_PACKET:
424 425
		return rndis_filter_receive_data(ndev, net_dev,
						 rndis_dev, rndis_msg,
426
						 channel, data, buflen);
427 428 429
	case RNDIS_MSG_INIT_C:
	case RNDIS_MSG_QUERY_C:
	case RNDIS_MSG_SET_C:
430
		/* completion msgs */
431
		rndis_filter_receive_response(rndis_dev, rndis_msg);
432 433
		break;

434
	case RNDIS_MSG_INDICATE:
435
		/* notification msgs */
436
		netvsc_linkstatus_callback(ndev, rndis_msg);
437 438
		break;
	default:
439
		netdev_err(ndev,
440
			"unhandled rndis message (type %u len %u)\n",
441 442
			   rndis_msg->ndis_msg_type,
			   rndis_msg->msg_len);
443 444 445
		break;
	}

446
	return 0;
447 448
}

449 450 451
static int rndis_filter_query_device(struct rndis_device *dev,
				     struct netvsc_device *nvdev,
				     u32 oid, void *result, u32 *result_size)
452
{
453
	struct rndis_request *request;
454
	u32 inresult_size = *result_size;
455
	struct rndis_query_request *query;
456
	struct rndis_query_complete *query_complete;
457
	int ret = 0;
458

459
	if (!result)
460
		return -EINVAL;
461

462
	*result_size = 0;
463
	request = get_rndis_request(dev, RNDIS_MSG_QUERY,
464 465
			RNDIS_MESSAGE_SIZE(struct rndis_query_request));
	if (!request) {
466
		ret = -ENOMEM;
467
		goto cleanup;
468 469
	}

470
	/* Setup the rndis query */
471 472 473 474 475
	query = &request->request_msg.msg.query_req;
	query->oid = oid;
	query->info_buf_offset = sizeof(struct rndis_query_request);
	query->info_buflen = 0;
	query->dev_vc_handle = 0;
476

477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
	if (oid == OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES) {
		struct ndis_offload *hwcaps;
		u32 nvsp_version = nvdev->nvsp_version;
		u8 ndis_rev;
		size_t size;

		if (nvsp_version >= NVSP_PROTOCOL_VERSION_5) {
			ndis_rev = NDIS_OFFLOAD_PARAMETERS_REVISION_3;
			size = NDIS_OFFLOAD_SIZE;
		} else if (nvsp_version >= NVSP_PROTOCOL_VERSION_4) {
			ndis_rev = NDIS_OFFLOAD_PARAMETERS_REVISION_2;
			size = NDIS_OFFLOAD_SIZE_6_1;
		} else {
			ndis_rev = NDIS_OFFLOAD_PARAMETERS_REVISION_1;
			size = NDIS_OFFLOAD_SIZE_6_0;
		}

		request->request_msg.msg_len += size;
		query->info_buflen = size;
		hwcaps = (struct ndis_offload *)
			((unsigned long)query + query->info_buf_offset);

		hwcaps->header.type = NDIS_OBJECT_TYPE_OFFLOAD;
		hwcaps->header.revision = ndis_rev;
		hwcaps->header.size = size;

	} else if (oid == OID_GEN_RECEIVE_SCALE_CAPABILITIES) {
504 505 506 507 508 509 510 511 512 513 514 515
		struct ndis_recv_scale_cap *cap;

		request->request_msg.msg_len +=
			sizeof(struct ndis_recv_scale_cap);
		query->info_buflen = sizeof(struct ndis_recv_scale_cap);
		cap = (struct ndis_recv_scale_cap *)((unsigned long)query +
						     query->info_buf_offset);
		cap->hdr.type = NDIS_OBJECT_TYPE_RSS_CAPABILITIES;
		cap->hdr.rev = NDIS_RECEIVE_SCALE_CAPABILITIES_REVISION_2;
		cap->hdr.size = sizeof(struct ndis_recv_scale_cap);
	}

516
	ret = rndis_filter_send_request(dev, request);
517
	if (ret != 0)
518
		goto cleanup;
519

520
	wait_for_completion(&request->wait_event);
521

522
	/* Copy the response back */
523
	query_complete = &request->response_msg.msg.query_complete;
524

525
	if (query_complete->info_buflen > inresult_size) {
526
		ret = -1;
527
		goto cleanup;
528 529
	}

530 531
	memcpy(result,
	       (void *)((unsigned long)query_complete +
532 533
			 query_complete->info_buf_offset),
	       query_complete->info_buflen);
534

535
	*result_size = query_complete->info_buflen;
536

537
cleanup:
538
	if (request)
539
		put_rndis_request(dev, request);
540 541 542 543

	return ret;
}

544 545
/* Get the hardware offload capabilities */
static int
546 547
rndis_query_hwcaps(struct rndis_device *dev, struct netvsc_device *net_device,
		   struct ndis_offload *caps)
548 549 550 551 552 553
{
	u32 caps_len = sizeof(*caps);
	int ret;

	memset(caps, 0, sizeof(*caps));

554
	ret = rndis_filter_query_device(dev, net_device,
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
					OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES,
					caps, &caps_len);
	if (ret)
		return ret;

	if (caps->header.type != NDIS_OBJECT_TYPE_OFFLOAD) {
		netdev_warn(dev->ndev, "invalid NDIS objtype %#x\n",
			    caps->header.type);
		return -EINVAL;
	}

	if (caps->header.revision < NDIS_OFFLOAD_PARAMETERS_REVISION_1) {
		netdev_warn(dev->ndev, "invalid NDIS objrev %x\n",
			    caps->header.revision);
		return -EINVAL;
	}

	if (caps->header.size > caps_len ||
	    caps->header.size < NDIS_OFFLOAD_SIZE_6_0) {
		netdev_warn(dev->ndev,
			    "invalid NDIS objsize %u, data size %u\n",
			    caps->header.size, caps_len);
		return -EINVAL;
	}

	return 0;
}

583 584
static int rndis_filter_query_device_mac(struct rndis_device *dev,
					 struct netvsc_device *net_device)
585
{
586
	u32 size = ETH_ALEN;
587

588
	return rndis_filter_query_device(dev, net_device,
589
				      RNDIS_OID_802_3_PERMANENT_ADDRESS,
590
				      dev->hw_mac_adr, &size);
591 592
}

593 594 595
#define NWADR_STR "NetworkAddress"
#define NWADR_STRLEN 14

596 597
int rndis_filter_set_device_mac(struct netvsc_device *nvdev,
				const char *mac)
598 599 600 601 602 603 604 605 606 607
{
	struct rndis_device *rdev = nvdev->extension;
	struct rndis_request *request;
	struct rndis_set_request *set;
	struct rndis_config_parameter_info *cpi;
	wchar_t *cfg_nwadr, *cfg_mac;
	struct rndis_set_complete *set_complete;
	char macstr[2*ETH_ALEN+1];
	u32 extlen = sizeof(struct rndis_config_parameter_info) +
		2*NWADR_STRLEN + 4*ETH_ALEN;
608
	int ret;
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648

	request = get_rndis_request(rdev, RNDIS_MSG_SET,
		RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
	if (!request)
		return -ENOMEM;

	set = &request->request_msg.msg.set_req;
	set->oid = RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER;
	set->info_buflen = extlen;
	set->info_buf_offset = sizeof(struct rndis_set_request);
	set->dev_vc_handle = 0;

	cpi = (struct rndis_config_parameter_info *)((ulong)set +
		set->info_buf_offset);
	cpi->parameter_name_offset =
		sizeof(struct rndis_config_parameter_info);
	/* Multiply by 2 because host needs 2 bytes (utf16) for each char */
	cpi->parameter_name_length = 2*NWADR_STRLEN;
	cpi->parameter_type = RNDIS_CONFIG_PARAM_TYPE_STRING;
	cpi->parameter_value_offset =
		cpi->parameter_name_offset + cpi->parameter_name_length;
	/* Multiply by 4 because each MAC byte displayed as 2 utf16 chars */
	cpi->parameter_value_length = 4*ETH_ALEN;

	cfg_nwadr = (wchar_t *)((ulong)cpi + cpi->parameter_name_offset);
	cfg_mac = (wchar_t *)((ulong)cpi + cpi->parameter_value_offset);
	ret = utf8s_to_utf16s(NWADR_STR, NWADR_STRLEN, UTF16_HOST_ENDIAN,
			      cfg_nwadr, NWADR_STRLEN);
	if (ret < 0)
		goto cleanup;
	snprintf(macstr, 2*ETH_ALEN+1, "%pm", mac);
	ret = utf8s_to_utf16s(macstr, 2*ETH_ALEN, UTF16_HOST_ENDIAN,
			      cfg_mac, 2*ETH_ALEN);
	if (ret < 0)
		goto cleanup;

	ret = rndis_filter_send_request(rdev, request);
	if (ret != 0)
		goto cleanup;

649 650 651
	wait_for_completion(&request->wait_event);

	set_complete = &request->response_msg.msg.set_complete;
652 653
	if (set_complete->status != RNDIS_STATUS_SUCCESS)
		ret = -EIO;
654 655 656 657 658 659

cleanup:
	put_rndis_request(rdev, request);
	return ret;
}

L
Lad, Prabhakar 已提交
660
static int
661
rndis_filter_set_offload_params(struct net_device *ndev,
662
				struct netvsc_device *nvdev,
663 664 665 666 667 668 669 670
				struct ndis_offload_params *req_offloads)
{
	struct rndis_device *rdev = nvdev->extension;
	struct rndis_request *request;
	struct rndis_set_request *set;
	struct ndis_offload_params *offload_params;
	struct rndis_set_complete *set_complete;
	u32 extlen = sizeof(struct ndis_offload_params);
671
	int ret;
672 673 674 675 676 677 678 679 680 681
	u32 vsp_version = nvdev->nvsp_version;

	if (vsp_version <= NVSP_PROTOCOL_VERSION_4) {
		extlen = VERSION_4_OFFLOAD_SIZE;
		/* On NVSP_PROTOCOL_VERSION_4 and below, we do not support
		 * UDP checksum offload.
		 */
		req_offloads->udp_ip_v4_csum = 0;
		req_offloads->udp_ip_v6_csum = 0;
	}
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704

	request = get_rndis_request(rdev, RNDIS_MSG_SET,
		RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
	if (!request)
		return -ENOMEM;

	set = &request->request_msg.msg.set_req;
	set->oid = OID_TCP_OFFLOAD_PARAMETERS;
	set->info_buflen = extlen;
	set->info_buf_offset = sizeof(struct rndis_set_request);
	set->dev_vc_handle = 0;

	offload_params = (struct ndis_offload_params *)((ulong)set +
				set->info_buf_offset);
	*offload_params = *req_offloads;
	offload_params->header.type = NDIS_OBJECT_TYPE_DEFAULT;
	offload_params->header.revision = NDIS_OFFLOAD_PARAMETERS_REVISION_3;
	offload_params->header.size = extlen;

	ret = rndis_filter_send_request(rdev, request);
	if (ret != 0)
		goto cleanup;

705 706 707 708 709 710
	wait_for_completion(&request->wait_event);
	set_complete = &request->response_msg.msg.set_complete;
	if (set_complete->status != RNDIS_STATUS_SUCCESS) {
		netdev_err(ndev, "Fail to set offload on host side:0x%x\n",
			   set_complete->status);
		ret = -EINVAL;
711 712 713 714 715 716
	}

cleanup:
	put_rndis_request(rdev, request);
	return ret;
}
717

718
int rndis_filter_set_rss_param(struct rndis_device *rdev,
719
			       const u8 *rss_key)
720
{
721
	struct net_device *ndev = rdev->ndev;
722 723 724 725
	struct rndis_request *request;
	struct rndis_set_request *set;
	struct rndis_set_complete *set_complete;
	u32 extlen = sizeof(struct ndis_recv_scale_param) +
726
		     4 * ITAB_NUM + NETVSC_HASH_KEYLEN;
727 728 729
	struct ndis_recv_scale_param *rssp;
	u32 *itab;
	u8 *keyp;
730
	int i, ret;
731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749

	request = get_rndis_request(
			rdev, RNDIS_MSG_SET,
			RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
	if (!request)
		return -ENOMEM;

	set = &request->request_msg.msg.set_req;
	set->oid = OID_GEN_RECEIVE_SCALE_PARAMETERS;
	set->info_buflen = extlen;
	set->info_buf_offset = sizeof(struct rndis_set_request);
	set->dev_vc_handle = 0;

	rssp = (struct ndis_recv_scale_param *)(set + 1);
	rssp->hdr.type = NDIS_OBJECT_TYPE_RSS_PARAMETERS;
	rssp->hdr.rev = NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2;
	rssp->hdr.size = sizeof(struct ndis_recv_scale_param);
	rssp->flag = 0;
	rssp->hashinfo = NDIS_HASH_FUNC_TOEPLITZ | NDIS_HASH_IPV4 |
750 751
			 NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV6 |
			 NDIS_HASH_TCP_IPV6;
752 753
	rssp->indirect_tabsize = 4*ITAB_NUM;
	rssp->indirect_taboffset = sizeof(struct ndis_recv_scale_param);
754
	rssp->hashkey_size = NETVSC_HASH_KEYLEN;
755 756 757 758 759 760
	rssp->kashkey_offset = rssp->indirect_taboffset +
			       rssp->indirect_tabsize;

	/* Set indirection table entries */
	itab = (u32 *)(rssp + 1);
	for (i = 0; i < ITAB_NUM; i++)
761
		itab[i] = rdev->rx_table[i];
762 763 764

	/* Set hask key values */
	keyp = (u8 *)((unsigned long)rssp + rssp->kashkey_offset);
765
	memcpy(keyp, rss_key, NETVSC_HASH_KEYLEN);
766 767 768 769 770

	ret = rndis_filter_send_request(rdev, request);
	if (ret != 0)
		goto cleanup;

771 772
	wait_for_completion(&request->wait_event);
	set_complete = &request->response_msg.msg.set_complete;
773 774 775
	if (set_complete->status == RNDIS_STATUS_SUCCESS)
		memcpy(rdev->rss_key, rss_key, NETVSC_HASH_KEYLEN);
	else {
776 777 778
		netdev_err(ndev, "Fail to set RSS parameters:0x%x\n",
			   set_complete->status);
		ret = -EINVAL;
779 780 781 782 783 784 785
	}

cleanup:
	put_rndis_request(rdev, request);
	return ret;
}

786 787
static int rndis_filter_query_device_link_status(struct rndis_device *dev,
						 struct netvsc_device *net_device)
788
{
789
	u32 size = sizeof(u32);
790
	u32 link_status;
791

792 793 794
	return rndis_filter_query_device(dev, net_device,
					 RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
					 &link_status, &size);
795 796
}

797 798
static int rndis_filter_query_link_speed(struct rndis_device *dev,
					 struct netvsc_device *net_device)
799 800 801 802 803 804
{
	u32 size = sizeof(u32);
	u32 link_speed;
	struct net_device_context *ndc;
	int ret;

805 806
	ret = rndis_filter_query_device(dev, net_device,
					RNDIS_OID_GEN_LINK_SPEED,
807 808 809 810 811 812 813 814 815 816 817 818 819 820
					&link_speed, &size);

	if (!ret) {
		ndc = netdev_priv(dev->ndev);

		/* The link speed reported from host is in 100bps unit, so
		 * we convert it to Mbps here.
		 */
		ndc->speed = link_speed / 10000;
	}

	return ret;
}

821 822
static int rndis_filter_set_packet_filter(struct rndis_device *dev,
					  u32 new_filter)
823
{
824
	struct rndis_request *request;
825
	struct rndis_set_request *set;
826
	int ret;
827

828
	request = get_rndis_request(dev, RNDIS_MSG_SET,
829 830
			RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
			sizeof(u32));
831 832 833
	if (!request)
		return -ENOMEM;

834

835
	/* Setup the rndis set */
836 837 838 839
	set = &request->request_msg.msg.set_req;
	set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
	set->info_buflen = sizeof(u32);
	set->info_buf_offset = sizeof(struct rndis_set_request);
840

841
	memcpy((void *)(unsigned long)set + sizeof(struct rndis_set_request),
842
	       &new_filter, sizeof(u32));
843

844
	ret = rndis_filter_send_request(dev, request);
845 846
	if (ret == 0)
		wait_for_completion(&request->wait_event);
847

848
	put_rndis_request(dev, request);
849

850 851 852
	return ret;
}

853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874
static void rndis_set_multicast(struct work_struct *w)
{
	struct rndis_device *rdev
		= container_of(w, struct rndis_device, mcast_work);

	if (rdev->ndev->flags & IFF_PROMISC)
		rndis_filter_set_packet_filter(rdev,
					       NDIS_PACKET_TYPE_PROMISCUOUS);
	else
		rndis_filter_set_packet_filter(rdev,
					       NDIS_PACKET_TYPE_BROADCAST |
					       NDIS_PACKET_TYPE_ALL_MULTICAST |
					       NDIS_PACKET_TYPE_DIRECTED);
}

void rndis_filter_update(struct netvsc_device *nvdev)
{
	struct rndis_device *rdev = nvdev->extension;

	schedule_work(&rdev->mcast_work);
}

875 876
static int rndis_filter_init_device(struct rndis_device *dev,
				    struct netvsc_device *nvdev)
877
{
878
	struct rndis_request *request;
879
	struct rndis_initialize_request *init;
880
	struct rndis_initialize_complete *init_complete;
881
	u32 status;
882
	int ret;
883

884
	request = get_rndis_request(dev, RNDIS_MSG_INIT,
885 886
			RNDIS_MESSAGE_SIZE(struct rndis_initialize_request));
	if (!request) {
887
		ret = -ENOMEM;
888
		goto cleanup;
889 890
	}

891
	/* Setup the rndis set */
892 893 894
	init = &request->request_msg.msg.init_req;
	init->major_ver = RNDIS_MAJOR_VERSION;
	init->minor_ver = RNDIS_MINOR_VERSION;
895
	init->max_xfer_size = 0x4000;
896

897
	dev->state = RNDIS_DEV_INITIALIZING;
898

899
	ret = rndis_filter_send_request(dev, request);
900
	if (ret != 0) {
901
		dev->state = RNDIS_DEV_UNINITIALIZED;
902
		goto cleanup;
903 904
	}

905
	wait_for_completion(&request->wait_event);
906

907 908
	init_complete = &request->response_msg.msg.init_complete;
	status = init_complete->status;
909
	if (status == RNDIS_STATUS_SUCCESS) {
910
		dev->state = RNDIS_DEV_INITIALIZED;
911 912
		nvdev->max_pkt = init_complete->max_pkt_per_msg;
		nvdev->pkt_align = 1 << init_complete->pkt_alignment_factor;
913
		ret = 0;
914
	} else {
915
		dev->state = RNDIS_DEV_UNINITIALIZED;
916
		ret = -EINVAL;
917 918
	}

919
cleanup:
920
	if (request)
921
		put_rndis_request(dev, request);
922 923 924 925

	return ret;
}

926 927 928 929 930 931 932
static bool netvsc_device_idle(const struct netvsc_device *nvdev)
{
	int i;

	for (i = 0; i < nvdev->num_chn; i++) {
		const struct netvsc_channel *nvchan = &nvdev->chan_table[i];

933 934 935
		if (nvchan->mrc.first != nvchan->mrc.next)
			return false;

936 937 938 939 940 941 942
		if (atomic_read(&nvchan->queue_sends) > 0)
			return false;
	}

	return true;
}

943
static void rndis_filter_halt_device(struct rndis_device *dev)
944
{
945
	struct rndis_request *request;
946
	struct rndis_halt_request *halt;
947
	struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
948
	struct netvsc_device *nvdev = rtnl_dereference(net_device_ctx->nvdev);
949

950
	/* Attempt to do a rndis device halt */
951
	request = get_rndis_request(dev, RNDIS_MSG_HALT,
952
				RNDIS_MESSAGE_SIZE(struct rndis_halt_request));
953
	if (!request)
954
		goto cleanup;
955

956
	/* Setup the rndis set */
957 958
	halt = &request->request_msg.msg.halt_req;
	halt->req_id = atomic_inc_return(&dev->new_req_id);
959

960
	/* Ignore return since this msg is optional. */
961
	rndis_filter_send_request(dev, request);
962

963
	dev->state = RNDIS_DEV_UNINITIALIZED;
964

965
cleanup:
966
	nvdev->destroy = true;
967 968 969

	/* Force flag to be ordered before waiting */
	wmb();
970 971

	/* Wait for all send completions */
972
	wait_event(nvdev->wait_drain, netvsc_device_idle(nvdev));
973

974
	if (request)
975
		put_rndis_request(dev, request);
976 977
}

978
static int rndis_filter_open_device(struct rndis_device *dev)
979
{
980
	int ret;
981

982
	if (dev->state != RNDIS_DEV_INITIALIZED)
983 984
		return 0;

985
	ret = rndis_filter_set_packet_filter(dev,
986
					 NDIS_PACKET_TYPE_BROADCAST |
987
					 NDIS_PACKET_TYPE_ALL_MULTICAST |
988
					 NDIS_PACKET_TYPE_DIRECTED);
989
	if (ret == 0)
990
		dev->state = RNDIS_DEV_DATAINITIALIZED;
991 992 993 994

	return ret;
}

995
static int rndis_filter_close_device(struct rndis_device *dev)
996 997 998
{
	int ret;

999
	if (dev->state != RNDIS_DEV_DATAINITIALIZED)
1000 1001
		return 0;

1002 1003 1004
	/* Make sure rndis_set_multicast doesn't re-enable filter! */
	cancel_work_sync(&dev->mcast_work);

1005
	ret = rndis_filter_set_packet_filter(dev, 0);
1006 1007 1008
	if (ret == -ENODEV)
		ret = 0;

1009
	if (ret == 0)
1010
		dev->state = RNDIS_DEV_INITIALIZED;
1011 1012 1013 1014

	return ret;
}

1015 1016
static void netvsc_sc_open(struct vmbus_channel *new_sc)
{
1017 1018
	struct net_device *ndev =
		hv_get_drvdata(new_sc->primary_channel->device_obj);
1019 1020
	struct net_device_context *ndev_ctx = netdev_priv(ndev);
	struct netvsc_device *nvscdev;
1021
	u16 chn_index = new_sc->offermsg.offer.sub_channel_index;
1022 1023
	struct netvsc_channel *nvchan;
	int ret;
1024

1025 1026 1027 1028 1029
	/* This is safe because this callback only happens when
	 * new device is being setup and waiting on the channel_init_wait.
	 */
	nvscdev = rcu_dereference_raw(ndev_ctx->nvdev);
	if (!nvscdev || chn_index >= nvscdev->num_chn)
1030 1031
		return;

1032 1033
	nvchan = nvscdev->chan_table + chn_index;

1034 1035 1036 1037 1038
	/* Because the device uses NAPI, all the interrupt batching and
	 * control is done via Net softirq, not the channel handling
	 */
	set_channel_read_mode(new_sc, HV_CALL_ISR);

1039 1040 1041
	/* Set the channel before opening.*/
	nvchan->channel = new_sc;

1042 1043
	ret = vmbus_open(new_sc, netvsc_ring_bytes,
			 netvsc_ring_bytes, NULL, 0,
1044
			 netvsc_channel_cb, nvchan);
1045 1046 1047
	if (ret == 0)
		napi_enable(&nvchan->napi);
	else
1048
		netdev_notice(ndev, "sub channel open failed: %d\n", ret);
S
stephen hemminger 已提交
1049

1050 1051
	if (atomic_inc_return(&nvscdev->open_chn) == nvscdev->num_chn)
		wake_up(&nvscdev->subchan_open);
1052 1053
}

1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
/* Open sub-channels after completing the handling of the device probe.
 * This breaks overlap of processing the host message for the
 * new primary channel with the initialization of sub-channels.
 */
void rndis_set_subchannel(struct work_struct *w)
{
	struct netvsc_device *nvdev
		= container_of(w, struct netvsc_device, subchan_work);
	struct nvsp_message *init_packet = &nvdev->channel_init_pkt;
	struct net_device_context *ndev_ctx;
	struct rndis_device *rdev;
	struct net_device *ndev;
	struct hv_device *hv_dev;
	int i, ret;

	if (!rtnl_trylock()) {
		schedule_work(w);
		return;
	}

	rdev = nvdev->extension;
	if (!rdev)
		goto unlock;	/* device was removed */

	ndev = rdev->ndev;
	ndev_ctx = netdev_priv(ndev);
	hv_dev = ndev_ctx->device_ctx;

	memset(init_packet, 0, sizeof(struct nvsp_message));
	init_packet->hdr.msg_type = NVSP_MSG5_TYPE_SUBCHANNEL;
	init_packet->msg.v5_msg.subchn_req.op = NVSP_SUBCHANNEL_ALLOCATE;
	init_packet->msg.v5_msg.subchn_req.num_subchannels =
						nvdev->num_chn - 1;
	ret = vmbus_sendpacket(hv_dev->channel, init_packet,
			       sizeof(struct nvsp_message),
			       (unsigned long)init_packet,
			       VM_PKT_DATA_INBAND,
			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
	if (ret) {
		netdev_err(ndev, "sub channel allocate send failed: %d\n", ret);
		goto failed;
	}

	wait_for_completion(&nvdev->channel_init_wait);
	if (init_packet->msg.v5_msg.subchn_comp.status != NVSP_STAT_SUCCESS) {
		netdev_err(ndev, "sub channel request failed\n");
		goto failed;
	}

	nvdev->num_chn = 1 +
		init_packet->msg.v5_msg.subchn_comp.num_subchannels;

	/* wait for all sub channels to open */
	wait_event(nvdev->subchan_open,
		   atomic_read(&nvdev->open_chn) == nvdev->num_chn);

	/* ignore failues from setting rss parameters, still have channels */
	rndis_filter_set_rss_param(rdev, netvsc_hash_key);

	netif_set_real_num_tx_queues(ndev, nvdev->num_chn);
	netif_set_real_num_rx_queues(ndev, nvdev->num_chn);

1116 1117 1118
	for (i = 0; i < VRSS_SEND_TAB_SIZE; i++)
		ndev_ctx->tx_table[i] = i % nvdev->num_chn;

1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
	rtnl_unlock();
	return;

failed:
	/* fallback to only primary channel */
	for (i = 1; i < nvdev->num_chn; i++)
		netif_napi_del(&nvdev->chan_table[i].napi);

	nvdev->max_chn = 1;
	nvdev->num_chn = 1;
unlock:
	rtnl_unlock();
}

1133 1134
static int rndis_netdev_set_hwcaps(struct rndis_device *rndis_device,
				   struct netvsc_device *nvdev)
1135
{
1136
	struct net_device *net = rndis_device->ndev;
1137
	struct net_device_context *net_device_ctx = netdev_priv(net);
1138
	struct ndis_offload hwcaps;
1139
	struct ndis_offload_params offloads;
1140
	unsigned int gso_max_size = GSO_MAX_SIZE;
1141
	int ret;
1142

1143
	/* Find HW offload capabilities */
1144
	ret = rndis_query_hwcaps(rndis_device, nvdev, &hwcaps);
1145
	if (ret != 0)
1146
		return ret;
1147 1148

	/* A value of zero means "no change"; now turn on what we want. */
1149
	memset(&offloads, 0, sizeof(struct ndis_offload_params));
1150 1151 1152 1153

	/* Linux does not care about IP checksum, always does in kernel */
	offloads.ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED;

1154 1155 1156 1157
	/* Reset previously set hw_features flags */
	net->hw_features &= ~NETVSC_SUPPORTED_HW_FEATURES;
	net_device_ctx->tx_checksum_mask = 0;

1158
	/* Compute tx offload settings based on hw capabilities */
1159
	net->hw_features |= NETIF_F_RXCSUM;
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202

	if ((hwcaps.csum.ip4_txcsum & NDIS_TXCSUM_ALL_TCP4) == NDIS_TXCSUM_ALL_TCP4) {
		/* Can checksum TCP */
		net->hw_features |= NETIF_F_IP_CSUM;
		net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV4_TCP;

		offloads.tcp_ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;

		if (hwcaps.lsov2.ip4_encap & NDIS_OFFLOAD_ENCAP_8023) {
			offloads.lso_v2_ipv4 = NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED;
			net->hw_features |= NETIF_F_TSO;

			if (hwcaps.lsov2.ip4_maxsz < gso_max_size)
				gso_max_size = hwcaps.lsov2.ip4_maxsz;
		}

		if (hwcaps.csum.ip4_txcsum & NDIS_TXCSUM_CAP_UDP4) {
			offloads.udp_ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
			net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV4_UDP;
		}
	}

	if ((hwcaps.csum.ip6_txcsum & NDIS_TXCSUM_ALL_TCP6) == NDIS_TXCSUM_ALL_TCP6) {
		net->hw_features |= NETIF_F_IPV6_CSUM;

		offloads.tcp_ip_v6_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
		net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV6_TCP;

		if ((hwcaps.lsov2.ip6_encap & NDIS_OFFLOAD_ENCAP_8023) &&
		    (hwcaps.lsov2.ip6_opts & NDIS_LSOV2_CAP_IP6) == NDIS_LSOV2_CAP_IP6) {
			offloads.lso_v2_ipv6 = NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED;
			net->hw_features |= NETIF_F_TSO6;

			if (hwcaps.lsov2.ip6_maxsz < gso_max_size)
				gso_max_size = hwcaps.lsov2.ip6_maxsz;
		}

		if (hwcaps.csum.ip6_txcsum & NDIS_TXCSUM_CAP_UDP6) {
			offloads.udp_ip_v6_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
			net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV6_UDP;
		}
	}

1203 1204 1205 1206 1207
	/* In case some hw_features disappeared we need to remove them from
	 * net->features list as they're no longer supported.
	 */
	net->features &= ~NETVSC_SUPPORTED_HW_FEATURES | net->hw_features;

1208
	netif_set_gso_max_size(net, gso_max_size);
1209

1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
	ret = rndis_filter_set_offload_params(net, nvdev, &offloads);

	return ret;
}

struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
				      struct netvsc_device_info *device_info)
{
	struct net_device *net = hv_get_drvdata(dev);
	struct netvsc_device *net_device;
	struct rndis_device *rndis_device;
	struct ndis_recv_scale_cap rsscap;
	u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
	u32 mtu, size;
	u32 num_possible_rss_qs;
	int i, ret;

	rndis_device = get_rndis_device();
	if (!rndis_device)
		return ERR_PTR(-ENODEV);

	/* Let the inner driver handle this first to create the netvsc channel
	 * NOTE! Once the channel is created, we may get a receive callback
	 * (RndisFilterOnReceive()) before this call is completed
	 */
	net_device = netvsc_device_add(dev, device_info);
	if (IS_ERR(net_device)) {
		kfree(rndis_device);
		return net_device;
	}

	/* Initialize the rndis device */
	net_device->max_chn = 1;
	net_device->num_chn = 1;

	net_device->extension = rndis_device;
	rndis_device->ndev = net;

	/* Send the rndis initialization message */
	ret = rndis_filter_init_device(rndis_device, net_device);
	if (ret != 0)
		goto err_dev_remv;

	/* Get the MTU from the host */
	size = sizeof(u32);
	ret = rndis_filter_query_device(rndis_device, net_device,
					RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
					&mtu, &size);
	if (ret == 0 && size == sizeof(u32) && mtu < net->mtu)
		net->mtu = mtu;

	/* Get the mac address */
	ret = rndis_filter_query_device_mac(rndis_device, net_device);
	if (ret != 0)
		goto err_dev_remv;

	memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);

	/* Query and set hardware capabilities */
	ret = rndis_netdev_set_hwcaps(rndis_device, net_device);
	if (ret != 0)
1271 1272
		goto err_dev_remv;

1273
	rndis_filter_query_device_link_status(rndis_device, net_device);
1274

1275 1276
	netdev_dbg(net, "Device MAC %pM link state %s\n",
		   rndis_device->hw_mac_adr,
1277
		   rndis_device->link_state ? "down" : "up");
1278

1279
	if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)
1280
		return net_device;
1281

1282
	rndis_filter_query_link_speed(rndis_device, net_device);
1283

1284 1285
	/* vRSS setup */
	memset(&rsscap, 0, rsscap_size);
1286
	ret = rndis_filter_query_device(rndis_device, net_device,
1287 1288 1289 1290 1291
					OID_GEN_RECEIVE_SCALE_CAPABILITIES,
					&rsscap, &rsscap_size);
	if (ret || rsscap.num_recv_que < 2)
		goto out;

1292 1293
	/* This guarantees that num_possible_rss_qs <= num_online_cpus */
	num_possible_rss_qs = min_t(u32, num_online_cpus(),
1294
				    rsscap.num_recv_que);
1295

1296
	net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, num_possible_rss_qs);
1297

1298 1299
	/* We will use the given number of channels if available. */
	net_device->num_chn = min(net_device->max_chn, device_info->num_chn);
1300 1301

	for (i = 0; i < ITAB_NUM; i++)
1302 1303
		rndis_device->rx_table[i] = ethtool_rxfh_indir_default(
						i, net_device->num_chn);
1304

1305
	atomic_set(&net_device->open_chn, 1);
1306
	vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
1307

1308 1309 1310 1311 1312 1313 1314 1315 1316
	for (i = 1; i < net_device->num_chn; i++) {
		ret = netvsc_alloc_recv_comp_ring(net_device, i);
		if (ret) {
			while (--i != 0)
				vfree(net_device->chan_table[i].mrc.slots);
			goto out;
		}
	}

1317 1318 1319
	for (i = 1; i < net_device->num_chn; i++)
		netif_napi_add(net, &net_device->chan_table[i].napi,
			       netvsc_poll, NAPI_POLL_WEIGHT);
1320

1321 1322
	if (net_device->num_chn > 1)
		schedule_work(&net_device->subchan_work);
1323

1324
out:
1325
	/* if unavailable, just proceed with one queue */
1326 1327
	if (ret) {
		net_device->max_chn = 1;
1328
		net_device->num_chn = 1;
1329
	}
1330

1331
	return net_device;
1332 1333

err_dev_remv:
1334
	rndis_filter_device_remove(dev, net_device);
1335
	return ERR_PTR(ret);
1336 1337
}

1338 1339
void rndis_filter_device_remove(struct hv_device *dev,
				struct netvsc_device *net_dev)
1340
{
1341
	struct rndis_device *rndis_dev = net_dev->extension;
1342

1343
	/* Halt and release the rndis device */
1344
	rndis_filter_halt_device(rndis_dev);
1345

1346
	net_dev->extension = NULL;
1347

1348
	netvsc_device_remove(dev);
1349
	kfree(rndis_dev);
1350 1351
}

1352
int rndis_filter_open(struct netvsc_device *nvdev)
1353
{
1354
	if (!nvdev)
1355 1356
		return -EINVAL;

1357
	return rndis_filter_open_device(nvdev->extension);
1358 1359
}

1360
int rndis_filter_close(struct netvsc_device *nvdev)
1361
{
1362
	if (!nvdev)
1363 1364
		return -EINVAL;

1365
	return rndis_filter_close_device(nvdev->extension);
1366
}
1367 1368 1369

bool rndis_filter_opened(const struct netvsc_device *nvdev)
{
1370 1371 1372
	const struct rndis_device *dev = nvdev->extension;

	return dev->state == RNDIS_DEV_DATAINITIALIZED;
1373
}