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