rndis.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431
  1. /*
  2. * RNDIS MSG parser
  3. *
  4. * Authors: Benedikt Spranger, Pengutronix
  5. * Robert Schwebel, Pengutronix
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * version 2, as published by the Free Software Foundation.
  10. *
  11. * This software was originally developed in conformance with
  12. * Microsoft's Remote NDIS Specification License Agreement.
  13. *
  14. * 03/12/2004 Kai-Uwe Bloem <linux-development@auerswald.de>
  15. * Fixed message length bug in init_response
  16. *
  17. * 03/25/2004 Kai-Uwe Bloem <linux-development@auerswald.de>
  18. * Fixed rndis_rm_hdr length bug.
  19. *
  20. * Copyright (C) 2004 by David Brownell
  21. * updates to merge with Linux 2.6, better match RNDIS spec
  22. */
  23. #include <linux/module.h>
  24. #include <linux/moduleparam.h>
  25. #include <linux/kernel.h>
  26. #include <linux/errno.h>
  27. #include <linux/init.h>
  28. #include <linux/list.h>
  29. #include <linux/proc_fs.h>
  30. #include <linux/slab.h>
  31. #include <linux/seq_file.h>
  32. #include <linux/netdevice.h>
  33. #include <asm/io.h>
  34. #include <asm/byteorder.h>
  35. #include <asm/unaligned.h>
  36. #undef VERBOSE_DEBUG
  37. #include "rndis.h"
  38. /* The driver for your USB chip needs to support ep0 OUT to work with
  39. * RNDIS, plus all three CDC Ethernet endpoints (interrupt not optional).
  40. *
  41. * Windows hosts need an INF file like Documentation/usb/linux.inf
  42. * and will be happier if you provide the host_addr module parameter.
  43. */
  44. #if 0
  45. static int rndis_debug = 0;
  46. module_param (rndis_debug, int, 0);
  47. MODULE_PARM_DESC (rndis_debug, "enable debugging");
  48. #else
  49. #define rndis_debug 0
  50. #endif
  51. #define RNDIS_MAX_CONFIGS 1
  52. int rndis_ul_max_pkt_per_xfer_rcvd;
  53. module_param(rndis_ul_max_pkt_per_xfer_rcvd, int, S_IRUGO);
  54. MODULE_PARM_DESC(rndis_ul_max_pkt_per_xfer_rcvd,
  55. "Max num of REMOTE_NDIS_PACKET_MSGs received in a single transfer");
  56. int rndis_ul_max_xfer_size_rcvd;
  57. module_param(rndis_ul_max_xfer_size_rcvd, int, S_IRUGO);
  58. MODULE_PARM_DESC(rndis_ul_max_xfer_size_rcvd,
  59. "Max size of bus transfer received");
  60. static rndis_params rndis_per_dev_params[RNDIS_MAX_CONFIGS];
  61. /* Driver Version */
  62. static const __le32 rndis_driver_version = cpu_to_le32(1);
  63. /* Function Prototypes */
  64. static rndis_resp_t *rndis_add_response(int configNr, u32 length);
  65. /* supported OIDs */
  66. static const u32 oid_supported_list[] =
  67. {
  68. /* the general stuff */
  69. RNDIS_OID_GEN_SUPPORTED_LIST,
  70. RNDIS_OID_GEN_HARDWARE_STATUS,
  71. RNDIS_OID_GEN_MEDIA_SUPPORTED,
  72. RNDIS_OID_GEN_MEDIA_IN_USE,
  73. RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
  74. RNDIS_OID_GEN_LINK_SPEED,
  75. RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE,
  76. RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE,
  77. RNDIS_OID_GEN_VENDOR_ID,
  78. RNDIS_OID_GEN_VENDOR_DESCRIPTION,
  79. RNDIS_OID_GEN_VENDOR_DRIVER_VERSION,
  80. RNDIS_OID_GEN_CURRENT_PACKET_FILTER,
  81. RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE,
  82. RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
  83. RNDIS_OID_GEN_PHYSICAL_MEDIUM,
  84. /* the statistical stuff */
  85. RNDIS_OID_GEN_XMIT_OK,
  86. RNDIS_OID_GEN_RCV_OK,
  87. RNDIS_OID_GEN_XMIT_ERROR,
  88. RNDIS_OID_GEN_RCV_ERROR,
  89. RNDIS_OID_GEN_RCV_NO_BUFFER,
  90. #ifdef RNDIS_OPTIONAL_STATS
  91. RNDIS_OID_GEN_DIRECTED_BYTES_XMIT,
  92. RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT,
  93. RNDIS_OID_GEN_MULTICAST_BYTES_XMIT,
  94. RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT,
  95. RNDIS_OID_GEN_BROADCAST_BYTES_XMIT,
  96. RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT,
  97. RNDIS_OID_GEN_DIRECTED_BYTES_RCV,
  98. RNDIS_OID_GEN_DIRECTED_FRAMES_RCV,
  99. RNDIS_OID_GEN_MULTICAST_BYTES_RCV,
  100. RNDIS_OID_GEN_MULTICAST_FRAMES_RCV,
  101. RNDIS_OID_GEN_BROADCAST_BYTES_RCV,
  102. RNDIS_OID_GEN_BROADCAST_FRAMES_RCV,
  103. RNDIS_OID_GEN_RCV_CRC_ERROR,
  104. RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH,
  105. #endif /* RNDIS_OPTIONAL_STATS */
  106. /* mandatory 802.3 */
  107. /* the general stuff */
  108. RNDIS_OID_802_3_PERMANENT_ADDRESS,
  109. RNDIS_OID_802_3_CURRENT_ADDRESS,
  110. RNDIS_OID_802_3_MULTICAST_LIST,
  111. RNDIS_OID_802_3_MAC_OPTIONS,
  112. RNDIS_OID_802_3_MAXIMUM_LIST_SIZE,
  113. /* the statistical stuff */
  114. RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT,
  115. RNDIS_OID_802_3_XMIT_ONE_COLLISION,
  116. RNDIS_OID_802_3_XMIT_MORE_COLLISIONS,
  117. #ifdef RNDIS_OPTIONAL_STATS
  118. RNDIS_OID_802_3_XMIT_DEFERRED,
  119. RNDIS_OID_802_3_XMIT_MAX_COLLISIONS,
  120. RNDIS_OID_802_3_RCV_OVERRUN,
  121. RNDIS_OID_802_3_XMIT_UNDERRUN,
  122. RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE,
  123. RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST,
  124. RNDIS_OID_802_3_XMIT_LATE_COLLISIONS,
  125. #endif /* RNDIS_OPTIONAL_STATS */
  126. #ifdef RNDIS_PM
  127. /* PM and wakeup are "mandatory" for USB, but the RNDIS specs
  128. * don't say what they mean ... and the NDIS specs are often
  129. * confusing and/or ambiguous in this context. (That is, more
  130. * so than their specs for the other OIDs.)
  131. *
  132. * FIXME someone who knows what these should do, please
  133. * implement them!
  134. */
  135. /* power management */
  136. OID_PNP_CAPABILITIES,
  137. OID_PNP_QUERY_POWER,
  138. OID_PNP_SET_POWER,
  139. #ifdef RNDIS_WAKEUP
  140. /* wake up host */
  141. OID_PNP_ENABLE_WAKE_UP,
  142. OID_PNP_ADD_WAKE_UP_PATTERN,
  143. OID_PNP_REMOVE_WAKE_UP_PATTERN,
  144. #endif /* RNDIS_WAKEUP */
  145. #endif /* RNDIS_PM */
  146. };
  147. unsigned long rndis_test_reset_msg_cnt = 0;
  148. u32 rndis_test_last_msg_id = 0;
  149. extern u32 rndis_test_last_resp_id;
  150. extern unsigned long rndis_test_rx_usb_in;
  151. extern unsigned long rndis_test_rx_net_out;
  152. extern unsigned long rndis_test_rx_nomem;
  153. extern unsigned long rndis_test_rx_error;
  154. extern unsigned long rndis_test_tx_net_in;
  155. extern unsigned long rndis_test_tx_busy;
  156. extern unsigned long rndis_test_tx_usb_out;
  157. extern unsigned long rndis_test_tx_complete;
  158. /* NDIS Functions */
  159. static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
  160. unsigned buf_len, rndis_resp_t *r)
  161. {
  162. int retval = -ENOTSUPP;
  163. u32 length = 4; /* usually */
  164. __le32 *outbuf;
  165. int i, count;
  166. rndis_query_cmplt_type *resp;
  167. struct net_device *net;
  168. struct rtnl_link_stats64 temp;
  169. const struct rtnl_link_stats64 *stats;
  170. if (!r) return -ENOMEM;
  171. resp = (rndis_query_cmplt_type *)r->buf;
  172. if (!resp) return -ENOMEM;
  173. if (buf_len && rndis_debug > 1) {
  174. pr_debug("query OID %08x value, len %d:\n", OID, buf_len);
  175. for (i = 0; i < buf_len; i += 16) {
  176. pr_debug("%03d: %08x %08x %08x %08x\n", i,
  177. get_unaligned_le32(&buf[i]),
  178. get_unaligned_le32(&buf[i + 4]),
  179. get_unaligned_le32(&buf[i + 8]),
  180. get_unaligned_le32(&buf[i + 12]));
  181. }
  182. }
  183. /* response goes here, right after the header */
  184. outbuf = (__le32 *)&resp[1];
  185. resp->InformationBufferOffset = cpu_to_le32(16);
  186. net = rndis_per_dev_params[configNr].dev;
  187. stats = dev_get_stats(net, &temp);
  188. if (rndis_debug){
  189. pr_debug("gen_ndis_query_resp, OID is 0x%x, configNr is %d\n", OID, configNr) ;
  190. }
  191. switch (OID) {
  192. /* general oids (table 4-1) */
  193. /* mandatory */
  194. case RNDIS_OID_GEN_SUPPORTED_LIST:
  195. pr_debug("%s: RNDIS_OID_GEN_SUPPORTED_LIST\n", __func__);
  196. length = sizeof(oid_supported_list);
  197. count = length / sizeof(u32);
  198. for (i = 0; i < count; i++)
  199. outbuf[i] = cpu_to_le32(oid_supported_list[i]);
  200. retval = 0;
  201. break;
  202. /* mandatory */
  203. case RNDIS_OID_GEN_HARDWARE_STATUS:
  204. pr_debug("%s: RNDIS_OID_GEN_HARDWARE_STATUS\n", __func__);
  205. /* Bogus question!
  206. * Hardware must be ready to receive high level protocols.
  207. * BTW:
  208. * reddite ergo quae sunt Caesaris Caesari
  209. * et quae sunt Dei Deo!
  210. */
  211. *outbuf = cpu_to_le32(0);
  212. retval = 0;
  213. break;
  214. /* mandatory */
  215. case RNDIS_OID_GEN_MEDIA_SUPPORTED:
  216. pr_debug("%s: RNDIS_OID_GEN_MEDIA_SUPPORTED\n", __func__);
  217. *outbuf = cpu_to_le32(rndis_per_dev_params[configNr].medium);
  218. retval = 0;
  219. break;
  220. /* mandatory */
  221. case RNDIS_OID_GEN_MEDIA_IN_USE:
  222. pr_debug("%s: RNDIS_OID_GEN_MEDIA_IN_USE\n", __func__);
  223. /* one medium, one transport... (maybe you do it better) */
  224. *outbuf = cpu_to_le32(rndis_per_dev_params[configNr].medium);
  225. retval = 0;
  226. break;
  227. /* mandatory */
  228. case RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE:
  229. pr_debug("%s: RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE\n", __func__);
  230. if (rndis_per_dev_params[configNr].dev) {
  231. *outbuf = cpu_to_le32(
  232. rndis_per_dev_params[configNr].dev->mtu);
  233. retval = 0;
  234. }
  235. break;
  236. /* mandatory */
  237. case RNDIS_OID_GEN_LINK_SPEED:
  238. if (rndis_debug > 1)
  239. pr_debug("%s: RNDIS_OID_GEN_LINK_SPEED\n", __func__);
  240. if (rndis_per_dev_params[configNr].media_state
  241. == RNDIS_MEDIA_STATE_DISCONNECTED)
  242. *outbuf = cpu_to_le32(0);
  243. else
  244. *outbuf = cpu_to_le32(
  245. rndis_per_dev_params[configNr].speed);
  246. if (rndis_debug){
  247. pr_debug("OID_GEN_LINK_SPEED, speed %d. data: rx_in %lu, rx_out %lu, rx_nomem %lu, rx_error %lu, tx_in %lu, tx_out %lu, tx_busy %lu, tx_complete %lu, last_msg_id: 0x%x, last_resp_id: 0x%x, RNDIS reset cnt: 0x%lu, queue stopped? %d\n",
  248. rndis_per_dev_params[configNr].speed, rndis_test_rx_usb_in, rndis_test_rx_net_out, rndis_test_rx_nomem, rndis_test_rx_error, rndis_test_tx_net_in,
  249. rndis_test_tx_usb_out, rndis_test_tx_busy , rndis_test_tx_complete, rndis_test_last_msg_id, rndis_test_last_resp_id, rndis_test_reset_msg_cnt,
  250. netif_queue_stopped(rndis_per_dev_params[configNr].dev)) ;
  251. }
  252. retval = 0;
  253. break;
  254. /* mandatory */
  255. case RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE:
  256. pr_debug("%s: RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE\n", __func__);
  257. if (rndis_per_dev_params[configNr].dev) {
  258. *outbuf = cpu_to_le32(
  259. rndis_per_dev_params[configNr].dev->mtu);
  260. retval = 0;
  261. }
  262. break;
  263. /* mandatory */
  264. case RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE:
  265. pr_debug("%s: RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE\n", __func__);
  266. if (rndis_per_dev_params[configNr].dev) {
  267. *outbuf = cpu_to_le32(
  268. rndis_per_dev_params[configNr].dev->mtu);
  269. retval = 0;
  270. }
  271. break;
  272. /* mandatory */
  273. case RNDIS_OID_GEN_VENDOR_ID:
  274. pr_debug("%s: RNDIS_OID_GEN_VENDOR_ID\n", __func__);
  275. *outbuf = cpu_to_le32(
  276. rndis_per_dev_params[configNr].vendorID);
  277. retval = 0;
  278. break;
  279. /* mandatory */
  280. case RNDIS_OID_GEN_VENDOR_DESCRIPTION:
  281. pr_debug("%s: RNDIS_OID_GEN_VENDOR_DESCRIPTION\n", __func__);
  282. if (rndis_per_dev_params[configNr].vendorDescr) {
  283. length = strlen(rndis_per_dev_params[configNr].
  284. vendorDescr);
  285. memcpy(outbuf,
  286. rndis_per_dev_params[configNr].vendorDescr,
  287. length);
  288. } else {
  289. outbuf[0] = 0;
  290. }
  291. retval = 0;
  292. break;
  293. case RNDIS_OID_GEN_VENDOR_DRIVER_VERSION:
  294. pr_debug("%s: RNDIS_OID_GEN_VENDOR_DRIVER_VERSION\n", __func__);
  295. /* Created as LE */
  296. *outbuf = rndis_driver_version;
  297. retval = 0;
  298. break;
  299. /* mandatory */
  300. case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:
  301. pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER\n", __func__);
  302. *outbuf = cpu_to_le32(*rndis_per_dev_params[configNr].filter);
  303. retval = 0;
  304. break;
  305. /* mandatory */
  306. case RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE:
  307. pr_debug("%s: RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE\n", __func__);
  308. *outbuf = cpu_to_le32(RNDIS_MAX_TOTAL_SIZE);
  309. retval = 0;
  310. break;
  311. /* mandatory */
  312. case RNDIS_OID_GEN_MEDIA_CONNECT_STATUS:
  313. if (rndis_debug > 1)
  314. pr_debug("%s: RNDIS_OID_GEN_MEDIA_CONNECT_STATUS\n", __func__);
  315. *outbuf = cpu_to_le32(rndis_per_dev_params[configNr]
  316. .media_state);
  317. if (rndis_debug){
  318. pr_debug("OID_GEN_MEDIA_CONNECT_STATUS, media_state %d\n", rndis_per_dev_params[configNr].media_state) ;
  319. }
  320. retval = 0;
  321. break;
  322. case RNDIS_OID_GEN_PHYSICAL_MEDIUM:
  323. pr_debug("%s: RNDIS_OID_GEN_PHYSICAL_MEDIUM\n", __func__);
  324. *outbuf = cpu_to_le32(0);
  325. retval = 0;
  326. break;
  327. /* The RNDIS specification is incomplete/wrong. Some versions
  328. * of MS-Windows expect OIDs that aren't specified there. Other
  329. * versions emit undefined RNDIS messages. DOCUMENT ALL THESE!
  330. */
  331. case RNDIS_OID_GEN_MAC_OPTIONS: /* from WinME */
  332. pr_debug("%s: RNDIS_OID_GEN_MAC_OPTIONS\n", __func__);
  333. *outbuf = cpu_to_le32(
  334. RNDIS_MAC_OPTION_RECEIVE_SERIALIZED
  335. | RNDIS_MAC_OPTION_FULL_DUPLEX);
  336. retval = 0;
  337. break;
  338. /* statistics OIDs (table 4-2) */
  339. /* mandatory */
  340. case RNDIS_OID_GEN_XMIT_OK:
  341. if (rndis_debug > 1)
  342. pr_debug("%s: RNDIS_OID_GEN_XMIT_OK\n", __func__);
  343. if (stats) {
  344. *outbuf = cpu_to_le32(stats->tx_packets
  345. - stats->tx_errors - stats->tx_dropped);
  346. retval = 0;
  347. }
  348. break;
  349. /* mandatory */
  350. case RNDIS_OID_GEN_RCV_OK:
  351. if (rndis_debug > 1)
  352. pr_debug("%s: RNDIS_OID_GEN_RCV_OK\n", __func__);
  353. if (stats) {
  354. *outbuf = cpu_to_le32(stats->rx_packets
  355. - stats->rx_errors - stats->rx_dropped);
  356. retval = 0;
  357. }
  358. break;
  359. /* mandatory */
  360. case RNDIS_OID_GEN_XMIT_ERROR:
  361. if (rndis_debug > 1)
  362. pr_debug("%s: RNDIS_OID_GEN_XMIT_ERROR\n", __func__);
  363. if (stats) {
  364. *outbuf = cpu_to_le32(stats->tx_errors);
  365. if (rndis_debug){
  366. pr_err("OID_GEN_XMIT_ERROR, stats->tx_errors %llu\n", stats->tx_errors) ;
  367. }
  368. retval = 0;
  369. }
  370. break;
  371. /* mandatory */
  372. case RNDIS_OID_GEN_RCV_ERROR:
  373. if (rndis_debug > 1)
  374. pr_debug("%s: RNDIS_OID_GEN_RCV_ERROR\n", __func__);
  375. if (stats) {
  376. *outbuf = cpu_to_le32(stats->rx_errors);
  377. if (rndis_debug){
  378. pr_err("OID_GEN_RCV_ERROR, stats->rx_errors %llu\n", stats->rx_errors) ;
  379. }
  380. retval = 0;
  381. }
  382. break;
  383. /* mandatory */
  384. case RNDIS_OID_GEN_RCV_NO_BUFFER:
  385. pr_debug("%s: RNDIS_OID_GEN_RCV_NO_BUFFER\n", __func__);
  386. if (stats) {
  387. *outbuf = cpu_to_le32(stats->rx_dropped);
  388. if (rndis_debug){
  389. pr_err("OID_GEN_RCV_NO_BUFFER, stats->rx_dropped %llu\n", stats->rx_dropped) ;
  390. }
  391. retval = 0;
  392. }
  393. break;
  394. /* ieee802.3 OIDs (table 4-3) */
  395. /* mandatory */
  396. case RNDIS_OID_802_3_PERMANENT_ADDRESS:
  397. pr_debug("%s: RNDIS_OID_802_3_PERMANENT_ADDRESS\n", __func__);
  398. if (rndis_per_dev_params[configNr].dev) {
  399. length = ETH_ALEN;
  400. memcpy(outbuf,
  401. rndis_per_dev_params[configNr].host_mac,
  402. length);
  403. retval = 0;
  404. if (rndis_debug){
  405. pr_debug("OID_802_3_PERMANENT_ADDRESS, host_mac is %x %x ....\n",
  406. rndis_per_dev_params [configNr].host_mac[0],
  407. rndis_per_dev_params [configNr].host_mac[1]) ;
  408. }
  409. }
  410. break;
  411. /* mandatory */
  412. case RNDIS_OID_802_3_CURRENT_ADDRESS:
  413. pr_debug("%s: RNDIS_OID_802_3_CURRENT_ADDRESS\n", __func__);
  414. if (rndis_per_dev_params[configNr].dev) {
  415. length = ETH_ALEN;
  416. memcpy(outbuf,
  417. rndis_per_dev_params [configNr].host_mac,
  418. length);
  419. if (rndis_debug){
  420. pr_debug("OID_802_3_CURRENT_ADDRESS, host_mac is %x %x ....\n",
  421. rndis_per_dev_params [configNr].host_mac[0],
  422. rndis_per_dev_params [configNr].host_mac[1]) ;
  423. }
  424. retval = 0;
  425. }
  426. break;
  427. /* mandatory */
  428. case RNDIS_OID_802_3_MULTICAST_LIST:
  429. pr_debug("%s: RNDIS_OID_802_3_MULTICAST_LIST\n", __func__);
  430. /* Multicast base address only */
  431. *outbuf = cpu_to_le32(0xE0000000);
  432. retval = 0;
  433. break;
  434. /* mandatory */
  435. case RNDIS_OID_802_3_MAXIMUM_LIST_SIZE:
  436. pr_debug("%s: RNDIS_OID_802_3_MAXIMUM_LIST_SIZE\n", __func__);
  437. /* Multicast base address only */
  438. *outbuf = cpu_to_le32(1);
  439. retval = 0;
  440. break;
  441. case RNDIS_OID_802_3_MAC_OPTIONS:
  442. pr_debug("%s: RNDIS_OID_802_3_MAC_OPTIONS\n", __func__);
  443. *outbuf = cpu_to_le32(0);
  444. retval = 0;
  445. break;
  446. /* ieee802.3 statistics OIDs (table 4-4) */
  447. /* mandatory */
  448. case RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT:
  449. pr_debug("%s: RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT\n", __func__);
  450. if (stats) {
  451. if (rndis_debug){
  452. pr_debug("OID_802_3_RCV_ERROR_ALIGNMENT, stats->rx_frame_errors is %llu\n", stats->rx_frame_errors) ;
  453. }
  454. *outbuf = cpu_to_le32(stats->rx_frame_errors);
  455. retval = 0;
  456. }
  457. break;
  458. /* mandatory */
  459. case RNDIS_OID_802_3_XMIT_ONE_COLLISION:
  460. pr_debug("%s: RNDIS_OID_802_3_XMIT_ONE_COLLISION\n", __func__);
  461. *outbuf = cpu_to_le32(0);
  462. retval = 0;
  463. break;
  464. /* mandatory */
  465. case RNDIS_OID_802_3_XMIT_MORE_COLLISIONS:
  466. pr_debug("%s: RNDIS_OID_802_3_XMIT_MORE_COLLISIONS\n", __func__);
  467. *outbuf = cpu_to_le32(0);
  468. retval = 0;
  469. break;
  470. default:
  471. pr_warning("%s: query unknown OID 0x%08X\n",
  472. __func__, OID);
  473. }
  474. if (retval < 0){
  475. length = 0;
  476. pr_warning("%s: bad gen_ndis_query_resp, retval is 0x%d\n", __func__, retval) ;
  477. }
  478. resp->InformationBufferLength = cpu_to_le32(length);
  479. r->length = length + sizeof(*resp);
  480. resp->MessageLength = cpu_to_le32(r->length);
  481. return retval;
  482. }
  483. static int gen_ndis_set_resp(u8 configNr, u32 OID, u8 *buf, u32 buf_len,
  484. rndis_resp_t *r)
  485. {
  486. rndis_set_cmplt_type *resp;
  487. int i, retval = -ENOTSUPP;
  488. struct rndis_params *params;
  489. if (!r)
  490. return -ENOMEM;
  491. resp = (rndis_set_cmplt_type *)r->buf;
  492. if (!resp)
  493. return -ENOMEM;
  494. if (buf_len && rndis_debug > 1) {
  495. pr_debug("set OID %08x value, len %d:\n", OID, buf_len);
  496. for (i = 0; i < buf_len; i += 16) {
  497. pr_debug("%03d: %08x %08x %08x %08x\n", i,
  498. get_unaligned_le32(&buf[i]),
  499. get_unaligned_le32(&buf[i + 4]),
  500. get_unaligned_le32(&buf[i + 8]),
  501. get_unaligned_le32(&buf[i + 12]));
  502. }
  503. }
  504. if (rndis_debug){
  505. pr_debug("gen_ndis_set_resp, OID is 0x%x\n", OID) ;
  506. }
  507. params = &rndis_per_dev_params[configNr];
  508. switch (OID) {
  509. case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:
  510. /* these NDIS_PACKET_TYPE_* bitflags are shared with
  511. * cdc_filter; it's not RNDIS-specific
  512. * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in:
  513. * PROMISCUOUS, DIRECTED,
  514. * MULTICAST, ALL_MULTICAST, BROADCAST
  515. */
  516. *params->filter = (u16)get_unaligned_le32(buf);
  517. pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER %08x\n",
  518. __func__, *params->filter);
  519. /* this call has a significant side effect: it's
  520. * what makes the packet flow start and stop, like
  521. * activating the CDC Ethernet altsetting.
  522. */
  523. retval = 0;
  524. if (*params->filter) {
  525. params->state = RNDIS_DATA_INITIALIZED;
  526. netif_carrier_on(params->dev);
  527. if (netif_running(params->dev))
  528. netif_wake_queue(params->dev);
  529. } else {
  530. params->state = RNDIS_INITIALIZED;
  531. netif_carrier_off(params->dev);
  532. netif_stop_queue(params->dev);
  533. }
  534. break;
  535. case RNDIS_OID_802_3_MULTICAST_LIST:
  536. /* I think we can ignore this */
  537. pr_debug("%s: RNDIS_OID_802_3_MULTICAST_LIST\n", __func__);
  538. retval = 0;
  539. break;
  540. default:
  541. pr_warning("%s: set unknown OID 0x%08X, size %d\n",
  542. __func__, OID, buf_len);
  543. }
  544. if (retval){
  545. pr_debug("gen_ndis_set_resp, <==== retval is 0x%d\n", retval) ;
  546. }
  547. return retval;
  548. }
  549. /*
  550. * Response Functions
  551. */
  552. static int rndis_init_response(int configNr, rndis_init_msg_type *buf)
  553. {
  554. rndis_init_cmplt_type *resp;
  555. rndis_resp_t *r;
  556. struct rndis_params *params = rndis_per_dev_params + configNr;
  557. if (!params->dev)
  558. return -ENOTSUPP;
  559. r = rndis_add_response(configNr, sizeof(rndis_init_cmplt_type));
  560. if (!r)
  561. return -ENOMEM;
  562. resp = (rndis_init_cmplt_type *)r->buf;
  563. resp->MessageType = cpu_to_le32(RNDIS_MSG_INIT_C);
  564. resp->MessageLength = cpu_to_le32(52);
  565. resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
  566. resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
  567. resp->MajorVersion = cpu_to_le32(RNDIS_MAJOR_VERSION);
  568. resp->MinorVersion = cpu_to_le32(RNDIS_MINOR_VERSION);
  569. resp->DeviceFlags = cpu_to_le32(RNDIS_DF_CONNECTIONLESS);
  570. resp->Medium = cpu_to_le32(RNDIS_MEDIUM_802_3);
  571. resp->MaxPacketsPerTransfer = cpu_to_le32(params->max_pkt_per_xfer);
  572. resp->MaxTransferSize = cpu_to_le32(params->max_pkt_per_xfer *
  573. (params->dev->mtu
  574. + sizeof(struct ethhdr)
  575. + sizeof(struct rndis_packet_msg_type)
  576. + 22));
  577. resp->PacketAlignmentFactor = cpu_to_le32(0);
  578. resp->AFListOffset = cpu_to_le32(0);
  579. resp->AFListSize = cpu_to_le32(0);
  580. params->resp_avail(params->v);
  581. return 0;
  582. }
  583. static int rndis_query_response(int configNr, rndis_query_msg_type *buf)
  584. {
  585. rndis_query_cmplt_type *resp;
  586. rndis_resp_t *r;
  587. struct rndis_params *params = rndis_per_dev_params + configNr;
  588. /* pr_debug("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID)); */
  589. if (!params->dev)
  590. return -ENOTSUPP;
  591. /*
  592. * we need more memory:
  593. * gen_ndis_query_resp expects enough space for
  594. * rndis_query_cmplt_type followed by data.
  595. * oid_supported_list is the largest data reply
  596. */
  597. r = rndis_add_response(configNr,
  598. sizeof(oid_supported_list) + sizeof(rndis_query_cmplt_type));
  599. if (!r){
  600. pr_err("rndis_query_response, rndis_add_response return NULL\n") ;
  601. return -ENOMEM;
  602. }
  603. resp = (rndis_query_cmplt_type *)r->buf;
  604. resp->MessageType = cpu_to_le32(RNDIS_MSG_QUERY_C);
  605. resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
  606. if (gen_ndis_query_resp(configNr, le32_to_cpu(buf->OID),
  607. le32_to_cpu(buf->InformationBufferOffset)
  608. + 8 + (u8 *)buf,
  609. le32_to_cpu(buf->InformationBufferLength),
  610. r)) {
  611. /* OID not supported */
  612. resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
  613. resp->MessageLength = cpu_to_le32(sizeof *resp);
  614. resp->InformationBufferLength = cpu_to_le32(0);
  615. resp->InformationBufferOffset = cpu_to_le32(0);
  616. } else
  617. resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
  618. params->resp_avail(params->v);
  619. return 0;
  620. }
  621. static int rndis_set_response(int configNr, rndis_set_msg_type *buf)
  622. {
  623. u32 BufLength, BufOffset;
  624. rndis_set_cmplt_type *resp;
  625. rndis_resp_t *r;
  626. struct rndis_params *params = rndis_per_dev_params + configNr;
  627. r = rndis_add_response(configNr, sizeof(rndis_set_cmplt_type));
  628. if (!r){
  629. pr_err("rndis_set_response, rndis_add_response return NULL\n") ;
  630. return -ENOMEM;
  631. }
  632. resp = (rndis_set_cmplt_type *)r->buf;
  633. BufLength = le32_to_cpu(buf->InformationBufferLength);
  634. BufOffset = le32_to_cpu(buf->InformationBufferOffset);
  635. #ifdef VERBOSE_DEBUG
  636. pr_debug("%s: Length: %d\n", __func__, BufLength);
  637. pr_debug("%s: Offset: %d\n", __func__, BufOffset);
  638. pr_debug("%s: InfoBuffer: ", __func__);
  639. for (i = 0; i < BufLength; i++) {
  640. pr_debug("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
  641. }
  642. pr_debug("\n");
  643. #endif
  644. resp->MessageType = cpu_to_le32(RNDIS_MSG_SET_C);
  645. resp->MessageLength = cpu_to_le32(16);
  646. resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
  647. if (gen_ndis_set_resp(configNr, le32_to_cpu(buf->OID),
  648. ((u8 *)buf) + 8 + BufOffset, BufLength, r))
  649. resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
  650. else
  651. resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
  652. params->resp_avail(params->v);
  653. return 0;
  654. }
  655. static int rndis_reset_response(int configNr, rndis_reset_msg_type *buf)
  656. {
  657. rndis_reset_cmplt_type *resp;
  658. rndis_resp_t *r;
  659. struct rndis_params *params = rndis_per_dev_params + configNr;
  660. /* patch for RNDIS reset msg : clear the previous response ~*/
  661. u8 *buf_legacy;
  662. u32 length;
  663. pr_debug("%s: rndis reset !! clean the old resposes...\n", __func__);
  664. while ((buf_legacy = rndis_get_next_response(configNr, &length)))
  665. rndis_free_response(configNr, buf_legacy);
  666. rndis_test_reset_msg_cnt ++ ;
  667. /* patch for RNDIS reset msg */
  668. r = rndis_add_response(configNr, sizeof(rndis_reset_cmplt_type));
  669. if (!r)
  670. return -ENOMEM;
  671. resp = (rndis_reset_cmplt_type *)r->buf;
  672. resp->MessageType = cpu_to_le32(RNDIS_MSG_RESET_C);
  673. resp->MessageLength = cpu_to_le32(16);
  674. resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
  675. /* resent information */
  676. resp->AddressingReset = cpu_to_le32(1);
  677. params->resp_avail(params->v);
  678. return 0;
  679. }
  680. static int rndis_keepalive_response(int configNr,
  681. rndis_keepalive_msg_type *buf)
  682. {
  683. rndis_keepalive_cmplt_type *resp;
  684. rndis_resp_t *r;
  685. struct rndis_params *params = rndis_per_dev_params + configNr;
  686. /* host "should" check only in RNDIS_DATA_INITIALIZED state */
  687. r = rndis_add_response(configNr, sizeof(rndis_keepalive_cmplt_type));
  688. if (!r){
  689. pr_err("rndis_keepalive_response, rndis_add_response return NULL\n") ;
  690. return -ENOMEM;
  691. }
  692. resp = (rndis_keepalive_cmplt_type *)r->buf;
  693. resp->MessageType = cpu_to_le32(RNDIS_MSG_KEEPALIVE_C);
  694. resp->MessageLength = cpu_to_le32(16);
  695. resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
  696. resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
  697. params->resp_avail(params->v);
  698. if (rndis_debug){
  699. pr_debug("rndis_keepalive_response, data: rx_in %lu, rx_out %lu, rx_nomem %lu, rx_error %lu, tx_in %lu, tx_out %lu, tx_busy %lu, tx_complete %lu, last_msg_id: 0x%x, last_resp_id: 0x%x, RNDIS reset cnt: 0x%lu, queue stopped? %d\n",
  700. rndis_test_rx_usb_in, rndis_test_rx_net_out, rndis_test_rx_nomem, rndis_test_rx_error, rndis_test_tx_net_in,
  701. rndis_test_tx_usb_out, rndis_test_tx_busy , rndis_test_tx_complete, rndis_test_last_msg_id, rndis_test_last_resp_id, rndis_test_reset_msg_cnt,
  702. netif_queue_stopped(params->dev)) ;
  703. }
  704. return 0;
  705. }
  706. /*
  707. * Device to Host Comunication
  708. */
  709. static int rndis_indicate_status_msg(int configNr, u32 status)
  710. {
  711. rndis_indicate_status_msg_type *resp;
  712. rndis_resp_t *r;
  713. struct rndis_params *params = rndis_per_dev_params + configNr;
  714. if (params->state == RNDIS_UNINITIALIZED)
  715. return -ENOTSUPP;
  716. r = rndis_add_response(configNr,
  717. sizeof(rndis_indicate_status_msg_type));
  718. if (!r)
  719. return -ENOMEM;
  720. resp = (rndis_indicate_status_msg_type *)r->buf;
  721. resp->MessageType = cpu_to_le32(RNDIS_MSG_INDICATE);
  722. resp->MessageLength = cpu_to_le32(20);
  723. resp->Status = cpu_to_le32(status);
  724. resp->StatusBufferLength = cpu_to_le32(0);
  725. resp->StatusBufferOffset = cpu_to_le32(0);
  726. params->resp_avail(params->v);
  727. return 0;
  728. }
  729. int rndis_signal_connect(int configNr)
  730. {
  731. rndis_per_dev_params[configNr].media_state
  732. = RNDIS_MEDIA_STATE_CONNECTED;
  733. return rndis_indicate_status_msg(configNr,
  734. RNDIS_STATUS_MEDIA_CONNECT);
  735. }
  736. int rndis_signal_disconnect(int configNr)
  737. {
  738. rndis_per_dev_params[configNr].media_state
  739. = RNDIS_MEDIA_STATE_DISCONNECTED;
  740. return rndis_indicate_status_msg(configNr,
  741. RNDIS_STATUS_MEDIA_DISCONNECT);
  742. }
  743. void rndis_uninit(int configNr)
  744. {
  745. u8 *buf;
  746. u32 length;
  747. if (configNr >= RNDIS_MAX_CONFIGS)
  748. return;
  749. rndis_per_dev_params[configNr].state = RNDIS_UNINITIALIZED;
  750. /* drain the response queue */
  751. while ((buf = rndis_get_next_response(configNr, &length)))
  752. rndis_free_response(configNr, buf);
  753. }
  754. void rndis_set_host_mac(int configNr, const u8 *addr)
  755. {
  756. rndis_per_dev_params[configNr].host_mac = addr;
  757. }
  758. /*
  759. * Message Parser
  760. */
  761. int rndis_msg_parser(u8 configNr, u8 *buf)
  762. {
  763. u32 MsgType, MsgLength, MsgID;
  764. __le32 *tmp;
  765. struct rndis_params *params;
  766. if (!buf)
  767. return -ENOMEM;
  768. tmp = (__le32 *)buf;
  769. MsgType = get_unaligned_le32(tmp++);
  770. MsgLength = get_unaligned_le32(tmp++);
  771. MsgID = get_unaligned_le32(tmp++);
  772. if (rndis_debug){
  773. pr_debug("rndis_msg_parser, MsgType is %d,configNr is %d, RequestID is 0x%x\n", MsgType ,configNr, MsgID) ;
  774. }
  775. rndis_test_last_msg_id = MsgID ;
  776. if (configNr >= RNDIS_MAX_CONFIGS)
  777. return -ENOTSUPP;
  778. params = &rndis_per_dev_params[configNr];
  779. /* NOTE: RNDIS is *EXTREMELY* chatty ... Windows constantly polls for
  780. * rx/tx statistics and link status, in addition to KEEPALIVE traffic
  781. * and normal HC level polling to see if there's any IN traffic.
  782. */
  783. /* For USB: responses may take up to 10 seconds */
  784. switch (MsgType) {
  785. case RNDIS_MSG_INIT:
  786. pr_debug("%s: RNDIS_MSG_INIT\n",
  787. __func__);
  788. params->state = RNDIS_INITIALIZED;
  789. return rndis_init_response(configNr,
  790. (rndis_init_msg_type *)buf);
  791. case RNDIS_MSG_HALT:
  792. pr_debug("%s: RNDIS_MSG_HALT\n",
  793. __func__);
  794. params->state = RNDIS_UNINITIALIZED;
  795. if (params->dev) {
  796. netif_carrier_off(params->dev);
  797. netif_stop_queue(params->dev);
  798. }
  799. return 0;
  800. case RNDIS_MSG_QUERY:
  801. return rndis_query_response(configNr,
  802. (rndis_query_msg_type *)buf);
  803. case RNDIS_MSG_SET:
  804. return rndis_set_response(configNr,
  805. (rndis_set_msg_type *)buf);
  806. case RNDIS_MSG_RESET:
  807. pr_debug("%s: RNDIS_MSG_RESET\n",
  808. __func__);
  809. return rndis_reset_response(configNr,
  810. (rndis_reset_msg_type *)buf);
  811. case RNDIS_MSG_KEEPALIVE:
  812. /* For USB: host does this every 5 seconds */
  813. if (rndis_debug > 1)
  814. pr_debug("%s: RNDIS_MSG_KEEPALIVE\n",
  815. __func__);
  816. return rndis_keepalive_response(configNr,
  817. (rndis_keepalive_msg_type *)
  818. buf);
  819. default:
  820. /* At least Windows XP emits some undefined RNDIS messages.
  821. * In one case those messages seemed to relate to the host
  822. * suspending itself.
  823. */
  824. pr_warning("%s: unknown RNDIS message 0x%08X len %d\n",
  825. __func__, MsgType, MsgLength);
  826. {
  827. unsigned i;
  828. for (i = 0; i < MsgLength; i += 16) {
  829. pr_debug("%03d: "
  830. " %02x %02x %02x %02x"
  831. " %02x %02x %02x %02x"
  832. " %02x %02x %02x %02x"
  833. " %02x %02x %02x %02x"
  834. "\n",
  835. i,
  836. buf[i], buf [i+1],
  837. buf[i+2], buf[i+3],
  838. buf[i+4], buf [i+5],
  839. buf[i+6], buf[i+7],
  840. buf[i+8], buf [i+9],
  841. buf[i+10], buf[i+11],
  842. buf[i+12], buf [i+13],
  843. buf[i+14], buf[i+15]);
  844. }
  845. }
  846. //print_hex_dump_bytes(__func__, DUMP_PREFIX_OFFSET,
  847. // buf, MsgLength);
  848. break;
  849. }
  850. return -ENOTSUPP;
  851. }
  852. int rndis_register(void (*resp_avail)(void *v), void *v)
  853. {
  854. u8 i;
  855. if (!resp_avail)
  856. return -EINVAL;
  857. for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
  858. if (!rndis_per_dev_params[i].used) {
  859. rndis_per_dev_params[i].used = 1;
  860. rndis_per_dev_params[i].resp_avail = resp_avail;
  861. rndis_per_dev_params[i].v = v;
  862. rndis_per_dev_params[i].max_pkt_per_xfer = 1;
  863. pr_debug("%s: configNr = %d\n", __func__, i);
  864. return i;
  865. }
  866. }
  867. pr_debug("failed\n");
  868. return -ENODEV;
  869. }
  870. void rndis_deregister(int configNr)
  871. {
  872. pr_debug("%s:\n", __func__);
  873. if (configNr >= RNDIS_MAX_CONFIGS) return;
  874. rndis_per_dev_params[configNr].used = 0;
  875. }
  876. int rndis_set_param_dev(u8 configNr, struct net_device *dev, u16 *cdc_filter)
  877. {
  878. pr_debug("%s:\n", __func__);
  879. if (!dev)
  880. return -EINVAL;
  881. if (configNr >= RNDIS_MAX_CONFIGS) return -1;
  882. rndis_per_dev_params[configNr].dev = dev;
  883. rndis_per_dev_params[configNr].filter = cdc_filter;
  884. /* reset aggregation stats for every set_alt */
  885. rndis_ul_max_xfer_size_rcvd = 0;
  886. rndis_ul_max_pkt_per_xfer_rcvd = 0;
  887. return 0;
  888. }
  889. int rndis_set_param_vendor(u8 configNr, u32 vendorID, const char *vendorDescr)
  890. {
  891. pr_debug("%s:\n", __func__);
  892. if (!vendorDescr) return -1;
  893. if (configNr >= RNDIS_MAX_CONFIGS) return -1;
  894. rndis_per_dev_params[configNr].vendorID = vendorID;
  895. rndis_per_dev_params[configNr].vendorDescr = vendorDescr;
  896. return 0;
  897. }
  898. int rndis_set_param_medium(u8 configNr, u32 medium, u32 speed)
  899. {
  900. pr_debug("%s: %u %u\n", __func__, medium, speed);
  901. if (configNr >= RNDIS_MAX_CONFIGS) return -1;
  902. rndis_per_dev_params[configNr].medium = medium;
  903. rndis_per_dev_params[configNr].speed = speed;
  904. return 0;
  905. }
  906. void rndis_set_max_pkt_xfer(u8 configNr, u8 max_pkt_per_xfer)
  907. {
  908. pr_debug("%s:\n", __func__);
  909. rndis_per_dev_params[configNr].max_pkt_per_xfer = max_pkt_per_xfer;
  910. }
  911. void rndis_add_hdr(struct sk_buff *skb)
  912. {
  913. struct rndis_packet_msg_type *header;
  914. if (!skb)
  915. return;
  916. header = (void *)skb_push(skb, sizeof(*header));
  917. memset(header, 0, sizeof *header);
  918. header->MessageType = cpu_to_le32(RNDIS_MSG_PACKET);
  919. header->MessageLength = cpu_to_le32(skb->len);
  920. header->DataOffset = cpu_to_le32(36);
  921. header->DataLength = cpu_to_le32(skb->len - sizeof(*header));
  922. }
  923. void rndis_free_response(int configNr, u8 *buf)
  924. {
  925. rndis_resp_t *r;
  926. struct list_head *act, *tmp;
  927. list_for_each_safe(act, tmp,
  928. &(rndis_per_dev_params[configNr].resp_queue))
  929. {
  930. if (!act)
  931. continue;
  932. r = list_entry(act, rndis_resp_t, list);
  933. if (r && r->buf == buf) {
  934. list_del(&r->list);
  935. kfree(r);
  936. }
  937. }
  938. }
  939. u8 *rndis_get_next_response(int configNr, u32 *length)
  940. {
  941. rndis_resp_t *r;
  942. struct list_head *act, *tmp;
  943. if (!length) return NULL;
  944. list_for_each_safe(act, tmp,
  945. &(rndis_per_dev_params[configNr].resp_queue))
  946. {
  947. r = list_entry(act, rndis_resp_t, list);
  948. if (!r->send) {
  949. r->send = 1;
  950. *length = r->length;
  951. return r->buf;
  952. }
  953. }
  954. return NULL;
  955. }
  956. static rndis_resp_t *rndis_add_response(int configNr, u32 length)
  957. {
  958. rndis_resp_t *r;
  959. /* NOTE: this gets copied into ether.c USB_BUFSIZ bytes ... */
  960. r = kmalloc(sizeof(rndis_resp_t) + length, GFP_ATOMIC);
  961. if (!r) return NULL;
  962. r->buf = (u8 *)(r + 1);
  963. r->length = length;
  964. r->send = 0;
  965. list_add_tail(&r->list,
  966. &(rndis_per_dev_params[configNr].resp_queue));
  967. return r;
  968. }
  969. int rndis_rm_hdr(struct gether *port,
  970. struct sk_buff *skb,
  971. struct sk_buff_head *list)
  972. {
  973. int num_pkts = 0;
  974. if (skb->len > rndis_ul_max_xfer_size_rcvd)
  975. rndis_ul_max_xfer_size_rcvd = skb->len;
  976. while (skb->len) {
  977. struct rndis_packet_msg_type *hdr;
  978. struct sk_buff *skb2;
  979. u32 msg_len, data_offset, data_len;
  980. if (skb->len < sizeof *hdr) {
  981. pr_err("invalid rndis pkt: skblen:%u hdr_len:%lu",
  982. skb->len, (long)sizeof *hdr);
  983. dev_kfree_skb_any(skb);
  984. return -EINVAL;
  985. }
  986. hdr = (void *)skb->data;
  987. msg_len = le32_to_cpu(hdr->MessageLength);
  988. data_offset = le32_to_cpu(hdr->DataOffset);
  989. data_len = le32_to_cpu(hdr->DataLength);
  990. if (skb->len < msg_len ||
  991. ((data_offset + data_len + 8) > msg_len)) {
  992. pr_err("invalid rndis message: %d/%d/%d/%d, len:%d\n",
  993. le32_to_cpu(hdr->MessageType),
  994. msg_len, data_offset, data_len, skb->len);
  995. dev_kfree_skb_any(skb);
  996. return -EOVERFLOW;
  997. }
  998. if (le32_to_cpu(hdr->MessageType) != RNDIS_MSG_PACKET) {
  999. pr_err("invalid rndis message: %d/%d/%d/%d, len:%d\n",
  1000. le32_to_cpu(hdr->MessageType),
  1001. msg_len, data_offset, data_len, skb->len);
  1002. dev_kfree_skb_any(skb);
  1003. return -EINVAL;
  1004. }
  1005. num_pkts++;
  1006. skb_pull(skb, data_offset + 8);
  1007. if (data_len == skb->len ||
  1008. data_len == (skb->len - 1)) {
  1009. skb_trim(skb, data_len);
  1010. break;
  1011. }
  1012. skb2 = skb_clone(skb, GFP_ATOMIC);
  1013. if (!skb2) {
  1014. pr_err("%s:skb clone failed\n", __func__);
  1015. dev_kfree_skb_any(skb);
  1016. return -ENOMEM;
  1017. }
  1018. skb_pull(skb, msg_len - sizeof *hdr);
  1019. skb_trim(skb2, data_len);
  1020. skb_queue_tail(list, skb2);
  1021. }
  1022. if (num_pkts > rndis_ul_max_pkt_per_xfer_rcvd)
  1023. rndis_ul_max_pkt_per_xfer_rcvd = num_pkts;
  1024. skb_queue_tail(list, skb);
  1025. return 0;
  1026. }
  1027. #ifdef CONFIG_USB_GADGET_DEBUG_FILES
  1028. static int rndis_proc_show(struct seq_file *m, void *v)
  1029. {
  1030. rndis_params *param = m->private;
  1031. seq_printf(m,
  1032. "Config Nr. %d\n"
  1033. "used : %s\n"
  1034. "state : %s\n"
  1035. "medium : 0x%08X\n"
  1036. "speed : %d\n"
  1037. "cable : %s\n"
  1038. "vendor ID : 0x%08X\n"
  1039. "vendor : %s\n"
  1040. "ul-max-xfer-size:%d max-xfer-size-rcvd: %d\n"
  1041. "ul-max-pkts-per-xfer:%d max-pkts-per-xfer-rcvd:%d\n",
  1042. param->confignr, (param->used) ? "y" : "n",
  1043. ({ char *s = "?";
  1044. switch (param->state) {
  1045. case RNDIS_UNINITIALIZED:
  1046. s = "RNDIS_UNINITIALIZED"; break;
  1047. case RNDIS_INITIALIZED:
  1048. s = "RNDIS_INITIALIZED"; break;
  1049. case RNDIS_DATA_INITIALIZED:
  1050. s = "RNDIS_DATA_INITIALIZED"; break;
  1051. }; s; }),
  1052. param->medium,
  1053. (param->media_state) ? 0 : param->speed*100,
  1054. (param->media_state) ? "disconnected" : "connected",
  1055. param->vendorID, param->vendorDescr,
  1056. param->max_pkt_per_xfer *
  1057. (param->dev->mtu + sizeof(struct ethhdr) +
  1058. sizeof(struct rndis_packet_msg_type) + 22),
  1059. rndis_ul_max_xfer_size_rcvd,
  1060. param->max_pkt_per_xfer,
  1061. rndis_ul_max_pkt_per_xfer_rcvd);
  1062. return 0;
  1063. }
  1064. static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
  1065. size_t count, loff_t *ppos)
  1066. {
  1067. rndis_params *p = PDE_DATA(file_inode(file));
  1068. u32 speed = 0;
  1069. int i, fl_speed = 0;
  1070. for (i = 0; i < count; i++) {
  1071. char c;
  1072. if (get_user(c, buffer))
  1073. return -EFAULT;
  1074. switch (c) {
  1075. case '0':
  1076. case '1':
  1077. case '2':
  1078. case '3':
  1079. case '4':
  1080. case '5':
  1081. case '6':
  1082. case '7':
  1083. case '8':
  1084. case '9':
  1085. fl_speed = 1;
  1086. speed = speed * 10 + c - '0';
  1087. break;
  1088. case 'C':
  1089. case 'c':
  1090. rndis_signal_connect(p->confignr);
  1091. break;
  1092. case 'D':
  1093. case 'd':
  1094. rndis_signal_disconnect(p->confignr);
  1095. break;
  1096. default:
  1097. if (fl_speed) p->speed = speed;
  1098. else pr_debug("%c is not valid\n", c);
  1099. break;
  1100. }
  1101. buffer++;
  1102. }
  1103. return count;
  1104. }
  1105. static int rndis_proc_open(struct inode *inode, struct file *file)
  1106. {
  1107. return single_open(file, rndis_proc_show, PDE_DATA(inode));
  1108. }
  1109. static const struct file_operations rndis_proc_fops = {
  1110. .owner = THIS_MODULE,
  1111. .open = rndis_proc_open,
  1112. .read = seq_read,
  1113. .llseek = seq_lseek,
  1114. .release = single_release,
  1115. .write = rndis_proc_write,
  1116. };
  1117. #define NAME_TEMPLATE "driver/rndis-%03d"
  1118. static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS];
  1119. #endif /* CONFIG_USB_GADGET_DEBUG_FILES */
  1120. static int rndis_test_proc_show(struct seq_file *m, void *v)
  1121. {
  1122. seq_printf(m, "[RNDIS] rx_in %lu, rx_out %lu, rx_nomem %lu, rx_error %lu, tx_in %lu, tx_out %lu, tx_busy %lu, tx_complete %lu, last_msg_id: 0x%x, last_resp_id: 0x%x, RNDIS reset cnt: %lu, queue stopped? %d\n",
  1123. rndis_test_rx_usb_in, rndis_test_rx_net_out, rndis_test_rx_nomem, rndis_test_rx_error, rndis_test_tx_net_in,
  1124. rndis_test_tx_usb_out, rndis_test_tx_busy , rndis_test_tx_complete, rndis_test_last_msg_id, rndis_test_last_resp_id, rndis_test_reset_msg_cnt,
  1125. netif_queue_stopped(rndis_per_dev_params[0].dev)) ;
  1126. return 0;
  1127. }
  1128. static int rndis_test_proc_open(struct inode *inode, struct file *file)
  1129. {
  1130. //return single_open(file, rndis_test_proc_show, inode->i_private);
  1131. return single_open(file, rndis_test_proc_show, inode->i_private);
  1132. }
  1133. static ssize_t rndis_test_proc_write(struct file *file, const char __user *buf, size_t length, loff_t *ppos)
  1134. {
  1135. char msg[32];
  1136. if (length >= sizeof(msg)) {
  1137. return -EINVAL;
  1138. }
  1139. if (copy_from_user(msg, buf, length))
  1140. return -EFAULT;
  1141. msg[length] = 0 ;
  1142. return length;
  1143. }
  1144. static bool rndis_initialized;
  1145. static const struct file_operations rndis_test_proc_fops = {
  1146. .owner = THIS_MODULE,
  1147. .open = rndis_test_proc_open,
  1148. .write = rndis_test_proc_write,
  1149. .read = seq_read,
  1150. .llseek = seq_lseek,
  1151. };
  1152. static struct proc_dir_entry *rndis_test_proc ;
  1153. int rndis_init(void)
  1154. {
  1155. u8 i;
  1156. if (rndis_initialized)
  1157. return 0;
  1158. rndis_test_proc = proc_create("rndis_test_proc", 0444, NULL,
  1159. &rndis_test_proc_fops);
  1160. for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
  1161. #ifdef CONFIG_USB_GADGET_DEBUG_FILES
  1162. char name [20];
  1163. sprintf(name, NAME_TEMPLATE, i);
  1164. rndis_connect_state[i] = proc_create_data(name, 0660, NULL,
  1165. &rndis_proc_fops,
  1166. (void *)(rndis_per_dev_params + i));
  1167. if (!rndis_connect_state[i]) {
  1168. pr_debug("%s: remove entries", __func__);
  1169. while (i) {
  1170. sprintf(name, NAME_TEMPLATE, --i);
  1171. remove_proc_entry(name, NULL);
  1172. }
  1173. pr_debug("\n");
  1174. return -EIO;
  1175. }
  1176. #endif
  1177. rndis_per_dev_params[i].confignr = i;
  1178. rndis_per_dev_params[i].used = 0;
  1179. rndis_per_dev_params[i].state = RNDIS_UNINITIALIZED;
  1180. rndis_per_dev_params[i].media_state
  1181. = RNDIS_MEDIA_STATE_DISCONNECTED;
  1182. INIT_LIST_HEAD(&(rndis_per_dev_params[i].resp_queue));
  1183. }
  1184. rndis_initialized = true;
  1185. return 0;
  1186. }
  1187. void rndis_exit(void)
  1188. {
  1189. #ifdef CONFIG_USB_GADGET_DEBUG_FILES
  1190. u8 i;
  1191. char name[20];
  1192. #endif
  1193. if (!rndis_initialized)
  1194. return;
  1195. rndis_initialized = false;
  1196. remove_proc_entry("rndis_test_proc", NULL);
  1197. #ifdef CONFIG_USB_GADGET_DEBUG_FILES
  1198. for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
  1199. sprintf(name, NAME_TEMPLATE, i);
  1200. remove_proc_entry(name, NULL);
  1201. }
  1202. #endif
  1203. }