rndis_filter.c 37.6 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
	struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
219
	int ret;
220

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

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

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

233
	/* Add one page_buf when request_msg crossing page boundary */
234
	if (pb[0].offset + pb[0].len > PAGE_SIZE) {
235
		packet->page_buf_cnt++;
236 237 238 239 240 241 242
		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;
243 244
	}

245
	rcu_read_lock_bh();
246
	ret = netvsc_send(net_device_ctx, packet, NULL, pb, NULL);
247 248
	rcu_read_unlock_bh();

249 250 251
	return ret;
}

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
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;
	}
}

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

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

290
	if (found) {
291 292
		if (resp->msg_len <=
		    sizeof(struct rndis_message) + RNDIS_EXT_LEN) {
293
			memcpy(&request->response_msg, resp,
294
			       resp->msg_len);
295 296 297 298
			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);
299
		} else {
300
			netdev_err(ndev,
301 302 303
				"rndis response buffer overflow "
				"detected (size %u max %zu)\n",
				resp->msg_len,
304
				sizeof(struct rndis_message));
305

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

318
		complete(&request->wait_event);
319
	} else {
320
		netdev_err(ndev,
321 322 323 324
			"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);
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 353
/*
 * 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;
}

354 355 356 357 358
static int rndis_filter_receive_data(struct net_device *ndev,
				     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 393
	return netvsc_recv_callback(ndev, channel,
				    data, rndis_pkt->data_len,
				    csum_info, vlan);
394 395
}

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

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

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

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

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

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

444
	return 0;
445 446
}

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

457
	if (!result)
458
		return -EINVAL;
459

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

468
	/* Setup the rndis query */
469 470 471 472 473
	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;
474

475 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
	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) {
502 503 504 505 506 507 508 509 510 511 512 513
		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);
	}

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

518
	wait_for_completion(&request->wait_event);
519

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

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

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

533
	*result_size = query_complete->info_buflen;
534

535
cleanup:
536
	if (request)
537
		put_rndis_request(dev, request);
538 539 540 541

	return ret;
}

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

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

552
	ret = rndis_filter_query_device(dev, net_device,
553 554 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
					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;
}

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

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

591 592 593
#define NWADR_STR "NetworkAddress"
#define NWADR_STRLEN 14

594 595
int rndis_filter_set_device_mac(struct netvsc_device *nvdev,
				const char *mac)
596 597 598 599 600 601 602 603 604 605
{
	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;
606
	int ret;
607 608 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

	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;

647 648 649
	wait_for_completion(&request->wait_event);

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

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

L
Lad, Prabhakar 已提交
658
static int
659
rndis_filter_set_offload_params(struct net_device *ndev,
660
				struct netvsc_device *nvdev,
661 662 663 664 665 666 667 668
				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);
669
	int ret;
670 671 672 673 674 675 676 677 678 679
	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;
	}
680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702

	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;

703 704 705 706 707 708
	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;
709 710 711 712 713 714
	}

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

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

	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 |
748 749
			 NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV6 |
			 NDIS_HASH_TCP_IPV6;
750 751
	rssp->indirect_tabsize = 4*ITAB_NUM;
	rssp->indirect_taboffset = sizeof(struct ndis_recv_scale_param);
752
	rssp->hashkey_size = NETVSC_HASH_KEYLEN;
753 754 755 756 757 758
	rssp->kashkey_offset = rssp->indirect_taboffset +
			       rssp->indirect_tabsize;

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

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

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

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

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

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

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

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

803 804
	ret = rndis_filter_query_device(dev, net_device,
					RNDIS_OID_GEN_LINK_SPEED,
805 806 807 808 809 810 811 812 813 814 815 816 817 818
					&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;
}

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

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

832

833
	/* Setup the rndis set */
834 835 836 837
	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);
838

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

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

846
	put_rndis_request(dev, request);
847

848 849 850
	return ret;
}

851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
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);
}

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

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

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

895
	dev->state = RNDIS_DEV_INITIALIZING;
896

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

903
	wait_for_completion(&request->wait_event);
904

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

917
cleanup:
918
	if (request)
919
		put_rndis_request(dev, request);
920 921 922 923

	return ret;
}

924 925 926 927 928 929 930
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];

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

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

	return true;
}

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

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

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

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

961
	dev->state = RNDIS_DEV_UNINITIALIZED;
962

963
cleanup:
964
	nvdev->destroy = true;
965 966 967

	/* Force flag to be ordered before waiting */
	wmb();
968 969

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

972
	if (request)
973
		put_rndis_request(dev, request);
974 975
}

