1*29311227SHans Petter Selasky /* $FreeBSD$ */ 2*29311227SHans Petter Selasky /* $OpenBSD: if_urndisreg.h,v 1.19 2013/11/21 14:08:05 mpi Exp $ */ 3*29311227SHans Petter Selasky 4*29311227SHans Petter Selasky /* 5*29311227SHans Petter Selasky * Copyright (c) 2010 Jonathan Armani <armani@openbsd.org> 6*29311227SHans Petter Selasky * Copyright (c) 2010 Fabien Romano <fabien@openbsd.org> 7*29311227SHans Petter Selasky * Copyright (c) 2010 Michael Knudsen <mk@openbsd.org> 8*29311227SHans Petter Selasky * All rights reserved. 9*29311227SHans Petter Selasky * 10*29311227SHans Petter Selasky * Permission to use, copy, modify, and distribute this software for any 11*29311227SHans Petter Selasky * purpose with or without fee is hereby granted, provided that the above 12*29311227SHans Petter Selasky * copyright notice and this permission notice appear in all copies. 13*29311227SHans Petter Selasky * 14*29311227SHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 15*29311227SHans Petter Selasky * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 16*29311227SHans Petter Selasky * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 17*29311227SHans Petter Selasky * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 18*29311227SHans Petter Selasky * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 19*29311227SHans Petter Selasky * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 20*29311227SHans Petter Selasky * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 21*29311227SHans Petter Selasky */ 22*29311227SHans Petter Selasky 23*29311227SHans Petter Selasky #ifndef _IF_URNDISREG_H_ 24*29311227SHans Petter Selasky #define _IF_URNDISREG_H_ 25*29311227SHans Petter Selasky 26*29311227SHans Petter Selasky #define RNDIS_RESPONSE_LEN 1024 /* bytes */ 27*29311227SHans Petter Selasky #define RNDIS_RX_MAXLEN (16 * 1024) 28*29311227SHans Petter Selasky #define RNDIS_TX_FRAMES_MAX 8 29*29311227SHans Petter Selasky #define RNDIS_TX_MAXLEN MCLBYTES 30*29311227SHans Petter Selasky 31*29311227SHans Petter Selasky enum { 32*29311227SHans Petter Selasky URNDIS_BULK_RX, 33*29311227SHans Petter Selasky URNDIS_BULK_TX, 34*29311227SHans Petter Selasky URNDIS_INTR_RX, 35*29311227SHans Petter Selasky URNDIS_N_TRANSFER, 36*29311227SHans Petter Selasky }; 37*29311227SHans Petter Selasky 38*29311227SHans Petter Selasky struct urndis_softc { 39*29311227SHans Petter Selasky 40*29311227SHans Petter Selasky struct usb_ether sc_ue; 41*29311227SHans Petter Selasky struct mtx sc_mtx; 42*29311227SHans Petter Selasky 43*29311227SHans Petter Selasky /* RNDIS device info */ 44*29311227SHans Petter Selasky uint32_t sc_lim_pktsz; 45*29311227SHans Petter Selasky uint32_t sc_filter; 46*29311227SHans Petter Selasky 47*29311227SHans Petter Selasky struct usb_device *sc_udev; 48*29311227SHans Petter Selasky struct usb_xfer *sc_xfer[URNDIS_N_TRANSFER]; 49*29311227SHans Petter Selasky 50*29311227SHans Petter Selasky uint8_t sc_ifaceno_ctl; 51*29311227SHans Petter Selasky uint8_t sc_response_buf[RNDIS_RESPONSE_LEN] __aligned(4); 52*29311227SHans Petter Selasky }; 53*29311227SHans Petter Selasky 54*29311227SHans Petter Selasky #define URNDIS_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 55*29311227SHans Petter Selasky #define URNDIS_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 56*29311227SHans Petter Selasky #define URNDIS_LOCK_ASSERT(sc, what) mtx_assert(&(sc)->sc_mtx, (x)) 57*29311227SHans Petter Selasky 58*29311227SHans Petter Selasky #define RNDIS_STATUS_BUFFER_OVERFLOW 0x80000005L 59*29311227SHans Petter Selasky #define RNDIS_STATUS_FAILURE 0xC0000001L 60*29311227SHans Petter Selasky #define RNDIS_STATUS_INVALID_DATA 0xC0010015L 61*29311227SHans Petter Selasky #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000BL 62*29311227SHans Petter Selasky #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CL 63*29311227SHans Petter Selasky #define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BBL 64*29311227SHans Petter Selasky #define RNDIS_STATUS_PENDING STATUS_PENDING /* XXX */ 65*29311227SHans Petter Selasky #define RNDIS_STATUS_RESOURCES 0xC000009AL 66*29311227SHans Petter Selasky #define RNDIS_STATUS_SUCCESS 0x00000000L 67*29311227SHans Petter Selasky 68*29311227SHans Petter Selasky #define OID_GEN_SUPPORTED_LIST 0x00010101 69*29311227SHans Petter Selasky #define OID_GEN_HARDWARE_STATUS 0x00010102 70*29311227SHans Petter Selasky #define OID_GEN_MEDIA_SUPPORTED 0x00010103 71*29311227SHans Petter Selasky #define OID_GEN_MEDIA_IN_USE 0x00010104 72*29311227SHans Petter Selasky #define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 73*29311227SHans Petter Selasky #define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 74*29311227SHans Petter Selasky #define OID_GEN_LINK_SPEED 0x00010107 75*29311227SHans Petter Selasky #define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 76*29311227SHans Petter Selasky #define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 77*29311227SHans Petter Selasky #define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A 78*29311227SHans Petter Selasky #define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B 79*29311227SHans Petter Selasky #define OID_GEN_VENDOR_ID 0x0001010C 80*29311227SHans Petter Selasky #define OID_GEN_VENDOR_DESCRIPTION 0x0001010D 81*29311227SHans Petter Selasky #define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E 82*29311227SHans Petter Selasky #define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F 83*29311227SHans Petter Selasky #define OID_GEN_DRIVER_VERSION 0x00010110 84*29311227SHans Petter Selasky #define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 85*29311227SHans Petter Selasky #define OID_GEN_PROTOCOL_OPTIONS 0x00010112 86*29311227SHans Petter Selasky #define OID_GEN_MAC_OPTIONS 0x00010113 87*29311227SHans Petter Selasky #define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 88*29311227SHans Petter Selasky #define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 89*29311227SHans Petter Selasky #define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 90*29311227SHans Petter Selasky #define OID_GEN_SUPPORTED_GUIDS 0x00010117 91*29311227SHans Petter Selasky #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 92*29311227SHans Petter Selasky #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 93*29311227SHans Petter Selasky #define OID_GEN_MACHINE_NAME 0x0001021A 94*29311227SHans Petter Selasky #define OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B 95*29311227SHans Petter Selasky #define OID_GEN_VLAN_ID 0x0001021C 96*29311227SHans Petter Selasky 97*29311227SHans Petter Selasky #define OID_802_3_PERMANENT_ADDRESS 0x01010101 98*29311227SHans Petter Selasky #define OID_802_3_CURRENT_ADDRESS 0x01010102 99*29311227SHans Petter Selasky #define OID_802_3_MULTICAST_LIST 0x01010103 100*29311227SHans Petter Selasky #define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 101*29311227SHans Petter Selasky #define OID_802_3_MAC_OPTIONS 0x01010105 102*29311227SHans Petter Selasky #define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 103*29311227SHans Petter Selasky #define OID_802_3_XMIT_ONE_COLLISION 0x01020102 104*29311227SHans Petter Selasky #define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 105*29311227SHans Petter Selasky #define OID_802_3_XMIT_DEFERRED 0x01020201 106*29311227SHans Petter Selasky #define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 107*29311227SHans Petter Selasky #define OID_802_3_RCV_OVERRUN 0x01020203 108*29311227SHans Petter Selasky #define OID_802_3_XMIT_UNDERRUN 0x01020204 109*29311227SHans Petter Selasky #define OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 110*29311227SHans Petter Selasky #define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 111*29311227SHans Petter Selasky #define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 112*29311227SHans Petter Selasky 113*29311227SHans Petter Selasky #define RNDIS_MEDIUM_802_3 0x00000000 114*29311227SHans Petter Selasky 115*29311227SHans Petter Selasky /* Device flags */ 116*29311227SHans Petter Selasky #define RNDIS_DF_CONNECTIONLESS 0x00000001 117*29311227SHans Petter Selasky #define RNDIS_DF_CONNECTION_ORIENTED 0x00000002 118*29311227SHans Petter Selasky 119*29311227SHans Petter Selasky /* 120*29311227SHans Petter Selasky * RNDIS data message 121*29311227SHans Petter Selasky */ 122*29311227SHans Petter Selasky #define REMOTE_NDIS_PACKET_MSG 0x00000001 123*29311227SHans Petter Selasky 124*29311227SHans Petter Selasky struct urndis_packet_msg { 125*29311227SHans Petter Selasky uint32_t rm_type; 126*29311227SHans Petter Selasky uint32_t rm_len; 127*29311227SHans Petter Selasky uint32_t rm_dataoffset; 128*29311227SHans Petter Selasky uint32_t rm_datalen; 129*29311227SHans Petter Selasky uint32_t rm_oobdataoffset; 130*29311227SHans Petter Selasky uint32_t rm_oobdatalen; 131*29311227SHans Petter Selasky uint32_t rm_oobdataelements; 132*29311227SHans Petter Selasky uint32_t rm_pktinfooffset; 133*29311227SHans Petter Selasky uint32_t rm_pktinfolen; 134*29311227SHans Petter Selasky uint32_t rm_vchandle; 135*29311227SHans Petter Selasky uint32_t rm_reserved; 136*29311227SHans Petter Selasky }; 137*29311227SHans Petter Selasky 138*29311227SHans Petter Selasky /* 139*29311227SHans Petter Selasky * RNDIS control messages 140*29311227SHans Petter Selasky */ 141*29311227SHans Petter Selasky struct urndis_comp_hdr { 142*29311227SHans Petter Selasky uint32_t rm_type; 143*29311227SHans Petter Selasky uint32_t rm_len; 144*29311227SHans Petter Selasky uint32_t rm_rid; 145*29311227SHans Petter Selasky uint32_t rm_status; 146*29311227SHans Petter Selasky }; 147*29311227SHans Petter Selasky 148*29311227SHans Petter Selasky /* Initialize the device. */ 149*29311227SHans Petter Selasky #define REMOTE_NDIS_INITIALIZE_MSG 0x00000002 150*29311227SHans Petter Selasky #define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002 151*29311227SHans Petter Selasky 152*29311227SHans Petter Selasky struct urndis_init_req { 153*29311227SHans Petter Selasky uint32_t rm_type; 154*29311227SHans Petter Selasky uint32_t rm_len; 155*29311227SHans Petter Selasky uint32_t rm_rid; 156*29311227SHans Petter Selasky uint32_t rm_ver_major; 157*29311227SHans Petter Selasky uint32_t rm_ver_minor; 158*29311227SHans Petter Selasky uint32_t rm_max_xfersz; 159*29311227SHans Petter Selasky }; 160*29311227SHans Petter Selasky 161*29311227SHans Petter Selasky struct urndis_init_comp { 162*29311227SHans Petter Selasky uint32_t rm_type; 163*29311227SHans Petter Selasky uint32_t rm_len; 164*29311227SHans Petter Selasky uint32_t rm_rid; 165*29311227SHans Petter Selasky uint32_t rm_status; 166*29311227SHans Petter Selasky uint32_t rm_ver_major; 167*29311227SHans Petter Selasky uint32_t rm_ver_minor; 168*29311227SHans Petter Selasky uint32_t rm_devflags; 169*29311227SHans Petter Selasky uint32_t rm_medium; 170*29311227SHans Petter Selasky uint32_t rm_pktmaxcnt; 171*29311227SHans Petter Selasky uint32_t rm_pktmaxsz; 172*29311227SHans Petter Selasky uint32_t rm_align; 173*29311227SHans Petter Selasky uint32_t rm_aflistoffset; 174*29311227SHans Petter Selasky uint32_t rm_aflistsz; 175*29311227SHans Petter Selasky }; 176*29311227SHans Petter Selasky 177*29311227SHans Petter Selasky /* Halt the device. No response sent. */ 178*29311227SHans Petter Selasky #define REMOTE_NDIS_HALT_MSG 0x00000003 179*29311227SHans Petter Selasky 180*29311227SHans Petter Selasky struct urndis_halt_req { 181*29311227SHans Petter Selasky uint32_t rm_type; 182*29311227SHans Petter Selasky uint32_t rm_len; 183*29311227SHans Petter Selasky uint32_t rm_rid; 184*29311227SHans Petter Selasky }; 185*29311227SHans Petter Selasky 186*29311227SHans Petter Selasky /* Send a query object. */ 187*29311227SHans Petter Selasky #define REMOTE_NDIS_QUERY_MSG 0x00000004 188*29311227SHans Petter Selasky #define REMOTE_NDIS_QUERY_CMPLT 0x80000004 189*29311227SHans Petter Selasky 190*29311227SHans Petter Selasky struct urndis_query_req { 191*29311227SHans Petter Selasky uint32_t rm_type; 192*29311227SHans Petter Selasky uint32_t rm_len; 193*29311227SHans Petter Selasky uint32_t rm_rid; 194*29311227SHans Petter Selasky uint32_t rm_oid; 195*29311227SHans Petter Selasky uint32_t rm_infobuflen; 196*29311227SHans Petter Selasky uint32_t rm_infobufoffset; 197*29311227SHans Petter Selasky uint32_t rm_devicevchdl; 198*29311227SHans Petter Selasky }; 199*29311227SHans Petter Selasky 200*29311227SHans Petter Selasky struct urndis_query_comp { 201*29311227SHans Petter Selasky uint32_t rm_type; 202*29311227SHans Petter Selasky uint32_t rm_len; 203*29311227SHans Petter Selasky uint32_t rm_rid; 204*29311227SHans Petter Selasky uint32_t rm_status; 205*29311227SHans Petter Selasky uint32_t rm_infobuflen; 206*29311227SHans Petter Selasky uint32_t rm_infobufoffset; 207*29311227SHans Petter Selasky }; 208*29311227SHans Petter Selasky 209*29311227SHans Petter Selasky /* Send a set object request. */ 210*29311227SHans Petter Selasky #define REMOTE_NDIS_SET_MSG 0x00000005 211*29311227SHans Petter Selasky #define REMOTE_NDIS_SET_CMPLT 0x80000005 212*29311227SHans Petter Selasky 213*29311227SHans Petter Selasky struct urndis_set_req { 214*29311227SHans Petter Selasky uint32_t rm_type; 215*29311227SHans Petter Selasky uint32_t rm_len; 216*29311227SHans Petter Selasky uint32_t rm_rid; 217*29311227SHans Petter Selasky uint32_t rm_oid; 218*29311227SHans Petter Selasky uint32_t rm_infobuflen; 219*29311227SHans Petter Selasky uint32_t rm_infobufoffset; 220*29311227SHans Petter Selasky uint32_t rm_devicevchdl; 221*29311227SHans Petter Selasky }; 222*29311227SHans Petter Selasky 223*29311227SHans Petter Selasky struct urndis_set_comp { 224*29311227SHans Petter Selasky uint32_t rm_type; 225*29311227SHans Petter Selasky uint32_t rm_len; 226*29311227SHans Petter Selasky uint32_t rm_rid; 227*29311227SHans Petter Selasky uint32_t rm_status; 228*29311227SHans Petter Selasky }; 229*29311227SHans Petter Selasky 230*29311227SHans Petter Selasky #define REMOTE_NDIS_SET_PARAM_NUMERIC 0x00000000 231*29311227SHans Petter Selasky #define REMOTE_NDIS_SET_PARAM_STRING 0x00000002 232*29311227SHans Petter Selasky 233*29311227SHans Petter Selasky struct urndis_set_parameter { 234*29311227SHans Petter Selasky uint32_t rm_nameoffset; 235*29311227SHans Petter Selasky uint32_t rm_namelen; 236*29311227SHans Petter Selasky uint32_t rm_type; 237*29311227SHans Petter Selasky uint32_t rm_valueoffset; 238*29311227SHans Petter Selasky uint32_t rm_valuelen; 239*29311227SHans Petter Selasky }; 240*29311227SHans Petter Selasky 241*29311227SHans Petter Selasky /* Perform a soft reset on the device. */ 242*29311227SHans Petter Selasky #define REMOTE_NDIS_RESET_MSG 0x00000006 243*29311227SHans Petter Selasky #define REMOTE_NDIS_RESET_CMPLT 0x80000006 244*29311227SHans Petter Selasky 245*29311227SHans Petter Selasky struct urndis_reset_req { 246*29311227SHans Petter Selasky uint32_t rm_type; 247*29311227SHans Petter Selasky uint32_t rm_len; 248*29311227SHans Petter Selasky uint32_t rm_rid; 249*29311227SHans Petter Selasky }; 250*29311227SHans Petter Selasky 251*29311227SHans Petter Selasky struct urndis_reset_comp { 252*29311227SHans Petter Selasky uint32_t rm_type; 253*29311227SHans Petter Selasky uint32_t rm_len; 254*29311227SHans Petter Selasky uint32_t rm_status; 255*29311227SHans Petter Selasky uint32_t rm_adrreset; 256*29311227SHans Petter Selasky }; 257*29311227SHans Petter Selasky 258*29311227SHans Petter Selasky /* 802.3 link-state or undefined message error. */ 259*29311227SHans Petter Selasky #define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007 260*29311227SHans Petter Selasky 261*29311227SHans Petter Selasky /* Keepalive messsage. May be sent by device. */ 262*29311227SHans Petter Selasky #define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008 263*29311227SHans Petter Selasky #define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008 264*29311227SHans Petter Selasky 265*29311227SHans Petter Selasky struct urndis_keepalive_req { 266*29311227SHans Petter Selasky uint32_t rm_type; 267*29311227SHans Petter Selasky uint32_t rm_len; 268*29311227SHans Petter Selasky uint32_t rm_rid; 269*29311227SHans Petter Selasky }; 270*29311227SHans Petter Selasky 271*29311227SHans Petter Selasky struct urndis_keepalive_comp { 272*29311227SHans Petter Selasky uint32_t rm_type; 273*29311227SHans Petter Selasky uint32_t rm_len; 274*29311227SHans Petter Selasky uint32_t rm_rid; 275*29311227SHans Petter Selasky uint32_t rm_status; 276*29311227SHans Petter Selasky }; 277*29311227SHans Petter Selasky 278*29311227SHans Petter Selasky /* packet filter bits used by OID_GEN_CURRENT_PACKET_FILTER */ 279*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_DIRECTED 0x00000001 280*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_MULTICAST 0x00000002 281*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 282*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_BROADCAST 0x00000008 283*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 284*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 285*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_SMT 0x00000040 286*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 287*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_GROUP 0x00001000 288*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000 289*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_FUNCTIONAL 0x00004000 290*29311227SHans Petter Selasky #define RNDIS_PACKET_TYPE_MAC_FRAME 0x00008000 291*29311227SHans Petter Selasky 292*29311227SHans Petter Selasky /* RNDIS offsets */ 293*29311227SHans Petter Selasky #define RNDIS_HEADER_OFFSET 8 /* bytes */ 294*29311227SHans Petter Selasky #define RNDIS_DATA_OFFSET ((uint32_t)(sizeof(struct urndis_packet_msg) - RNDIS_HEADER_OFFSET)) 295*29311227SHans Petter Selasky 296*29311227SHans Petter Selasky #endif /* _IF_URNDISREG_H_ */ 297