1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/slab.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/device.h>
18#include <linux/etherdevice.h>
19
20#include <linux/atomic.h>
21
22#include "u_ether.h"
23#include "u_ether_configfs.h"
24#include "u_rndis.h"
25#include "rndis.h"
26#include "configfs.h"
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69struct f_rndis {
70 struct gether port;
71 u8 ctrl_id, data_id;
72 u8 ethaddr[ETH_ALEN];
73 u32 vendorID;
74 const char *manufacturer;
75 struct rndis_params *params;
76
77 struct usb_ep *notify;
78 struct usb_request *notify_req;
79 atomic_t notify_count;
80};
81
82static inline struct f_rndis *func_to_rndis(struct usb_function *f)
83{
84 return container_of(f, struct f_rndis, port.func);
85}
86
87
88static unsigned int bitrate(struct usb_gadget *g)
89{
90 if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER)
91 return 13 * 1024 * 8 * 1000 * 8;
92 else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
93 return 13 * 512 * 8 * 1000 * 8;
94 else
95 return 19 * 64 * 1 * 1000 * 8;
96}
97
98
99
100
101
102
103#define RNDIS_STATUS_INTERVAL_MS 32
104#define STATUS_BYTECOUNT 8
105
106
107
108
109static struct usb_interface_descriptor rndis_control_intf = {
110 .bLength = sizeof rndis_control_intf,
111 .bDescriptorType = USB_DT_INTERFACE,
112
113
114
115 .bNumEndpoints = 1,
116 .bInterfaceClass = USB_CLASS_COMM,
117 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
118 .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
119
120};
121
122static struct usb_cdc_header_desc header_desc = {
123 .bLength = sizeof header_desc,
124 .bDescriptorType = USB_DT_CS_INTERFACE,
125 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
126
127 .bcdCDC = cpu_to_le16(0x0110),
128};
129
130static struct usb_cdc_call_mgmt_descriptor call_mgmt_descriptor = {
131 .bLength = sizeof call_mgmt_descriptor,
132 .bDescriptorType = USB_DT_CS_INTERFACE,
133 .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
134
135 .bmCapabilities = 0x00,
136 .bDataInterface = 0x01,
137};
138
139static struct usb_cdc_acm_descriptor rndis_acm_descriptor = {
140 .bLength = sizeof rndis_acm_descriptor,
141 .bDescriptorType = USB_DT_CS_INTERFACE,
142 .bDescriptorSubType = USB_CDC_ACM_TYPE,
143
144 .bmCapabilities = 0x00,
145};
146
147static struct usb_cdc_union_desc rndis_union_desc = {
148 .bLength = sizeof(rndis_union_desc),
149 .bDescriptorType = USB_DT_CS_INTERFACE,
150 .bDescriptorSubType = USB_CDC_UNION_TYPE,
151
152
153};
154
155
156
157static struct usb_interface_descriptor rndis_data_intf = {
158 .bLength = sizeof rndis_data_intf,
159 .bDescriptorType = USB_DT_INTERFACE,
160
161
162 .bNumEndpoints = 2,
163 .bInterfaceClass = USB_CLASS_CDC_DATA,
164 .bInterfaceSubClass = 0,
165 .bInterfaceProtocol = 0,
166
167};
168
169
170static struct usb_interface_assoc_descriptor
171rndis_iad_descriptor = {
172 .bLength = sizeof rndis_iad_descriptor,
173 .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
174
175 .bFirstInterface = 0,
176 .bInterfaceCount = 2,
177 .bFunctionClass = USB_CLASS_COMM,
178 .bFunctionSubClass = USB_CDC_SUBCLASS_ETHERNET,
179 .bFunctionProtocol = USB_CDC_PROTO_NONE,
180
181};
182
183
184
185static struct usb_endpoint_descriptor fs_notify_desc = {
186 .bLength = USB_DT_ENDPOINT_SIZE,
187 .bDescriptorType = USB_DT_ENDPOINT,
188
189 .bEndpointAddress = USB_DIR_IN,
190 .bmAttributes = USB_ENDPOINT_XFER_INT,
191 .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT),
192 .bInterval = RNDIS_STATUS_INTERVAL_MS,
193};
194
195static struct usb_endpoint_descriptor fs_in_desc = {
196 .bLength = USB_DT_ENDPOINT_SIZE,
197 .bDescriptorType = USB_DT_ENDPOINT,
198
199 .bEndpointAddress = USB_DIR_IN,
200 .bmAttributes = USB_ENDPOINT_XFER_BULK,
201};
202
203static struct usb_endpoint_descriptor fs_out_desc = {
204 .bLength = USB_DT_ENDPOINT_SIZE,
205 .bDescriptorType = USB_DT_ENDPOINT,
206
207 .bEndpointAddress = USB_DIR_OUT,
208 .bmAttributes = USB_ENDPOINT_XFER_BULK,
209};
210
211static struct usb_descriptor_header *eth_fs_function[] = {
212 (struct usb_descriptor_header *) &rndis_iad_descriptor,
213
214
215 (struct usb_descriptor_header *) &rndis_control_intf,
216 (struct usb_descriptor_header *) &header_desc,
217 (struct usb_descriptor_header *) &call_mgmt_descriptor,
218 (struct usb_descriptor_header *) &rndis_acm_descriptor,
219 (struct usb_descriptor_header *) &rndis_union_desc,
220 (struct usb_descriptor_header *) &fs_notify_desc,
221
222
223 (struct usb_descriptor_header *) &rndis_data_intf,
224 (struct usb_descriptor_header *) &fs_in_desc,
225 (struct usb_descriptor_header *) &fs_out_desc,
226 NULL,
227};
228
229
230
231static struct usb_endpoint_descriptor hs_notify_desc = {
232 .bLength = USB_DT_ENDPOINT_SIZE,
233 .bDescriptorType = USB_DT_ENDPOINT,
234
235 .bEndpointAddress = USB_DIR_IN,
236 .bmAttributes = USB_ENDPOINT_XFER_INT,
237 .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT),
238 .bInterval = USB_MS_TO_HS_INTERVAL(RNDIS_STATUS_INTERVAL_MS)
239};
240
241static struct usb_endpoint_descriptor hs_in_desc = {
242 .bLength = USB_DT_ENDPOINT_SIZE,
243 .bDescriptorType = USB_DT_ENDPOINT,
244
245 .bEndpointAddress = USB_DIR_IN,
246 .bmAttributes = USB_ENDPOINT_XFER_BULK,
247 .wMaxPacketSize = cpu_to_le16(512),
248};
249
250static struct usb_endpoint_descriptor hs_out_desc = {
251 .bLength = USB_DT_ENDPOINT_SIZE,
252 .bDescriptorType = USB_DT_ENDPOINT,
253
254 .bEndpointAddress = USB_DIR_OUT,
255 .bmAttributes = USB_ENDPOINT_XFER_BULK,
256 .wMaxPacketSize = cpu_to_le16(512),
257};
258
259static struct usb_descriptor_header *eth_hs_function[] = {
260 (struct usb_descriptor_header *) &rndis_iad_descriptor,
261
262
263 (struct usb_descriptor_header *) &rndis_control_intf,
264 (struct usb_descriptor_header *) &header_desc,
265 (struct usb_descriptor_header *) &call_mgmt_descriptor,
266 (struct usb_descriptor_header *) &rndis_acm_descriptor,
267 (struct usb_descriptor_header *) &rndis_union_desc,
268 (struct usb_descriptor_header *) &hs_notify_desc,
269
270
271 (struct usb_descriptor_header *) &rndis_data_intf,
272 (struct usb_descriptor_header *) &hs_in_desc,
273 (struct usb_descriptor_header *) &hs_out_desc,
274 NULL,
275};
276
277
278
279static struct usb_endpoint_descriptor ss_notify_desc = {
280 .bLength = USB_DT_ENDPOINT_SIZE,
281 .bDescriptorType = USB_DT_ENDPOINT,
282
283 .bEndpointAddress = USB_DIR_IN,
284 .bmAttributes = USB_ENDPOINT_XFER_INT,
285 .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT),
286 .bInterval = USB_MS_TO_HS_INTERVAL(RNDIS_STATUS_INTERVAL_MS)
287};
288
289static struct usb_ss_ep_comp_descriptor ss_intr_comp_desc = {
290 .bLength = sizeof ss_intr_comp_desc,
291 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
292
293
294
295
296 .wBytesPerInterval = cpu_to_le16(STATUS_BYTECOUNT),
297};
298
299static struct usb_endpoint_descriptor ss_in_desc = {
300 .bLength = USB_DT_ENDPOINT_SIZE,
301 .bDescriptorType = USB_DT_ENDPOINT,
302
303 .bEndpointAddress = USB_DIR_IN,
304 .bmAttributes = USB_ENDPOINT_XFER_BULK,
305 .wMaxPacketSize = cpu_to_le16(1024),
306};
307
308static struct usb_endpoint_descriptor ss_out_desc = {
309 .bLength = USB_DT_ENDPOINT_SIZE,
310 .bDescriptorType = USB_DT_ENDPOINT,
311
312 .bEndpointAddress = USB_DIR_OUT,
313 .bmAttributes = USB_ENDPOINT_XFER_BULK,
314 .wMaxPacketSize = cpu_to_le16(1024),
315};
316
317static struct usb_ss_ep_comp_descriptor ss_bulk_comp_desc = {
318 .bLength = sizeof ss_bulk_comp_desc,
319 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
320
321
322
323
324};
325
326static struct usb_descriptor_header *eth_ss_function[] = {
327 (struct usb_descriptor_header *) &rndis_iad_descriptor,
328
329
330 (struct usb_descriptor_header *) &rndis_control_intf,
331 (struct usb_descriptor_header *) &header_desc,
332 (struct usb_descriptor_header *) &call_mgmt_descriptor,
333 (struct usb_descriptor_header *) &rndis_acm_descriptor,
334 (struct usb_descriptor_header *) &rndis_union_desc,
335 (struct usb_descriptor_header *) &ss_notify_desc,
336 (struct usb_descriptor_header *) &ss_intr_comp_desc,
337
338
339 (struct usb_descriptor_header *) &rndis_data_intf,
340 (struct usb_descriptor_header *) &ss_in_desc,
341 (struct usb_descriptor_header *) &ss_bulk_comp_desc,
342 (struct usb_descriptor_header *) &ss_out_desc,
343 (struct usb_descriptor_header *) &ss_bulk_comp_desc,
344 NULL,
345};
346
347
348
349static struct usb_string rndis_string_defs[] = {
350 [0].s = "RNDIS Communications Control",
351 [1].s = "RNDIS Ethernet Data",
352 [2].s = "RNDIS",
353 { }
354};
355
356static struct usb_gadget_strings rndis_string_table = {
357 .language = 0x0409,
358 .strings = rndis_string_defs,
359};
360
361static struct usb_gadget_strings *rndis_strings[] = {
362 &rndis_string_table,
363 NULL,
364};
365
366
367
368static struct sk_buff *rndis_add_header(struct gether *port,
369 struct sk_buff *skb)
370{
371 struct sk_buff *skb2;
372
373 if (!skb)
374 return NULL;
375
376 skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type));
377 rndis_add_hdr(skb2);
378
379 dev_kfree_skb(skb);
380 return skb2;
381}
382
383static void rndis_response_available(void *_rndis)
384{
385 struct f_rndis *rndis = _rndis;
386 struct usb_request *req = rndis->notify_req;
387 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
388 __le32 *data = req->buf;
389 int status;
390
391 if (atomic_inc_return(&rndis->notify_count) != 1)
392 return;
393
394
395
396
397
398
399 data[0] = cpu_to_le32(1);
400 data[1] = cpu_to_le32(0);
401
402 status = usb_ep_queue(rndis->notify, req, GFP_ATOMIC);
403 if (status) {
404 atomic_dec(&rndis->notify_count);
405 DBG(cdev, "notify/0 --> %d\n", status);
406 }
407}
408
409static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req)
410{
411 struct f_rndis *rndis = req->context;
412 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
413 int status = req->status;
414
415
416
417
418
419 switch (status) {
420 case -ECONNRESET:
421 case -ESHUTDOWN:
422
423 atomic_set(&rndis->notify_count, 0);
424 break;
425 default:
426 DBG(cdev, "RNDIS %s response error %d, %d/%d\n",
427 ep->name, status,
428 req->actual, req->length);
429
430 case 0:
431 if (ep != rndis->notify)
432 break;
433
434
435
436
437 if (atomic_dec_and_test(&rndis->notify_count))
438 break;
439 status = usb_ep_queue(rndis->notify, req, GFP_ATOMIC);
440 if (status) {
441 atomic_dec(&rndis->notify_count);
442 DBG(cdev, "notify/1 --> %d\n", status);
443 }
444 break;
445 }
446}
447
448static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
449{
450 struct f_rndis *rndis = req->context;
451 int status;
452
453
454
455 status = rndis_msg_parser(rndis->params, (u8 *) req->buf);
456 if (status < 0)
457 pr_err("RNDIS command error %d, %d/%d\n",
458 status, req->actual, req->length);
459
460}
461
462static int
463rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
464{
465 struct f_rndis *rndis = func_to_rndis(f);
466 struct usb_composite_dev *cdev = f->config->cdev;
467 struct usb_request *req = cdev->req;
468 int value = -EOPNOTSUPP;
469 u16 w_index = le16_to_cpu(ctrl->wIndex);
470 u16 w_value = le16_to_cpu(ctrl->wValue);
471 u16 w_length = le16_to_cpu(ctrl->wLength);
472
473
474
475
476 switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
477
478
479
480
481 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
482 | USB_CDC_SEND_ENCAPSULATED_COMMAND:
483 if (w_value || w_index != rndis->ctrl_id)
484 goto invalid;
485
486 value = w_length;
487 req->complete = rndis_command_complete;
488 req->context = rndis;
489
490 break;
491
492 case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
493 | USB_CDC_GET_ENCAPSULATED_RESPONSE:
494 if (w_value || w_index != rndis->ctrl_id)
495 goto invalid;
496 else {
497 u8 *buf;
498 u32 n;
499
500
501 buf = rndis_get_next_response(rndis->params, &n);
502 if (buf) {
503 memcpy(req->buf, buf, n);
504 req->complete = rndis_response_complete;
505 req->context = rndis;
506 rndis_free_response(rndis->params, buf);
507 value = n;
508 }
509
510 }
511 break;
512
513 default:
514invalid:
515 VDBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
516 ctrl->bRequestType, ctrl->bRequest,
517 w_value, w_index, w_length);
518 }
519
520
521 if (value >= 0) {
522 DBG(cdev, "rndis req%02x.%02x v%04x i%04x l%d\n",
523 ctrl->bRequestType, ctrl->bRequest,
524 w_value, w_index, w_length);
525 req->zero = (value < w_length);
526 req->length = value;
527 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
528 if (value < 0)
529 ERROR(cdev, "rndis response on err %d\n", value);
530 }
531
532
533 return value;
534}
535
536
537static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
538{
539 struct f_rndis *rndis = func_to_rndis(f);
540 struct usb_composite_dev *cdev = f->config->cdev;
541
542
543
544 if (intf == rndis->ctrl_id) {
545 VDBG(cdev, "reset rndis control %d\n", intf);
546 usb_ep_disable(rndis->notify);
547
548 if (!rndis->notify->desc) {
549 VDBG(cdev, "init rndis ctrl %d\n", intf);
550 if (config_ep_by_speed(cdev->gadget, f, rndis->notify))
551 goto fail;
552 }
553 usb_ep_enable(rndis->notify);
554
555 } else if (intf == rndis->data_id) {
556 struct net_device *net;
557
558 if (rndis->port.in_ep->enabled) {
559 DBG(cdev, "reset rndis\n");
560 gether_disconnect(&rndis->port);
561 }
562
563 if (!rndis->port.in_ep->desc || !rndis->port.out_ep->desc) {
564 DBG(cdev, "init rndis\n");
565 if (config_ep_by_speed(cdev->gadget, f,
566 rndis->port.in_ep) ||
567 config_ep_by_speed(cdev->gadget, f,
568 rndis->port.out_ep)) {
569 rndis->port.in_ep->desc = NULL;
570 rndis->port.out_ep->desc = NULL;
571 goto fail;
572 }
573 }
574
575
576 rndis->port.is_zlp_ok = false;
577
578
579
580
581
582
583
584
585
586
587
588
589
590 rndis->port.cdc_filter = 0;
591
592 DBG(cdev, "RNDIS RX/TX early activation ... \n");
593 net = gether_connect(&rndis->port);
594 if (IS_ERR(net))
595 return PTR_ERR(net);
596
597 rndis_set_param_dev(rndis->params, net,
598 &rndis->port.cdc_filter);
599 } else
600 goto fail;
601
602 return 0;
603fail:
604 return -EINVAL;
605}
606
607static void rndis_disable(struct usb_function *f)
608{
609 struct f_rndis *rndis = func_to_rndis(f);
610 struct usb_composite_dev *cdev = f->config->cdev;
611
612 if (!rndis->notify->enabled)
613 return;
614
615 DBG(cdev, "rndis deactivated\n");
616
617 rndis_uninit(rndis->params);
618 gether_disconnect(&rndis->port);
619
620 usb_ep_disable(rndis->notify);
621}
622
623
624
625
626
627
628
629
630
631
632static void rndis_open(struct gether *geth)
633{
634 struct f_rndis *rndis = func_to_rndis(&geth->func);
635 struct usb_composite_dev *cdev = geth->func.config->cdev;
636
637 DBG(cdev, "%s\n", __func__);
638
639 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3,
640 bitrate(cdev->gadget) / 100);
641 rndis_signal_connect(rndis->params);
642}
643
644static void rndis_close(struct gether *geth)
645{
646 struct f_rndis *rndis = func_to_rndis(&geth->func);
647
648 DBG(geth->func.config->cdev, "%s\n", __func__);
649
650 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
651 rndis_signal_disconnect(rndis->params);
652}
653
654
655
656
657static inline bool can_support_rndis(struct usb_configuration *c)
658{
659
660 return true;
661}
662
663
664
665static int
666rndis_bind(struct usb_configuration *c, struct usb_function *f)
667{
668 struct usb_composite_dev *cdev = c->cdev;
669 struct f_rndis *rndis = func_to_rndis(f);
670 struct usb_string *us;
671 int status;
672 struct usb_ep *ep;
673
674 struct f_rndis_opts *rndis_opts;
675
676 if (!can_support_rndis(c))
677 return -EINVAL;
678
679 rndis_opts = container_of(f->fi, struct f_rndis_opts, func_inst);
680
681 if (cdev->use_os_string) {
682 f->os_desc_table = kzalloc(sizeof(*f->os_desc_table),
683 GFP_KERNEL);
684 if (!f->os_desc_table)
685 return -ENOMEM;
686 f->os_desc_n = 1;
687 f->os_desc_table[0].os_desc = &rndis_opts->rndis_os_desc;
688 }
689
690 rndis_iad_descriptor.bFunctionClass = rndis_opts->class;
691 rndis_iad_descriptor.bFunctionSubClass = rndis_opts->subclass;
692 rndis_iad_descriptor.bFunctionProtocol = rndis_opts->protocol;
693
694
695
696
697
698
699
700
701 if (!rndis_opts->bound) {
702 gether_set_gadget(rndis_opts->net, cdev->gadget);
703 status = gether_register_netdev(rndis_opts->net);
704 if (status)
705 goto fail;
706 rndis_opts->bound = true;
707 }
708
709 us = usb_gstrings_attach(cdev, rndis_strings,
710 ARRAY_SIZE(rndis_string_defs));
711 if (IS_ERR(us)) {
712 status = PTR_ERR(us);
713 goto fail;
714 }
715 rndis_control_intf.iInterface = us[0].id;
716 rndis_data_intf.iInterface = us[1].id;
717 rndis_iad_descriptor.iFunction = us[2].id;
718
719
720 status = usb_interface_id(c, f);
721 if (status < 0)
722 goto fail;
723 rndis->ctrl_id = status;
724 rndis_iad_descriptor.bFirstInterface = status;
725
726 rndis_control_intf.bInterfaceNumber = status;
727 rndis_union_desc.bMasterInterface0 = status;
728
729 if (cdev->use_os_string)
730 f->os_desc_table[0].if_id =
731 rndis_iad_descriptor.bFirstInterface;
732
733 status = usb_interface_id(c, f);
734 if (status < 0)
735 goto fail;
736 rndis->data_id = status;
737
738 rndis_data_intf.bInterfaceNumber = status;
739 rndis_union_desc.bSlaveInterface0 = status;
740
741 status = -ENODEV;
742
743
744 ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
745 if (!ep)
746 goto fail;
747 rndis->port.in_ep = ep;
748
749 ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
750 if (!ep)
751 goto fail;
752 rndis->port.out_ep = ep;
753
754
755
756
757
758 ep = usb_ep_autoconfig(cdev->gadget, &fs_notify_desc);
759 if (!ep)
760 goto fail;
761 rndis->notify = ep;
762
763 status = -ENOMEM;
764
765
766 rndis->notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
767 if (!rndis->notify_req)
768 goto fail;
769 rndis->notify_req->buf = kmalloc(STATUS_BYTECOUNT, GFP_KERNEL);
770 if (!rndis->notify_req->buf)
771 goto fail;
772 rndis->notify_req->length = STATUS_BYTECOUNT;
773 rndis->notify_req->context = rndis;
774 rndis->notify_req->complete = rndis_response_complete;
775
776
777
778
779
780 hs_in_desc.bEndpointAddress = fs_in_desc.bEndpointAddress;
781 hs_out_desc.bEndpointAddress = fs_out_desc.bEndpointAddress;
782 hs_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress;
783
784 ss_in_desc.bEndpointAddress = fs_in_desc.bEndpointAddress;
785 ss_out_desc.bEndpointAddress = fs_out_desc.bEndpointAddress;
786 ss_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress;
787
788 status = usb_assign_descriptors(f, eth_fs_function, eth_hs_function,
789 eth_ss_function, NULL);
790 if (status)
791 goto fail;
792
793 rndis->port.open = rndis_open;
794 rndis->port.close = rndis_close;
795
796 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
797 rndis_set_host_mac(rndis->params, rndis->ethaddr);
798
799 if (rndis->manufacturer && rndis->vendorID &&
800 rndis_set_param_vendor(rndis->params, rndis->vendorID,
801 rndis->manufacturer)) {
802 status = -EINVAL;
803 goto fail_free_descs;
804 }
805
806
807
808
809
810
811 DBG(cdev, "RNDIS: %s speed IN/%s OUT/%s NOTIFY/%s\n",
812 gadget_is_superspeed(c->cdev->gadget) ? "super" :
813 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
814 rndis->port.in_ep->name, rndis->port.out_ep->name,
815 rndis->notify->name);
816 return 0;
817
818fail_free_descs:
819 usb_free_all_descriptors(f);
820fail:
821 kfree(f->os_desc_table);
822 f->os_desc_n = 0;
823
824 if (rndis->notify_req) {
825 kfree(rndis->notify_req->buf);
826 usb_ep_free_request(rndis->notify, rndis->notify_req);
827 }
828
829 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
830
831 return status;
832}
833
834void rndis_borrow_net(struct usb_function_instance *f, struct net_device *net)
835{
836 struct f_rndis_opts *opts;
837
838 opts = container_of(f, struct f_rndis_opts, func_inst);
839 if (opts->bound)
840 gether_cleanup(netdev_priv(opts->net));
841 else
842 free_netdev(opts->net);
843 opts->borrowed_net = opts->bound = true;
844 opts->net = net;
845}
846EXPORT_SYMBOL_GPL(rndis_borrow_net);
847
848static inline struct f_rndis_opts *to_f_rndis_opts(struct config_item *item)
849{
850 return container_of(to_config_group(item), struct f_rndis_opts,
851 func_inst.group);
852}
853
854
855USB_ETHERNET_CONFIGFS_ITEM(rndis);
856
857
858USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(rndis);
859
860
861USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(rndis);
862
863
864USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(rndis);
865
866
867USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(rndis);
868
869
870USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(rndis, class);
871
872
873USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(rndis, subclass);
874
875
876USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(rndis, protocol);
877
878static struct configfs_attribute *rndis_attrs[] = {
879 &rndis_opts_attr_dev_addr,
880 &rndis_opts_attr_host_addr,
881 &rndis_opts_attr_qmult,
882 &rndis_opts_attr_ifname,
883 &rndis_opts_attr_class,
884 &rndis_opts_attr_subclass,
885 &rndis_opts_attr_protocol,
886 NULL,
887};
888
889static const struct config_item_type rndis_func_type = {
890 .ct_item_ops = &rndis_item_ops,
891 .ct_attrs = rndis_attrs,
892 .ct_owner = THIS_MODULE,
893};
894
895static void rndis_free_inst(struct usb_function_instance *f)
896{
897 struct f_rndis_opts *opts;
898
899 opts = container_of(f, struct f_rndis_opts, func_inst);
900 if (!opts->borrowed_net) {
901 if (opts->bound)
902 gether_cleanup(netdev_priv(opts->net));
903 else
904 free_netdev(opts->net);
905 }
906
907 kfree(opts->rndis_interf_group);
908 kfree(opts);
909}
910
911static struct usb_function_instance *rndis_alloc_inst(void)
912{
913 struct f_rndis_opts *opts;
914 struct usb_os_desc *descs[1];
915 char *names[1];
916 struct config_group *rndis_interf_group;
917
918 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
919 if (!opts)
920 return ERR_PTR(-ENOMEM);
921 opts->rndis_os_desc.ext_compat_id = opts->rndis_ext_compat_id;
922
923 mutex_init(&opts->lock);
924 opts->func_inst.free_func_inst = rndis_free_inst;
925 opts->net = gether_setup_default();
926 if (IS_ERR(opts->net)) {
927 struct net_device *net = opts->net;
928 kfree(opts);
929 return ERR_CAST(net);
930 }
931 INIT_LIST_HEAD(&opts->rndis_os_desc.ext_prop);
932
933 opts->class = rndis_iad_descriptor.bFunctionClass;
934 opts->subclass = rndis_iad_descriptor.bFunctionSubClass;
935 opts->protocol = rndis_iad_descriptor.bFunctionProtocol;
936
937 descs[0] = &opts->rndis_os_desc;
938 names[0] = "rndis";
939 config_group_init_type_name(&opts->func_inst.group, "",
940 &rndis_func_type);
941 rndis_interf_group =
942 usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs,
943 names, THIS_MODULE);
944 if (IS_ERR(rndis_interf_group)) {
945 rndis_free_inst(&opts->func_inst);
946 return ERR_CAST(rndis_interf_group);
947 }
948 opts->rndis_interf_group = rndis_interf_group;
949
950 return &opts->func_inst;
951}
952
953static void rndis_free(struct usb_function *f)
954{
955 struct f_rndis *rndis;
956 struct f_rndis_opts *opts;
957
958 rndis = func_to_rndis(f);
959 rndis_deregister(rndis->params);
960 opts = container_of(f->fi, struct f_rndis_opts, func_inst);
961 kfree(rndis);
962 mutex_lock(&opts->lock);
963 opts->refcnt--;
964 mutex_unlock(&opts->lock);
965}
966
967static void rndis_unbind(struct usb_configuration *c, struct usb_function *f)
968{
969 struct f_rndis *rndis = func_to_rndis(f);
970
971 kfree(f->os_desc_table);
972 f->os_desc_n = 0;
973 usb_free_all_descriptors(f);
974
975 kfree(rndis->notify_req->buf);
976 usb_ep_free_request(rndis->notify, rndis->notify_req);
977}
978
979static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
980{
981 struct f_rndis *rndis;
982 struct f_rndis_opts *opts;
983 struct rndis_params *params;
984
985
986 rndis = kzalloc(sizeof(*rndis), GFP_KERNEL);
987 if (!rndis)
988 return ERR_PTR(-ENOMEM);
989
990 opts = container_of(fi, struct f_rndis_opts, func_inst);
991 mutex_lock(&opts->lock);
992 opts->refcnt++;
993
994 gether_get_host_addr_u8(opts->net, rndis->ethaddr);
995 rndis->vendorID = opts->vendor_id;
996 rndis->manufacturer = opts->manufacturer;
997
998 rndis->port.ioport = netdev_priv(opts->net);
999 mutex_unlock(&opts->lock);
1000
1001 rndis->port.cdc_filter = 0;
1002
1003
1004 rndis->port.header_len = sizeof(struct rndis_packet_msg_type);
1005 rndis->port.wrap = rndis_add_header;
1006 rndis->port.unwrap = rndis_rm_hdr;
1007
1008 rndis->port.func.name = "rndis";
1009
1010 rndis->port.func.bind = rndis_bind;
1011 rndis->port.func.unbind = rndis_unbind;
1012 rndis->port.func.set_alt = rndis_set_alt;
1013 rndis->port.func.setup = rndis_setup;
1014 rndis->port.func.disable = rndis_disable;
1015 rndis->port.func.free_func = rndis_free;
1016
1017 params = rndis_register(rndis_response_available, rndis);
1018 if (IS_ERR(params)) {
1019 kfree(rndis);
1020 return ERR_CAST(params);
1021 }
1022 rndis->params = params;
1023
1024 return &rndis->port.func;
1025}
1026
1027DECLARE_USB_FUNCTION_INIT(rndis, rndis_alloc_inst, rndis_alloc);
1028MODULE_LICENSE("GPL");
1029MODULE_AUTHOR("David Brownell");
1030