976
static int rndis_filter_open_device(struct rndis_device *dev)
977
{
978
	int ret;
979

980
	if (dev->state != RNDIS_DEV_INITIALIZED)
981 982
		return 0;

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

	return ret;
}

993
static int rndis_filter_close_device(struct rndis_device *dev)
994 995 996
{
	int ret;

997
	if (dev->state != RNDIS_DEV_DATAINITIALIZED)
998 999
		return 0;

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

1003
	ret = rndis_filter_set_packet_filter(dev, 0);
1004 1005 1006
	if (ret == -ENODEV)
		ret = 0;

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

	return ret;
}

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

1023 1024 1025 1026 1027
	/* 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)
1028 1029
		return;

1030 1031
	nvchan = nvscdev->chan_table + chn_index;

1032 1033 1034 1035 1036
	/* 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);

1037 1038 1039
	/* Set the channel before opening.*/
	nvchan->channel = new_sc;

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

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

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
/* 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);

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

1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
	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();
}

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

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

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

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

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

1156
	/* Compute tx offload settings based on hw capabilities */
1157
	net->hw_features |= NETIF_F_RXCSUM;
1158 1159 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

	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;
		}
	}

1201 1202 1203 1204 1205
	/* 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;

1206
	netif_set_gso_max_size(net, gso_max_size);
1207

1208 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
	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;
	const struct cpumask *node_cpu_mask;
	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)
1270 1271
		goto err_dev_remv;

1272
	rndis_filter_query_device_link_status(rndis_device, net_device);
1273

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

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

1281
	rndis_filter_query_link_speed(rndis_device, net_device);
1282

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

1291 1292 1293
	/*
	 * We will limit the VRSS channels to the number CPUs in the NUMA node
	 * the primary channel is currently bound to.
1294 1295
	 *
	 * This also guarantees that num_possible_rss_qs <= num_online_cpus
1296 1297
	 */
	node_cpu_mask = cpumask_of_node(cpu_to_node(dev->channel->target_cpu));
1298 1299
	num_possible_rss_qs = min_t(u32, cpumask_weight(node_cpu_mask),
				    rsscap.num_recv_que);
1300

1301
	net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, num_possible_rss_qs);
1302

1303 1304
	/* We will use the given number of channels if available. */
	net_device->num_chn = min(net_device->max_chn, device_info->num_chn);
1305 1306

	for (i = 0; i < ITAB_NUM; i++)
1307 1308
		rndis_device->rx_table[i] = ethtool_rxfh_indir_default(
						i, net_device->num_chn);
1309

1310
	atomic_set(&net_device->open_chn, 1);
1311
	vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
1312

1313 1314 1315 1316 1317 1318 1319 1320 1321
	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;
		}
	}

1322 1323 1324
	for (i = 1; i < net_device->num_chn; i++)
		netif_napi_add(net, &net_device->chan_table[i].napi,
			       netvsc_poll, NAPI_POLL_WEIGHT);
1325

1326 1327
	if (net_device->num_chn > 1)
		schedule_work(&net_device->subchan_work);
1328

1329
out:
1330
	/* if unavailable, just proceed with one queue */
1331 1332
	if (ret) {
		net_device->max_chn = 1;
1333
		net_device->num_chn = 1;
1334
	}
1335

1336
	return net_device;
1337 1338

err_dev_remv:
1339
	rndis_filter_device_remove(dev, net_device);
1340
	return ERR_PTR(ret);
1341 1342
}

1343 1344
void rndis_filter_device_remove(struct hv_device *dev,
				struct netvsc_device *net_dev)
1345
{
1346
	struct rndis_device *rndis_dev = net_dev->extension;
1347

1348
	/* Halt and release the rndis device */
1349
	rndis_filter_halt_device(rndis_dev);
1350

1351
	net_dev->extension = NULL;
1352

1353
	netvsc_device_remove(dev);
1354
	kfree(rndis_dev);
1355 1356
}

1357
int rndis_filter_open(struct netvsc_device *nvdev)
1358
{
1359
	if (!nvdev)
1360 1361
		return -EINVAL;

1362
	if (atomic_inc_return(&nvdev->open_cnt) != 1)
1363 1364
		return 0;

1365
	return rndis_filter_open_device(nvdev->extension);
1366 1367
}

1368
int rndis_filter_close(struct netvsc_device *nvdev)
1369
{
1370
	if (!nvdev)
1371 1372
		return -EINVAL;

1373 1374 1375
	if (atomic_dec_return(&nvdev->open_cnt) != 0)
		return 0;

1376
	return rndis_filter_close_device(nvdev->extension);
1377
}
1378 1379 1380 1381 1382

bool rndis_filter_opened(const struct netvsc_device *nvdev)
{
	return atomic_read(&nvdev->open_cnt) > 0;
}