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

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

369
	data_buflen -= data_offset;
370 371 372 373 374

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

383 384
	vlan = rndis_get_ppi(rndis_pkt, IEEE_8021Q_INFO);

385 386 387 388 389
	/*
	 * 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
	 */
390
	data = (void *)((unsigned long)data + data_offset);
391
	csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
392 393

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

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

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

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

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

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

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

447
	return 0;
448 449
}

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

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

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

471
	/* Setup the rndis query */
472 473 474 475 476
	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;
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 504
	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) {
505 506 507 508 509 510 511 512 513 514 515 516
		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);
	}

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

521
	wait_for_completion(&request->wait_event);
522

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

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

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

536
	*result_size = query_complete->info_buflen;
537

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

	return ret;
}

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

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

555
	ret = rndis_filter_query_device(dev, net_device,
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 583
					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;
}

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

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

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

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

	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;

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

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

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

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

	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;

706 707 708 709 710 711
	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;
712 713 714 715 716 717
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

835

836
	/* Setup the rndis set */
837 838 839 840
	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);
841

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

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

849
	put_rndis_request(dev, request);
850

851 852 853
	return ret;
}

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

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

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

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

898
	dev->state = RNDIS_DEV_INITIALIZING;
899

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

906
	wait_for_completion(&request->wait_event);
907

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

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

	return ret;
}

927 928 929 930 931 932 933
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];

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

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

	return true;
}

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

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

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

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

964
	dev->state = RNDIS_DEV_UNINITIALIZED;
965

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

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

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

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

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

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

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

	return ret;
}

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

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

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

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

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

	return ret;
}

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

1026 1027 1028 1029 1030
	/* 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)
1031 1032
		return;

1033 1034
	nvchan = nvscdev->chan_table + chn_index;

1035 1036 1037 1038 1039
	/* 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);

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

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

1051 1052
	if (atomic_inc_return(&nvscdev->open_chn) == nvscdev->num_chn)
		wake_up(&nvscdev->subchan_open);
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 1116
/* 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);

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

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133
	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();
}

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

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

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

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

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

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

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

1204 1205 1206 1207 1208
	/* 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;

1209
	netif_set_gso_max_size(net, gso_max_size);
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 1271 1272
	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)
1273 1274
		goto err_dev_remv;

1275
	rndis_filter_query_device_link_status(rndis_device, net_device);
1276

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

1281
	if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)
1282
		return net_device;
1283

1284
	rndis_filter_query_link_speed(rndis_device, net_device);
1285

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

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

1304
	net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, num_possible_rss_qs);
1305

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

	for (i = 0; i < ITAB_NUM; i++)
1310 1311
		rndis_device->rx_table[i] = ethtool_rxfh_indir_default(
						i, net_device->num_chn);
1312

1313
	atomic_set(&net_device->open_chn, 1);
1314
	vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
1315

1316 1317 1318 1319 1320 1321 1322 1323 1324
	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;
		}
	}

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

1329 1330
	if (net_device->num_chn > 1)
		schedule_work(&net_device->subchan_work);
1331

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

1339
	return net_device;
1340 1341

err_dev_remv:
1342
	rndis_filter_device_remove(dev, net_device);
1343
	return ERR_PTR(ret);
1344 1345
}

1346 1347
void rndis_filter_device_remove(struct hv_device *dev,
				struct netvsc_device *net_dev)
1348
{
1349
	struct rndis_device *rndis_dev = net_dev->extension;
1350

1351
	/* Halt and release the rndis device */
1352
	rndis_filter_halt_device(rndis_dev);
1353

1354
	net_dev->extension = NULL;
1355

1356
	netvsc_device_remove(dev);
1357
	kfree(rndis_dev);
1358 1359
}

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

1365
	if (atomic_inc_return(&nvdev->open_cnt) != 1)
1366 1367
		return 0;

1368
	return rndis_filter_open_device(nvdev->extension);
1369 1370
}

1371
int rndis_filter_close(struct netvsc_device *nvdev)
1372
{
1373
	if (!nvdev)
1374 1375
		return -EINVAL;

1376 1377 1378
	if (atomic_dec_return(&nvdev->open_cnt) != 0)
		return 0;

1379
	return rndis_filter_close_device(nvdev->extension);
1380
}
1381 1382 1383 1384 1385

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