]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/net/hyperv/rndis_filter.c
Merge tag 'for-linus-4.8' of git://git.code.sf.net/p/openipmi/linux-ipmi
[mirror_ubuntu-artful-kernel.git] / drivers / net / hyperv / rndis_filter.c
1 /*
2 * Copyright (c) 2009, Microsoft Corporation.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * 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 * Authors:
17 * Haiyang Zhang <haiyangz@microsoft.com>
18 * Hank Janssen <hjanssen@microsoft.com>
19 */
20 #include <linux/kernel.h>
21 #include <linux/sched.h>
22 #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>
31
32 #include "hyperv_net.h"
33
34
35 #define RNDIS_EXT_LEN PAGE_SIZE
36 struct rndis_request {
37 struct list_head list_ent;
38 struct completion wait_event;
39
40 struct rndis_message response_msg;
41 /*
42 * The buffer for extended info after the RNDIS response message. It's
43 * referenced based on the data offset in the RNDIS message. Its size
44 * is enough for current needs, and should be sufficient for the near
45 * future.
46 */
47 u8 response_ext[RNDIS_EXT_LEN];
48
49 /* Simplify allocation by having a netvsc packet inline */
50 struct hv_netvsc_packet pkt;
51
52 struct rndis_message request_msg;
53 /*
54 * The buffer for the extended info after the RNDIS request message.
55 * It is referenced and sized in a similar way as response_ext.
56 */
57 u8 request_ext[RNDIS_EXT_LEN];
58 };
59
60 static struct rndis_device *get_rndis_device(void)
61 {
62 struct rndis_device *device;
63
64 device = kzalloc(sizeof(struct rndis_device), GFP_KERNEL);
65 if (!device)
66 return NULL;
67
68 spin_lock_init(&device->request_lock);
69
70 INIT_LIST_HEAD(&device->req_list);
71
72 device->state = RNDIS_DEV_UNINITIALIZED;
73
74 return device;
75 }
76
77 static struct rndis_request *get_rndis_request(struct rndis_device *dev,
78 u32 msg_type,
79 u32 msg_len)
80 {
81 struct rndis_request *request;
82 struct rndis_message *rndis_msg;
83 struct rndis_set_request *set;
84 unsigned long flags;
85
86 request = kzalloc(sizeof(struct rndis_request), GFP_KERNEL);
87 if (!request)
88 return NULL;
89
90 init_completion(&request->wait_event);
91
92 rndis_msg = &request->request_msg;
93 rndis_msg->ndis_msg_type = msg_type;
94 rndis_msg->msg_len = msg_len;
95
96 request->pkt.q_idx = 0;
97
98 /*
99 * Set the request id. This field is always after the rndis header for
100 * request/response packet types so we just used the SetRequest as a
101 * template
102 */
103 set = &rndis_msg->msg.set_req;
104 set->req_id = atomic_inc_return(&dev->new_req_id);
105
106 /* Add to the request list */
107 spin_lock_irqsave(&dev->request_lock, flags);
108 list_add_tail(&request->list_ent, &dev->req_list);
109 spin_unlock_irqrestore(&dev->request_lock, flags);
110
111 return request;
112 }
113
114 static void put_rndis_request(struct rndis_device *dev,
115 struct rndis_request *req)
116 {
117 unsigned long flags;
118
119 spin_lock_irqsave(&dev->request_lock, flags);
120 list_del(&req->list_ent);
121 spin_unlock_irqrestore(&dev->request_lock, flags);
122
123 kfree(req);
124 }
125
126 static void dump_rndis_message(struct hv_device *hv_dev,
127 struct rndis_message *rndis_msg)
128 {
129 struct net_device *netdev = hv_get_drvdata(hv_dev);
130
131 switch (rndis_msg->ndis_msg_type) {
132 case RNDIS_MSG_PACKET:
133 netdev_dbg(netdev, "RNDIS_MSG_PACKET (len %u, "
134 "data offset %u data len %u, # oob %u, "
135 "oob offset %u, oob len %u, pkt offset %u, "
136 "pkt len %u\n",
137 rndis_msg->msg_len,
138 rndis_msg->msg.pkt.data_offset,
139 rndis_msg->msg.pkt.data_len,
140 rndis_msg->msg.pkt.num_oob_data_elements,
141 rndis_msg->msg.pkt.oob_data_offset,
142 rndis_msg->msg.pkt.oob_data_len,
143 rndis_msg->msg.pkt.per_pkt_info_offset,
144 rndis_msg->msg.pkt.per_pkt_info_len);
145 break;
146
147 case RNDIS_MSG_INIT_C:
148 netdev_dbg(netdev, "RNDIS_MSG_INIT_C "
149 "(len %u, id 0x%x, status 0x%x, major %d, minor %d, "
150 "device flags %d, max xfer size 0x%x, max pkts %u, "
151 "pkt aligned %u)\n",
152 rndis_msg->msg_len,
153 rndis_msg->msg.init_complete.req_id,
154 rndis_msg->msg.init_complete.status,
155 rndis_msg->msg.init_complete.major_ver,
156 rndis_msg->msg.init_complete.minor_ver,
157 rndis_msg->msg.init_complete.dev_flags,
158 rndis_msg->msg.init_complete.max_xfer_size,
159 rndis_msg->msg.init_complete.
160 max_pkt_per_msg,
161 rndis_msg->msg.init_complete.
162 pkt_alignment_factor);
163 break;
164
165 case RNDIS_MSG_QUERY_C:
166 netdev_dbg(netdev, "RNDIS_MSG_QUERY_C "
167 "(len %u, id 0x%x, status 0x%x, buf len %u, "
168 "buf offset %u)\n",
169 rndis_msg->msg_len,
170 rndis_msg->msg.query_complete.req_id,
171 rndis_msg->msg.query_complete.status,
172 rndis_msg->msg.query_complete.
173 info_buflen,
174 rndis_msg->msg.query_complete.
175 info_buf_offset);
176 break;
177
178 case RNDIS_MSG_SET_C:
179 netdev_dbg(netdev,
180 "RNDIS_MSG_SET_C (len %u, id 0x%x, status 0x%x)\n",
181 rndis_msg->msg_len,
182 rndis_msg->msg.set_complete.req_id,
183 rndis_msg->msg.set_complete.status);
184 break;
185
186 case RNDIS_MSG_INDICATE:
187 netdev_dbg(netdev, "RNDIS_MSG_INDICATE "
188 "(len %u, status 0x%x, buf len %u, buf offset %u)\n",
189 rndis_msg->msg_len,
190 rndis_msg->msg.indicate_status.status,
191 rndis_msg->msg.indicate_status.status_buflen,
192 rndis_msg->msg.indicate_status.status_buf_offset);
193 break;
194
195 default:
196 netdev_dbg(netdev, "0x%x (len %u)\n",
197 rndis_msg->ndis_msg_type,
198 rndis_msg->msg_len);
199 break;
200 }
201 }
202
203 static int rndis_filter_send_request(struct rndis_device *dev,
204 struct rndis_request *req)
205 {
206 int ret;
207 struct hv_netvsc_packet *packet;
208 struct hv_page_buffer page_buf[2];
209 struct hv_page_buffer *pb = page_buf;
210 struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
211
212 /* Setup the packet to send it */
213 packet = &req->pkt;
214
215 packet->total_data_buflen = req->request_msg.msg_len;
216 packet->page_buf_cnt = 1;
217
218 pb[0].pfn = virt_to_phys(&req->request_msg) >>
219 PAGE_SHIFT;
220 pb[0].len = req->request_msg.msg_len;
221 pb[0].offset =
222 (unsigned long)&req->request_msg & (PAGE_SIZE - 1);
223
224 /* Add one page_buf when request_msg crossing page boundary */
225 if (pb[0].offset + pb[0].len > PAGE_SIZE) {
226 packet->page_buf_cnt++;
227 pb[0].len = PAGE_SIZE -
228 pb[0].offset;
229 pb[1].pfn = virt_to_phys((void *)&req->request_msg
230 + pb[0].len) >> PAGE_SHIFT;
231 pb[1].offset = 0;
232 pb[1].len = req->request_msg.msg_len -
233 pb[0].len;
234 }
235
236 ret = netvsc_send(net_device_ctx->device_ctx, packet, NULL, &pb, NULL);
237 return ret;
238 }
239
240 static void rndis_set_link_state(struct rndis_device *rdev,
241 struct rndis_request *request)
242 {
243 u32 link_status;
244 struct rndis_query_complete *query_complete;
245
246 query_complete = &request->response_msg.msg.query_complete;
247
248 if (query_complete->status == RNDIS_STATUS_SUCCESS &&
249 query_complete->info_buflen == sizeof(u32)) {
250 memcpy(&link_status, (void *)((unsigned long)query_complete +
251 query_complete->info_buf_offset), sizeof(u32));
252 rdev->link_state = link_status != 0;
253 }
254 }
255
256 static void rndis_filter_receive_response(struct rndis_device *dev,
257 struct rndis_message *resp)
258 {
259 struct rndis_request *request = NULL;
260 bool found = false;
261 unsigned long flags;
262 struct net_device *ndev = dev->ndev;
263
264 spin_lock_irqsave(&dev->request_lock, flags);
265 list_for_each_entry(request, &dev->req_list, list_ent) {
266 /*
267 * All request/response message contains RequestId as the 1st
268 * field
269 */
270 if (request->request_msg.msg.init_req.req_id
271 == resp->msg.init_complete.req_id) {
272 found = true;
273 break;
274 }
275 }
276 spin_unlock_irqrestore(&dev->request_lock, flags);
277
278 if (found) {
279 if (resp->msg_len <=
280 sizeof(struct rndis_message) + RNDIS_EXT_LEN) {
281 memcpy(&request->response_msg, resp,
282 resp->msg_len);
283 if (request->request_msg.ndis_msg_type ==
284 RNDIS_MSG_QUERY && request->request_msg.msg.
285 query_req.oid == RNDIS_OID_GEN_MEDIA_CONNECT_STATUS)
286 rndis_set_link_state(dev, request);
287 } else {
288 netdev_err(ndev,
289 "rndis response buffer overflow "
290 "detected (size %u max %zu)\n",
291 resp->msg_len,
292 sizeof(struct rndis_message));
293
294 if (resp->ndis_msg_type ==
295 RNDIS_MSG_RESET_C) {
296 /* does not have a request id field */
297 request->response_msg.msg.reset_complete.
298 status = RNDIS_STATUS_BUFFER_OVERFLOW;
299 } else {
300 request->response_msg.msg.
301 init_complete.status =
302 RNDIS_STATUS_BUFFER_OVERFLOW;
303 }
304 }
305
306 complete(&request->wait_event);
307 } else {
308 netdev_err(ndev,
309 "no rndis request found for this response "
310 "(id 0x%x res type 0x%x)\n",
311 resp->msg.init_complete.req_id,
312 resp->ndis_msg_type);
313 }
314 }
315
316 /*
317 * Get the Per-Packet-Info with the specified type
318 * return NULL if not found.
319 */
320 static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type)
321 {
322 struct rndis_per_packet_info *ppi;
323 int len;
324
325 if (rpkt->per_pkt_info_offset == 0)
326 return NULL;
327
328 ppi = (struct rndis_per_packet_info *)((ulong)rpkt +
329 rpkt->per_pkt_info_offset);
330 len = rpkt->per_pkt_info_len;
331
332 while (len > 0) {
333 if (ppi->type == type)
334 return (void *)((ulong)ppi + ppi->ppi_offset);
335 len -= ppi->size;
336 ppi = (struct rndis_per_packet_info *)((ulong)ppi + ppi->size);
337 }
338
339 return NULL;
340 }
341
342 static int rndis_filter_receive_data(struct rndis_device *dev,
343 struct rndis_message *msg,
344 struct hv_netvsc_packet *pkt,
345 void **data,
346 struct vmbus_channel *channel)
347 {
348 struct rndis_packet *rndis_pkt;
349 u32 data_offset;
350 struct ndis_pkt_8021q_info *vlan;
351 struct ndis_tcp_ip_checksum_info *csum_info;
352 u16 vlan_tci = 0;
353 struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
354
355 rndis_pkt = &msg->msg.pkt;
356
357 /* Remove the rndis header and pass it back up the stack */
358 data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset;
359
360 pkt->total_data_buflen -= data_offset;
361
362 /*
363 * Make sure we got a valid RNDIS message, now total_data_buflen
364 * should be the data packet size plus the trailer padding size
365 */
366 if (pkt->total_data_buflen < rndis_pkt->data_len) {
367 netdev_err(dev->ndev, "rndis message buffer "
368 "overflow detected (got %u, min %u)"
369 "...dropping this message!\n",
370 pkt->total_data_buflen, rndis_pkt->data_len);
371 return NVSP_STAT_FAIL;
372 }
373
374 /*
375 * Remove the rndis trailer padding from rndis packet message
376 * rndis_pkt->data_len tell us the real data length, we only copy
377 * the data packet to the stack, without the rndis trailer padding
378 */
379 pkt->total_data_buflen = rndis_pkt->data_len;
380 *data = (void *)((unsigned long)(*data) + data_offset);
381
382 vlan = rndis_get_ppi(rndis_pkt, IEEE_8021Q_INFO);
383 if (vlan) {
384 vlan_tci = VLAN_TAG_PRESENT | vlan->vlanid |
385 (vlan->pri << VLAN_PRIO_SHIFT);
386 }
387
388 csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
389 return netvsc_recv_callback(net_device_ctx->device_ctx, pkt, data,
390 csum_info, channel, vlan_tci);
391 }
392
393 int rndis_filter_receive(struct hv_device *dev,
394 struct hv_netvsc_packet *pkt,
395 void **data,
396 struct vmbus_channel *channel)
397 {
398 struct net_device *ndev = hv_get_drvdata(dev);
399 struct net_device_context *net_device_ctx = netdev_priv(ndev);
400 struct netvsc_device *net_dev = net_device_ctx->nvdev;
401 struct rndis_device *rndis_dev;
402 struct rndis_message *rndis_msg;
403 int ret = 0;
404
405 if (!net_dev) {
406 ret = NVSP_STAT_FAIL;
407 goto exit;
408 }
409
410 /* Make sure the rndis device state is initialized */
411 if (!net_dev->extension) {
412 netdev_err(ndev, "got rndis message but no rndis device - "
413 "dropping this message!\n");
414 ret = NVSP_STAT_FAIL;
415 goto exit;
416 }
417
418 rndis_dev = (struct rndis_device *)net_dev->extension;
419 if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) {
420 netdev_err(ndev, "got rndis message but rndis device "
421 "uninitialized...dropping this message!\n");
422 ret = NVSP_STAT_FAIL;
423 goto exit;
424 }
425
426 rndis_msg = *data;
427
428 if (netif_msg_rx_err(net_device_ctx))
429 dump_rndis_message(dev, rndis_msg);
430
431 switch (rndis_msg->ndis_msg_type) {
432 case RNDIS_MSG_PACKET:
433 /* data msg */
434 ret = rndis_filter_receive_data(rndis_dev, rndis_msg, pkt,
435 data, channel);
436 break;
437
438 case RNDIS_MSG_INIT_C:
439 case RNDIS_MSG_QUERY_C:
440 case RNDIS_MSG_SET_C:
441 /* completion msgs */
442 rndis_filter_receive_response(rndis_dev, rndis_msg);
443 break;
444
445 case RNDIS_MSG_INDICATE:
446 /* notification msgs */
447 netvsc_linkstatus_callback(dev, rndis_msg);
448 break;
449 default:
450 netdev_err(ndev,
451 "unhandled rndis message (type %u len %u)\n",
452 rndis_msg->ndis_msg_type,
453 rndis_msg->msg_len);
454 break;
455 }
456
457 exit:
458 return ret;
459 }
460
461 static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,
462 void *result, u32 *result_size)
463 {
464 struct rndis_request *request;
465 u32 inresult_size = *result_size;
466 struct rndis_query_request *query;
467 struct rndis_query_complete *query_complete;
468 int ret = 0;
469
470 if (!result)
471 return -EINVAL;
472
473 *result_size = 0;
474 request = get_rndis_request(dev, RNDIS_MSG_QUERY,
475 RNDIS_MESSAGE_SIZE(struct rndis_query_request));
476 if (!request) {
477 ret = -ENOMEM;
478 goto cleanup;
479 }
480
481 /* Setup the rndis query */
482 query = &request->request_msg.msg.query_req;
483 query->oid = oid;
484 query->info_buf_offset = sizeof(struct rndis_query_request);
485 query->info_buflen = 0;
486 query->dev_vc_handle = 0;
487
488 if (oid == OID_GEN_RECEIVE_SCALE_CAPABILITIES) {
489 struct ndis_recv_scale_cap *cap;
490
491 request->request_msg.msg_len +=
492 sizeof(struct ndis_recv_scale_cap);
493 query->info_buflen = sizeof(struct ndis_recv_scale_cap);
494 cap = (struct ndis_recv_scale_cap *)((unsigned long)query +
495 query->info_buf_offset);
496 cap->hdr.type = NDIS_OBJECT_TYPE_RSS_CAPABILITIES;
497 cap->hdr.rev = NDIS_RECEIVE_SCALE_CAPABILITIES_REVISION_2;
498 cap->hdr.size = sizeof(struct ndis_recv_scale_cap);
499 }
500
501 ret = rndis_filter_send_request(dev, request);
502 if (ret != 0)
503 goto cleanup;
504
505 wait_for_completion(&request->wait_event);
506
507 /* Copy the response back */
508 query_complete = &request->response_msg.msg.query_complete;
509
510 if (query_complete->info_buflen > inresult_size) {
511 ret = -1;
512 goto cleanup;
513 }
514
515 memcpy(result,
516 (void *)((unsigned long)query_complete +
517 query_complete->info_buf_offset),
518 query_complete->info_buflen);
519
520 *result_size = query_complete->info_buflen;
521
522 cleanup:
523 if (request)
524 put_rndis_request(dev, request);
525
526 return ret;
527 }
528
529 static int rndis_filter_query_device_mac(struct rndis_device *dev)
530 {
531 u32 size = ETH_ALEN;
532
533 return rndis_filter_query_device(dev,
534 RNDIS_OID_802_3_PERMANENT_ADDRESS,
535 dev->hw_mac_adr, &size);
536 }
537
538 #define NWADR_STR "NetworkAddress"
539 #define NWADR_STRLEN 14
540
541 int rndis_filter_set_device_mac(struct net_device *ndev, char *mac)
542 {
543 struct netvsc_device *nvdev = net_device_to_netvsc_device(ndev);
544 struct rndis_device *rdev = nvdev->extension;
545 struct rndis_request *request;
546 struct rndis_set_request *set;
547 struct rndis_config_parameter_info *cpi;
548 wchar_t *cfg_nwadr, *cfg_mac;
549 struct rndis_set_complete *set_complete;
550 char macstr[2*ETH_ALEN+1];
551 u32 extlen = sizeof(struct rndis_config_parameter_info) +
552 2*NWADR_STRLEN + 4*ETH_ALEN;
553 int ret;
554
555 request = get_rndis_request(rdev, RNDIS_MSG_SET,
556 RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
557 if (!request)
558 return -ENOMEM;
559
560 set = &request->request_msg.msg.set_req;
561 set->oid = RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER;
562 set->info_buflen = extlen;
563 set->info_buf_offset = sizeof(struct rndis_set_request);
564 set->dev_vc_handle = 0;
565
566 cpi = (struct rndis_config_parameter_info *)((ulong)set +
567 set->info_buf_offset);
568 cpi->parameter_name_offset =
569 sizeof(struct rndis_config_parameter_info);
570 /* Multiply by 2 because host needs 2 bytes (utf16) for each char */
571 cpi->parameter_name_length = 2*NWADR_STRLEN;
572 cpi->parameter_type = RNDIS_CONFIG_PARAM_TYPE_STRING;
573 cpi->parameter_value_offset =
574 cpi->parameter_name_offset + cpi->parameter_name_length;
575 /* Multiply by 4 because each MAC byte displayed as 2 utf16 chars */
576 cpi->parameter_value_length = 4*ETH_ALEN;
577
578 cfg_nwadr = (wchar_t *)((ulong)cpi + cpi->parameter_name_offset);
579 cfg_mac = (wchar_t *)((ulong)cpi + cpi->parameter_value_offset);
580 ret = utf8s_to_utf16s(NWADR_STR, NWADR_STRLEN, UTF16_HOST_ENDIAN,
581 cfg_nwadr, NWADR_STRLEN);
582 if (ret < 0)
583 goto cleanup;
584 snprintf(macstr, 2*ETH_ALEN+1, "%pm", mac);
585 ret = utf8s_to_utf16s(macstr, 2*ETH_ALEN, UTF16_HOST_ENDIAN,
586 cfg_mac, 2*ETH_ALEN);
587 if (ret < 0)
588 goto cleanup;
589
590 ret = rndis_filter_send_request(rdev, request);
591 if (ret != 0)
592 goto cleanup;
593
594 wait_for_completion(&request->wait_event);
595
596 set_complete = &request->response_msg.msg.set_complete;
597 if (set_complete->status != RNDIS_STATUS_SUCCESS) {
598 netdev_err(ndev, "Fail to set MAC on host side:0x%x\n",
599 set_complete->status);
600 ret = -EINVAL;
601 }
602
603 cleanup:
604 put_rndis_request(rdev, request);
605 return ret;
606 }
607
608 static int
609 rndis_filter_set_offload_params(struct net_device *ndev,
610 struct ndis_offload_params *req_offloads)
611 {
612 struct netvsc_device *nvdev = net_device_to_netvsc_device(ndev);
613 struct rndis_device *rdev = nvdev->extension;
614 struct rndis_request *request;
615 struct rndis_set_request *set;
616 struct ndis_offload_params *offload_params;
617 struct rndis_set_complete *set_complete;
618 u32 extlen = sizeof(struct ndis_offload_params);
619 int ret;
620 u32 vsp_version = nvdev->nvsp_version;
621
622 if (vsp_version <= NVSP_PROTOCOL_VERSION_4) {
623 extlen = VERSION_4_OFFLOAD_SIZE;
624 /* On NVSP_PROTOCOL_VERSION_4 and below, we do not support
625 * UDP checksum offload.
626 */
627 req_offloads->udp_ip_v4_csum = 0;
628 req_offloads->udp_ip_v6_csum = 0;
629 }
630
631 request = get_rndis_request(rdev, RNDIS_MSG_SET,
632 RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
633 if (!request)
634 return -ENOMEM;
635
636 set = &request->request_msg.msg.set_req;
637 set->oid = OID_TCP_OFFLOAD_PARAMETERS;
638 set->info_buflen = extlen;
639 set->info_buf_offset = sizeof(struct rndis_set_request);
640 set->dev_vc_handle = 0;
641
642 offload_params = (struct ndis_offload_params *)((ulong)set +
643 set->info_buf_offset);
644 *offload_params = *req_offloads;
645 offload_params->header.type = NDIS_OBJECT_TYPE_DEFAULT;
646 offload_params->header.revision = NDIS_OFFLOAD_PARAMETERS_REVISION_3;
647 offload_params->header.size = extlen;
648
649 ret = rndis_filter_send_request(rdev, request);
650 if (ret != 0)
651 goto cleanup;
652
653 wait_for_completion(&request->wait_event);
654 set_complete = &request->response_msg.msg.set_complete;
655 if (set_complete->status != RNDIS_STATUS_SUCCESS) {
656 netdev_err(ndev, "Fail to set offload on host side:0x%x\n",
657 set_complete->status);
658 ret = -EINVAL;
659 }
660
661 cleanup:
662 put_rndis_request(rdev, request);
663 return ret;
664 }
665
666 u8 netvsc_hash_key[HASH_KEYLEN] = {
667 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
668 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
669 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
670 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
671 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
672 };
673
674 static int rndis_filter_set_rss_param(struct rndis_device *rdev, int num_queue)
675 {
676 struct net_device *ndev = rdev->ndev;
677 struct rndis_request *request;
678 struct rndis_set_request *set;
679 struct rndis_set_complete *set_complete;
680 u32 extlen = sizeof(struct ndis_recv_scale_param) +
681 4*ITAB_NUM + HASH_KEYLEN;
682 struct ndis_recv_scale_param *rssp;
683 u32 *itab;
684 u8 *keyp;
685 int i, ret;
686
687 request = get_rndis_request(
688 rdev, RNDIS_MSG_SET,
689 RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
690 if (!request)
691 return -ENOMEM;
692
693 set = &request->request_msg.msg.set_req;
694 set->oid = OID_GEN_RECEIVE_SCALE_PARAMETERS;
695 set->info_buflen = extlen;
696 set->info_buf_offset = sizeof(struct rndis_set_request);
697 set->dev_vc_handle = 0;
698
699 rssp = (struct ndis_recv_scale_param *)(set + 1);
700 rssp->hdr.type = NDIS_OBJECT_TYPE_RSS_PARAMETERS;
701 rssp->hdr.rev = NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2;
702 rssp->hdr.size = sizeof(struct ndis_recv_scale_param);
703 rssp->flag = 0;
704 rssp->hashinfo = NDIS_HASH_FUNC_TOEPLITZ | NDIS_HASH_IPV4 |
705 NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV6 |
706 NDIS_HASH_TCP_IPV6;
707 rssp->indirect_tabsize = 4*ITAB_NUM;
708 rssp->indirect_taboffset = sizeof(struct ndis_recv_scale_param);
709 rssp->hashkey_size = HASH_KEYLEN;
710 rssp->kashkey_offset = rssp->indirect_taboffset +
711 rssp->indirect_tabsize;
712
713 /* Set indirection table entries */
714 itab = (u32 *)(rssp + 1);
715 for (i = 0; i < ITAB_NUM; i++)
716 itab[i] = i % num_queue;
717
718 /* Set hask key values */
719 keyp = (u8 *)((unsigned long)rssp + rssp->kashkey_offset);
720 for (i = 0; i < HASH_KEYLEN; i++)
721 keyp[i] = netvsc_hash_key[i];
722
723
724 ret = rndis_filter_send_request(rdev, request);
725 if (ret != 0)
726 goto cleanup;
727
728 wait_for_completion(&request->wait_event);
729 set_complete = &request->response_msg.msg.set_complete;
730 if (set_complete->status != RNDIS_STATUS_SUCCESS) {
731 netdev_err(ndev, "Fail to set RSS parameters:0x%x\n",
732 set_complete->status);
733 ret = -EINVAL;
734 }
735
736 cleanup:
737 put_rndis_request(rdev, request);
738 return ret;
739 }
740
741
742 static int rndis_filter_query_device_link_status(struct rndis_device *dev)
743 {
744 u32 size = sizeof(u32);
745 u32 link_status;
746 int ret;
747
748 ret = rndis_filter_query_device(dev,
749 RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
750 &link_status, &size);
751
752 return ret;
753 }
754
755 int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter)
756 {
757 struct rndis_request *request;
758 struct rndis_set_request *set;
759 struct rndis_set_complete *set_complete;
760 u32 status;
761 int ret;
762
763 request = get_rndis_request(dev, RNDIS_MSG_SET,
764 RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
765 sizeof(u32));
766 if (!request) {
767 ret = -ENOMEM;
768 goto cleanup;
769 }
770
771 /* Setup the rndis set */
772 set = &request->request_msg.msg.set_req;
773 set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
774 set->info_buflen = sizeof(u32);
775 set->info_buf_offset = sizeof(struct rndis_set_request);
776
777 memcpy((void *)(unsigned long)set + sizeof(struct rndis_set_request),
778 &new_filter, sizeof(u32));
779
780 ret = rndis_filter_send_request(dev, request);
781 if (ret != 0)
782 goto cleanup;
783
784 wait_for_completion(&request->wait_event);
785
786 set_complete = &request->response_msg.msg.set_complete;
787 status = set_complete->status;
788
789 cleanup:
790 if (request)
791 put_rndis_request(dev, request);
792 return ret;
793 }
794
795
796 static int rndis_filter_init_device(struct rndis_device *dev)
797 {
798 struct rndis_request *request;
799 struct rndis_initialize_request *init;
800 struct rndis_initialize_complete *init_complete;
801 u32 status;
802 int ret;
803 struct netvsc_device *nvdev = net_device_to_netvsc_device(dev->ndev);
804
805 request = get_rndis_request(dev, RNDIS_MSG_INIT,
806 RNDIS_MESSAGE_SIZE(struct rndis_initialize_request));
807 if (!request) {
808 ret = -ENOMEM;
809 goto cleanup;
810 }
811
812 /* Setup the rndis set */
813 init = &request->request_msg.msg.init_req;
814 init->major_ver = RNDIS_MAJOR_VERSION;
815 init->minor_ver = RNDIS_MINOR_VERSION;
816 init->max_xfer_size = 0x4000;
817
818 dev->state = RNDIS_DEV_INITIALIZING;
819
820 ret = rndis_filter_send_request(dev, request);
821 if (ret != 0) {
822 dev->state = RNDIS_DEV_UNINITIALIZED;
823 goto cleanup;
824 }
825
826 wait_for_completion(&request->wait_event);
827
828 init_complete = &request->response_msg.msg.init_complete;
829 status = init_complete->status;
830 if (status == RNDIS_STATUS_SUCCESS) {
831 dev->state = RNDIS_DEV_INITIALIZED;
832 nvdev->max_pkt = init_complete->max_pkt_per_msg;
833 nvdev->pkt_align = 1 << init_complete->pkt_alignment_factor;
834 ret = 0;
835 } else {
836 dev->state = RNDIS_DEV_UNINITIALIZED;
837 ret = -EINVAL;
838 }
839
840 cleanup:
841 if (request)
842 put_rndis_request(dev, request);
843
844 return ret;
845 }
846
847 static void rndis_filter_halt_device(struct rndis_device *dev)
848 {
849 struct rndis_request *request;
850 struct rndis_halt_request *halt;
851 struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
852 struct netvsc_device *nvdev = net_device_ctx->nvdev;
853 struct hv_device *hdev = net_device_ctx->device_ctx;
854 ulong flags;
855
856 /* Attempt to do a rndis device halt */
857 request = get_rndis_request(dev, RNDIS_MSG_HALT,
858 RNDIS_MESSAGE_SIZE(struct rndis_halt_request));
859 if (!request)
860 goto cleanup;
861
862 /* Setup the rndis set */
863 halt = &request->request_msg.msg.halt_req;
864 halt->req_id = atomic_inc_return(&dev->new_req_id);
865
866 /* Ignore return since this msg is optional. */
867 rndis_filter_send_request(dev, request);
868
869 dev->state = RNDIS_DEV_UNINITIALIZED;
870
871 cleanup:
872 spin_lock_irqsave(&hdev->channel->inbound_lock, flags);
873 nvdev->destroy = true;
874 spin_unlock_irqrestore(&hdev->channel->inbound_lock, flags);
875
876 /* Wait for all send completions */
877 wait_event(nvdev->wait_drain,
878 atomic_read(&nvdev->num_outstanding_sends) == 0);
879
880 if (request)
881 put_rndis_request(dev, request);
882 return;
883 }
884
885 static int rndis_filter_open_device(struct rndis_device *dev)
886 {
887 int ret;
888
889 if (dev->state != RNDIS_DEV_INITIALIZED)
890 return 0;
891
892 ret = rndis_filter_set_packet_filter(dev,
893 NDIS_PACKET_TYPE_BROADCAST |
894 NDIS_PACKET_TYPE_ALL_MULTICAST |
895 NDIS_PACKET_TYPE_DIRECTED);
896 if (ret == 0)
897 dev->state = RNDIS_DEV_DATAINITIALIZED;
898
899 return ret;
900 }
901
902 static int rndis_filter_close_device(struct rndis_device *dev)
903 {
904 int ret;
905
906 if (dev->state != RNDIS_DEV_DATAINITIALIZED)
907 return 0;
908
909 ret = rndis_filter_set_packet_filter(dev, 0);
910 if (ret == -ENODEV)
911 ret = 0;
912
913 if (ret == 0)
914 dev->state = RNDIS_DEV_INITIALIZED;
915
916 return ret;
917 }
918
919 static void netvsc_sc_open(struct vmbus_channel *new_sc)
920 {
921 struct net_device *ndev =
922 hv_get_drvdata(new_sc->primary_channel->device_obj);
923 struct netvsc_device *nvscdev = net_device_to_netvsc_device(ndev);
924 u16 chn_index = new_sc->offermsg.offer.sub_channel_index;
925 int ret;
926 unsigned long flags;
927
928 if (chn_index >= nvscdev->num_chn)
929 return;
930
931 set_per_channel_state(new_sc, nvscdev->sub_cb_buf + (chn_index - 1) *
932 NETVSC_PACKET_SIZE);
933
934 ret = vmbus_open(new_sc, nvscdev->ring_size * PAGE_SIZE,
935 nvscdev->ring_size * PAGE_SIZE, NULL, 0,
936 netvsc_channel_cb, new_sc);
937
938 if (ret == 0)
939 nvscdev->chn_table[chn_index] = new_sc;
940
941 spin_lock_irqsave(&nvscdev->sc_lock, flags);
942 nvscdev->num_sc_offered--;
943 spin_unlock_irqrestore(&nvscdev->sc_lock, flags);
944 if (nvscdev->num_sc_offered == 0)
945 complete(&nvscdev->channel_init_wait);
946 }
947
948 int rndis_filter_device_add(struct hv_device *dev,
949 void *additional_info)
950 {
951 int ret;
952 struct net_device *net = hv_get_drvdata(dev);
953 struct net_device_context *net_device_ctx = netdev_priv(net);
954 struct netvsc_device *net_device;
955 struct rndis_device *rndis_device;
956 struct netvsc_device_info *device_info = additional_info;
957 struct ndis_offload_params offloads;
958 struct nvsp_message *init_packet;
959 struct ndis_recv_scale_cap rsscap;
960 u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
961 u32 mtu, size;
962 u32 num_rss_qs;
963 u32 sc_delta;
964 const struct cpumask *node_cpu_mask;
965 u32 num_possible_rss_qs;
966 unsigned long flags;
967
968 rndis_device = get_rndis_device();
969 if (!rndis_device)
970 return -ENODEV;
971
972 /*
973 * Let the inner driver handle this first to create the netvsc channel
974 * NOTE! Once the channel is created, we may get a receive callback
975 * (RndisFilterOnReceive()) before this call is completed
976 */
977 ret = netvsc_device_add(dev, additional_info);
978 if (ret != 0) {
979 kfree(rndis_device);
980 return ret;
981 }
982
983 /* Initialize the rndis device */
984 net_device = net_device_ctx->nvdev;
985 net_device->max_chn = 1;
986 net_device->num_chn = 1;
987
988 spin_lock_init(&net_device->sc_lock);
989
990 net_device->extension = rndis_device;
991 rndis_device->ndev = net;
992
993 /* Send the rndis initialization message */
994 ret = rndis_filter_init_device(rndis_device);
995 if (ret != 0) {
996 rndis_filter_device_remove(dev);
997 return ret;
998 }
999
1000 /* Get the MTU from the host */
1001 size = sizeof(u32);
1002 ret = rndis_filter_query_device(rndis_device,
1003 RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
1004 &mtu, &size);
1005 if (ret == 0 && size == sizeof(u32) && mtu < net->mtu)
1006 net->mtu = mtu;
1007
1008 /* Get the mac address */
1009 ret = rndis_filter_query_device_mac(rndis_device);
1010 if (ret != 0) {
1011 rndis_filter_device_remove(dev);
1012 return ret;
1013 }
1014
1015 memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
1016
1017 /* Turn on the offloads; the host supports all of the relevant
1018 * offloads.
1019 */
1020 memset(&offloads, 0, sizeof(struct ndis_offload_params));
1021 /* A value of zero means "no change"; now turn on what we
1022 * want.
1023 */
1024 offloads.ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
1025 offloads.tcp_ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
1026 offloads.udp_ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
1027 offloads.tcp_ip_v6_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
1028 offloads.udp_ip_v6_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
1029 offloads.lso_v2_ipv4 = NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED;
1030
1031
1032 ret = rndis_filter_set_offload_params(net, &offloads);
1033 if (ret)
1034 goto err_dev_remv;
1035
1036 rndis_filter_query_device_link_status(rndis_device);
1037
1038 device_info->link_state = rndis_device->link_state;
1039
1040 dev_info(&dev->device, "Device MAC %pM link state %s\n",
1041 rndis_device->hw_mac_adr,
1042 device_info->link_state ? "down" : "up");
1043
1044 if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)
1045 return 0;
1046
1047 /* vRSS setup */
1048 memset(&rsscap, 0, rsscap_size);
1049 ret = rndis_filter_query_device(rndis_device,
1050 OID_GEN_RECEIVE_SCALE_CAPABILITIES,
1051 &rsscap, &rsscap_size);
1052 if (ret || rsscap.num_recv_que < 2)
1053 goto out;
1054
1055 net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, rsscap.num_recv_que);
1056
1057 num_rss_qs = min(device_info->max_num_vrss_chns, net_device->max_chn);
1058
1059 /*
1060 * We will limit the VRSS channels to the number CPUs in the NUMA node
1061 * the primary channel is currently bound to.
1062 */
1063 node_cpu_mask = cpumask_of_node(cpu_to_node(dev->channel->target_cpu));
1064 num_possible_rss_qs = cpumask_weight(node_cpu_mask);
1065
1066 /* We will use the given number of channels if available. */
1067 if (device_info->num_chn && device_info->num_chn < net_device->max_chn)
1068 net_device->num_chn = device_info->num_chn;
1069 else
1070 net_device->num_chn = min(num_possible_rss_qs, num_rss_qs);
1071
1072 num_rss_qs = net_device->num_chn - 1;
1073 net_device->num_sc_offered = num_rss_qs;
1074
1075 if (net_device->num_chn == 1)
1076 goto out;
1077
1078 net_device->sub_cb_buf = vzalloc((net_device->num_chn - 1) *
1079 NETVSC_PACKET_SIZE);
1080 if (!net_device->sub_cb_buf) {
1081 net_device->num_chn = 1;
1082 dev_info(&dev->device, "No memory for subchannels.\n");
1083 goto out;
1084 }
1085
1086 vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
1087
1088 init_packet = &net_device->channel_init_pkt;
1089 memset(init_packet, 0, sizeof(struct nvsp_message));
1090 init_packet->hdr.msg_type = NVSP_MSG5_TYPE_SUBCHANNEL;
1091 init_packet->msg.v5_msg.subchn_req.op = NVSP_SUBCHANNEL_ALLOCATE;
1092 init_packet->msg.v5_msg.subchn_req.num_subchannels =
1093 net_device->num_chn - 1;
1094 ret = vmbus_sendpacket(dev->channel, init_packet,
1095 sizeof(struct nvsp_message),
1096 (unsigned long)init_packet,
1097 VM_PKT_DATA_INBAND,
1098 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
1099 if (ret)
1100 goto out;
1101 wait_for_completion(&net_device->channel_init_wait);
1102
1103 if (init_packet->msg.v5_msg.subchn_comp.status !=
1104 NVSP_STAT_SUCCESS) {
1105 ret = -ENODEV;
1106 goto out;
1107 }
1108 net_device->num_chn = 1 +
1109 init_packet->msg.v5_msg.subchn_comp.num_subchannels;
1110
1111 ret = rndis_filter_set_rss_param(rndis_device, net_device->num_chn);
1112
1113 /*
1114 * Set the number of sub-channels to be received.
1115 */
1116 spin_lock_irqsave(&net_device->sc_lock, flags);
1117 sc_delta = num_rss_qs - (net_device->num_chn - 1);
1118 net_device->num_sc_offered -= sc_delta;
1119 spin_unlock_irqrestore(&net_device->sc_lock, flags);
1120
1121 out:
1122 if (ret) {
1123 net_device->max_chn = 1;
1124 net_device->num_chn = 1;
1125 net_device->num_sc_offered = 0;
1126 }
1127
1128 return 0; /* return 0 because primary channel can be used alone */
1129
1130 err_dev_remv:
1131 rndis_filter_device_remove(dev);
1132 return ret;
1133 }
1134
1135 void rndis_filter_device_remove(struct hv_device *dev)
1136 {
1137 struct netvsc_device *net_dev = hv_device_to_netvsc_device(dev);
1138 struct rndis_device *rndis_dev = net_dev->extension;
1139
1140 /* If not all subchannel offers are complete, wait for them until
1141 * completion to avoid race.
1142 */
1143 if (net_dev->num_sc_offered > 0)
1144 wait_for_completion(&net_dev->channel_init_wait);
1145
1146 /* Halt and release the rndis device */
1147 rndis_filter_halt_device(rndis_dev);
1148
1149 kfree(rndis_dev);
1150 net_dev->extension = NULL;
1151
1152 netvsc_device_remove(dev);
1153 }
1154
1155
1156 int rndis_filter_open(struct netvsc_device *nvdev)
1157 {
1158 if (!nvdev)
1159 return -EINVAL;
1160
1161 if (atomic_inc_return(&nvdev->open_cnt) != 1)
1162 return 0;
1163
1164 return rndis_filter_open_device(nvdev->extension);
1165 }
1166
1167 int rndis_filter_close(struct netvsc_device *nvdev)
1168 {
1169 if (!nvdev)
1170 return -EINVAL;
1171
1172 if (atomic_dec_return(&nvdev->open_cnt) != 0)
1173 return 0;
1174
1175 return rndis_filter_close_device(nvdev->extension);
1176 }