12e759738SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * RNDIS Definitions for Remote NDIS 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Authors: Benedikt Spranger, Pengutronix 61da177e4SLinus Torvalds * Robert Schwebel, Pengutronix 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * This software was originally developed in conformance with 91da177e4SLinus Torvalds * Microsoft's Remote NDIS Specification License Agreement. 101da177e4SLinus Torvalds */ 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #ifndef _LINUX_RNDIS_H 131da177e4SLinus Torvalds #define _LINUX_RNDIS_H 141da177e4SLinus Torvalds 157591157eSLinus Walleij #include <linux/rndis.h> 16cbbd14a9SAndrzej Pietrasiewicz #include "u_ether.h" 171da177e4SLinus Torvalds #include "ndis.h" 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds #define RNDIS_MAXIMUM_FRAME_SIZE 1518 201da177e4SLinus Torvalds #define RNDIS_MAX_TOTAL_SIZE 1558 211da177e4SLinus Torvalds 2297f0117bSAnson Jacob typedef struct rndis_init_msg_type { 231da177e4SLinus Torvalds __le32 MessageType; 241da177e4SLinus Torvalds __le32 MessageLength; 251da177e4SLinus Torvalds __le32 RequestID; 261da177e4SLinus Torvalds __le32 MajorVersion; 271da177e4SLinus Torvalds __le32 MinorVersion; 281da177e4SLinus Torvalds __le32 MaxTransferSize; 291da177e4SLinus Torvalds } rndis_init_msg_type; 301da177e4SLinus Torvalds 3197f0117bSAnson Jacob typedef struct rndis_init_cmplt_type { 321da177e4SLinus Torvalds __le32 MessageType; 331da177e4SLinus Torvalds __le32 MessageLength; 341da177e4SLinus Torvalds __le32 RequestID; 351da177e4SLinus Torvalds __le32 Status; 361da177e4SLinus Torvalds __le32 MajorVersion; 371da177e4SLinus Torvalds __le32 MinorVersion; 381da177e4SLinus Torvalds __le32 DeviceFlags; 391da177e4SLinus Torvalds __le32 Medium; 401da177e4SLinus Torvalds __le32 MaxPacketsPerTransfer; 411da177e4SLinus Torvalds __le32 MaxTransferSize; 421da177e4SLinus Torvalds __le32 PacketAlignmentFactor; 431da177e4SLinus Torvalds __le32 AFListOffset; 441da177e4SLinus Torvalds __le32 AFListSize; 451da177e4SLinus Torvalds } rndis_init_cmplt_type; 461da177e4SLinus Torvalds 4797f0117bSAnson Jacob typedef struct rndis_halt_msg_type { 481da177e4SLinus Torvalds __le32 MessageType; 491da177e4SLinus Torvalds __le32 MessageLength; 501da177e4SLinus Torvalds __le32 RequestID; 511da177e4SLinus Torvalds } rndis_halt_msg_type; 521da177e4SLinus Torvalds 5397f0117bSAnson Jacob typedef struct rndis_query_msg_type { 541da177e4SLinus Torvalds __le32 MessageType; 551da177e4SLinus Torvalds __le32 MessageLength; 561da177e4SLinus Torvalds __le32 RequestID; 571da177e4SLinus Torvalds __le32 OID; 581da177e4SLinus Torvalds __le32 InformationBufferLength; 591da177e4SLinus Torvalds __le32 InformationBufferOffset; 601da177e4SLinus Torvalds __le32 DeviceVcHandle; 611da177e4SLinus Torvalds } rndis_query_msg_type; 621da177e4SLinus Torvalds 6397f0117bSAnson Jacob typedef struct rndis_query_cmplt_type { 641da177e4SLinus Torvalds __le32 MessageType; 651da177e4SLinus Torvalds __le32 MessageLength; 661da177e4SLinus Torvalds __le32 RequestID; 671da177e4SLinus Torvalds __le32 Status; 681da177e4SLinus Torvalds __le32 InformationBufferLength; 691da177e4SLinus Torvalds __le32 InformationBufferOffset; 701da177e4SLinus Torvalds } rndis_query_cmplt_type; 711da177e4SLinus Torvalds 7297f0117bSAnson Jacob typedef struct rndis_set_msg_type { 731da177e4SLinus Torvalds __le32 MessageType; 741da177e4SLinus Torvalds __le32 MessageLength; 751da177e4SLinus Torvalds __le32 RequestID; 761da177e4SLinus Torvalds __le32 OID; 771da177e4SLinus Torvalds __le32 InformationBufferLength; 781da177e4SLinus Torvalds __le32 InformationBufferOffset; 791da177e4SLinus Torvalds __le32 DeviceVcHandle; 801da177e4SLinus Torvalds } rndis_set_msg_type; 811da177e4SLinus Torvalds 8297f0117bSAnson Jacob typedef struct rndis_set_cmplt_type { 831da177e4SLinus Torvalds __le32 MessageType; 841da177e4SLinus Torvalds __le32 MessageLength; 851da177e4SLinus Torvalds __le32 RequestID; 861da177e4SLinus Torvalds __le32 Status; 871da177e4SLinus Torvalds } rndis_set_cmplt_type; 881da177e4SLinus Torvalds 8997f0117bSAnson Jacob typedef struct rndis_reset_msg_type { 901da177e4SLinus Torvalds __le32 MessageType; 911da177e4SLinus Torvalds __le32 MessageLength; 921da177e4SLinus Torvalds __le32 Reserved; 931da177e4SLinus Torvalds } rndis_reset_msg_type; 941da177e4SLinus Torvalds 9597f0117bSAnson Jacob typedef struct rndis_reset_cmplt_type { 961da177e4SLinus Torvalds __le32 MessageType; 971da177e4SLinus Torvalds __le32 MessageLength; 981da177e4SLinus Torvalds __le32 Status; 991da177e4SLinus Torvalds __le32 AddressingReset; 1001da177e4SLinus Torvalds } rndis_reset_cmplt_type; 1011da177e4SLinus Torvalds 10297f0117bSAnson Jacob typedef struct rndis_indicate_status_msg_type { 1031da177e4SLinus Torvalds __le32 MessageType; 1041da177e4SLinus Torvalds __le32 MessageLength; 1051da177e4SLinus Torvalds __le32 Status; 1061da177e4SLinus Torvalds __le32 StatusBufferLength; 1071da177e4SLinus Torvalds __le32 StatusBufferOffset; 1081da177e4SLinus Torvalds } rndis_indicate_status_msg_type; 1091da177e4SLinus Torvalds 11097f0117bSAnson Jacob typedef struct rndis_keepalive_msg_type { 1111da177e4SLinus Torvalds __le32 MessageType; 1121da177e4SLinus Torvalds __le32 MessageLength; 1131da177e4SLinus Torvalds __le32 RequestID; 1141da177e4SLinus Torvalds } rndis_keepalive_msg_type; 1151da177e4SLinus Torvalds 11697f0117bSAnson Jacob typedef struct rndis_keepalive_cmplt_type { 1171da177e4SLinus Torvalds __le32 MessageType; 1181da177e4SLinus Torvalds __le32 MessageLength; 1191da177e4SLinus Torvalds __le32 RequestID; 1201da177e4SLinus Torvalds __le32 Status; 1211da177e4SLinus Torvalds } rndis_keepalive_cmplt_type; 1221da177e4SLinus Torvalds 12397f0117bSAnson Jacob struct rndis_packet_msg_type { 1241da177e4SLinus Torvalds __le32 MessageType; 1251da177e4SLinus Torvalds __le32 MessageLength; 1261da177e4SLinus Torvalds __le32 DataOffset; 1271da177e4SLinus Torvalds __le32 DataLength; 1281da177e4SLinus Torvalds __le32 OOBDataOffset; 1291da177e4SLinus Torvalds __le32 OOBDataLength; 1301da177e4SLinus Torvalds __le32 NumOOBDataElements; 1311da177e4SLinus Torvalds __le32 PerPacketInfoOffset; 1321da177e4SLinus Torvalds __le32 PerPacketInfoLength; 1331da177e4SLinus Torvalds __le32 VcHandle; 1341da177e4SLinus Torvalds __le32 Reserved; 135178398dcSWu, Bryan } __attribute__ ((packed)); 1361da177e4SLinus Torvalds 13797f0117bSAnson Jacob struct rndis_config_parameter { 1381da177e4SLinus Torvalds __le32 ParameterNameOffset; 1391da177e4SLinus Torvalds __le32 ParameterNameLength; 1401da177e4SLinus Torvalds __le32 ParameterType; 1411da177e4SLinus Torvalds __le32 ParameterValueOffset; 1421da177e4SLinus Torvalds __le32 ParameterValueLength; 1431da177e4SLinus Torvalds }; 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds /* implementation specific */ 14697f0117bSAnson Jacob enum rndis_state { 1471da177e4SLinus Torvalds RNDIS_UNINITIALIZED, 1481da177e4SLinus Torvalds RNDIS_INITIALIZED, 1491da177e4SLinus Torvalds RNDIS_DATA_INITIALIZED, 1501da177e4SLinus Torvalds }; 1511da177e4SLinus Torvalds 15297f0117bSAnson Jacob typedef struct rndis_resp_t { 1531da177e4SLinus Torvalds struct list_head list; 1541da177e4SLinus Torvalds u8 *buf; 1551da177e4SLinus Torvalds u32 length; 1561da177e4SLinus Torvalds int send; 1571da177e4SLinus Torvalds } rndis_resp_t; 1581da177e4SLinus Torvalds 15997f0117bSAnson Jacob typedef struct rndis_params { 16081dff869SAndrzej Pietrasiewicz int confignr; 161340600abSDavid Brownell u8 used; 162340600abSDavid Brownell u16 saved_filter; 1631da177e4SLinus Torvalds enum rndis_state state; 1641da177e4SLinus Torvalds u32 medium; 1651da177e4SLinus Torvalds u32 speed; 1661da177e4SLinus Torvalds u32 media_state; 167340600abSDavid Brownell 1681da177e4SLinus Torvalds const u8 *host_mac; 169340600abSDavid Brownell u16 *filter; 1701da177e4SLinus Torvalds struct net_device *dev; 171340600abSDavid Brownell 1721da177e4SLinus Torvalds u32 vendorID; 1731da177e4SLinus Torvalds const char *vendorDescr; 17415b2d2b5SDavid Brownell void (*resp_avail)(void *v); 17515b2d2b5SDavid Brownell void *v; 1761da177e4SLinus Torvalds struct list_head resp_queue; 177*aaaba1c8SDaehwan Jung spinlock_t resp_lock; 1781da177e4SLinus Torvalds } rndis_params; 1791da177e4SLinus Torvalds 1801da177e4SLinus Torvalds /* RNDIS Message parser and other useless functions */ 18183210e59SAndrzej Pietrasiewicz int rndis_msg_parser(struct rndis_params *params, u8 *buf); 18283210e59SAndrzej Pietrasiewicz struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v); 18383210e59SAndrzej Pietrasiewicz void rndis_deregister(struct rndis_params *params); 18483210e59SAndrzej Pietrasiewicz int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev, 185340600abSDavid Brownell u16 *cdc_filter); 18683210e59SAndrzej Pietrasiewicz int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID, 1871da177e4SLinus Torvalds const char *vendorDescr); 18883210e59SAndrzej Pietrasiewicz int rndis_set_param_medium(struct rndis_params *params, u32 medium, 18983210e59SAndrzej Pietrasiewicz u32 speed); 1901da177e4SLinus Torvalds void rndis_add_hdr(struct sk_buff *skb); 1919b39e9ddSBrian Niebuhr int rndis_rm_hdr(struct gether *port, struct sk_buff *skb, 1929b39e9ddSBrian Niebuhr struct sk_buff_head *list); 19383210e59SAndrzej Pietrasiewicz u8 *rndis_get_next_response(struct rndis_params *params, u32 *length); 19483210e59SAndrzej Pietrasiewicz void rndis_free_response(struct rndis_params *params, u8 *buf); 1951da177e4SLinus Torvalds 19683210e59SAndrzej Pietrasiewicz void rndis_uninit(struct rndis_params *params); 19783210e59SAndrzej Pietrasiewicz int rndis_signal_connect(struct rndis_params *params); 19883210e59SAndrzej Pietrasiewicz int rndis_signal_disconnect(struct rndis_params *params); 19983210e59SAndrzej Pietrasiewicz int rndis_state(struct rndis_params *params); 20083210e59SAndrzej Pietrasiewicz extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr); 2011da177e4SLinus Torvalds 2021da177e4SLinus Torvalds #endif /* _LINUX_RNDIS_H */ 203