rndis.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * RNDIS Definitions for Remote NDIS
  4. *
  5. * Authors: Benedikt Spranger, Pengutronix
  6. * Robert Schwebel, Pengutronix
  7. *
  8. * This software was originally developed in conformance with
  9. * Microsoft's Remote NDIS Specification License Agreement.
  10. */
  11. #ifndef _LINUX_RNDIS_H
  12. #define _LINUX_RNDIS_H
  13. #include <linux/rndis.h>
  14. #include "u_ether.h"
  15. #include "ndis.h"
  16. #define RNDIS_MAXIMUM_FRAME_SIZE 1518
  17. #define RNDIS_MAX_TOTAL_SIZE 1558
  18. typedef struct rndis_init_msg_type {
  19. __le32 MessageType;
  20. __le32 MessageLength;
  21. __le32 RequestID;
  22. __le32 MajorVersion;
  23. __le32 MinorVersion;
  24. __le32 MaxTransferSize;
  25. } rndis_init_msg_type;
  26. typedef struct rndis_init_cmplt_type {
  27. __le32 MessageType;
  28. __le32 MessageLength;
  29. __le32 RequestID;
  30. __le32 Status;
  31. __le32 MajorVersion;
  32. __le32 MinorVersion;
  33. __le32 DeviceFlags;
  34. __le32 Medium;
  35. __le32 MaxPacketsPerTransfer;
  36. __le32 MaxTransferSize;
  37. __le32 PacketAlignmentFactor;
  38. __le32 AFListOffset;
  39. __le32 AFListSize;
  40. } rndis_init_cmplt_type;
  41. typedef struct rndis_halt_msg_type {
  42. __le32 MessageType;
  43. __le32 MessageLength;
  44. __le32 RequestID;
  45. } rndis_halt_msg_type;
  46. typedef struct rndis_query_msg_type {
  47. __le32 MessageType;
  48. __le32 MessageLength;
  49. __le32 RequestID;
  50. __le32 OID;
  51. __le32 InformationBufferLength;
  52. __le32 InformationBufferOffset;
  53. __le32 DeviceVcHandle;
  54. } rndis_query_msg_type;
  55. typedef struct rndis_query_cmplt_type {
  56. __le32 MessageType;
  57. __le32 MessageLength;
  58. __le32 RequestID;
  59. __le32 Status;
  60. __le32 InformationBufferLength;
  61. __le32 InformationBufferOffset;
  62. } rndis_query_cmplt_type;
  63. typedef struct rndis_set_msg_type {
  64. __le32 MessageType;
  65. __le32 MessageLength;
  66. __le32 RequestID;
  67. __le32 OID;
  68. __le32 InformationBufferLength;
  69. __le32 InformationBufferOffset;
  70. __le32 DeviceVcHandle;
  71. } rndis_set_msg_type;
  72. typedef struct rndis_set_cmplt_type {
  73. __le32 MessageType;
  74. __le32 MessageLength;
  75. __le32 RequestID;
  76. __le32 Status;
  77. } rndis_set_cmplt_type;
  78. typedef struct rndis_reset_msg_type {
  79. __le32 MessageType;
  80. __le32 MessageLength;
  81. __le32 Reserved;
  82. } rndis_reset_msg_type;
  83. typedef struct rndis_reset_cmplt_type {
  84. __le32 MessageType;
  85. __le32 MessageLength;
  86. __le32 Status;
  87. __le32 AddressingReset;
  88. } rndis_reset_cmplt_type;
  89. typedef struct rndis_indicate_status_msg_type {
  90. __le32 MessageType;
  91. __le32 MessageLength;
  92. __le32 Status;
  93. __le32 StatusBufferLength;
  94. __le32 StatusBufferOffset;
  95. } rndis_indicate_status_msg_type;
  96. typedef struct rndis_keepalive_msg_type {
  97. __le32 MessageType;
  98. __le32 MessageLength;
  99. __le32 RequestID;
  100. } rndis_keepalive_msg_type;
  101. typedef struct rndis_keepalive_cmplt_type {
  102. __le32 MessageType;
  103. __le32 MessageLength;
  104. __le32 RequestID;
  105. __le32 Status;
  106. } rndis_keepalive_cmplt_type;
  107. struct rndis_packet_msg_type {
  108. __le32 MessageType;
  109. __le32 MessageLength;
  110. __le32 DataOffset;
  111. __le32 DataLength;
  112. __le32 OOBDataOffset;
  113. __le32 OOBDataLength;
  114. __le32 NumOOBDataElements;
  115. __le32 PerPacketInfoOffset;
  116. __le32 PerPacketInfoLength;
  117. __le32 VcHandle;
  118. __le32 Reserved;
  119. } __attribute__ ((packed));
  120. struct rndis_config_parameter {
  121. __le32 ParameterNameOffset;
  122. __le32 ParameterNameLength;
  123. __le32 ParameterType;
  124. __le32 ParameterValueOffset;
  125. __le32 ParameterValueLength;
  126. };
  127. /* implementation specific */
  128. enum rndis_state {
  129. RNDIS_UNINITIALIZED,
  130. RNDIS_INITIALIZED,
  131. RNDIS_DATA_INITIALIZED,
  132. };
  133. typedef struct rndis_resp_t {
  134. struct list_head list;
  135. u8 *buf;
  136. u32 length;
  137. int send;
  138. } rndis_resp_t;
  139. typedef struct rndis_params {
  140. int confignr;
  141. u8 used;
  142. u16 saved_filter;
  143. enum rndis_state state;
  144. u32 medium;
  145. u32 speed;
  146. u32 media_state;
  147. const u8 *host_mac;
  148. u16 *filter;
  149. struct net_device *dev;
  150. u32 vendorID;
  151. const char *vendorDescr;
  152. void (*resp_avail)(void *v);
  153. void *v;
  154. struct list_head resp_queue;
  155. } rndis_params;
  156. /* RNDIS Message parser and other useless functions */
  157. int rndis_msg_parser(struct rndis_params *params, u8 *buf);
  158. struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v);
  159. void rndis_deregister(struct rndis_params *params);
  160. int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
  161. u16 *cdc_filter);
  162. int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
  163. const char *vendorDescr);
  164. int rndis_set_param_medium(struct rndis_params *params, u32 medium,
  165. u32 speed);
  166. void rndis_add_hdr(struct sk_buff *skb);
  167. int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
  168. struct sk_buff_head *list);
  169. u8 *rndis_get_next_response(struct rndis_params *params, u32 *length);
  170. void rndis_free_response(struct rndis_params *params, u8 *buf);
  171. void rndis_uninit(struct rndis_params *params);
  172. int rndis_signal_connect(struct rndis_params *params);
  173. int rndis_signal_disconnect(struct rndis_params *params);
  174. int rndis_state(struct rndis_params *params);
  175. extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr);
  176. #endif /* _LINUX_RNDIS_H */