diff --git a/lib/networking/dnserver.c b/lib/networking/dnserver.c index e4e7c34927..5c99c346dc 100644 --- a/lib/networking/dnserver.c +++ b/lib/networking/dnserver.c @@ -34,7 +34,7 @@ static struct udp_pcb *pcb = NULL; dns_query_proc_t query_proc = NULL; -#pragma pack(push, 1) +PACK_STRUCT_BEGIN typedef struct { #if BYTE_ORDER == LITTLE_ENDIAN @@ -74,7 +74,7 @@ typedef struct dns_answer uint16_t len; uint32_t addr; } dns_answer_t; -#pragma pack(pop) +PACK_STRUCT_END typedef struct dns_query { diff --git a/lib/networking/rndis_protocol.h b/lib/networking/rndis_protocol.h index b45860eeb0..dddc7e054d 100644 --- a/lib/networking/rndis_protocol.h +++ b/lib/networking/rndis_protocol.h @@ -46,6 +46,24 @@ #include +#if (TU_BYTE_ORDER==TU_BIG_ENDIAN) +/* These macros should be calculated by the preprocessor and are used within + compile-time constants only (so that there is no endian overhead at runtime). */ +#define PP_RNDIS_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8)) +#define PP_RNDIS_NTOHS(x) PP_RNDIS_HTONS(x) +#define PP_RNDIS_HTONL(x) ((((x) & 0xff) << 24) | \ + (((x) & 0xff00) << 8) | \ + (((x) & 0xff0000UL) >> 8) | \ + (((x) & 0xff000000UL) >> 24)) +#define PP_RNDIS_NTOHL(x) PP_RNDIS_HTONL(x) +#else +#define PP_RNDIS_HTONS(x) (x) +#define PP_RNDIS_NTOHS(x) (x) +#define PP_RNDIS_HTONL(x) (x) +#define PP_RNDIS_NTOHL(x) (x) +#endif + + #define RNDIS_MAJOR_VERSION 1 #define RNDIS_MINOR_VERSION 0 diff --git a/lib/networking/rndis_reports.c b/lib/networking/rndis_reports.c index ee611c8838..cf65d2d953 100644 --- a/lib/networking/rndis_reports.c +++ b/lib/networking/rndis_reports.c @@ -27,14 +27,17 @@ * SOFTWARE. */ -#include #include #include "class/net/net_device.h" #include "rndis_protocol.h" #include "netif/ethernet.h" #define RNDIS_LINK_SPEED 12000000 /* Link baudrate (12Mbit/s for USB-FS) */ +#if !defined(RNDIS_VENDOR) #define RNDIS_VENDOR "TinyUSB" /* NIC vendor name */ +#endif + +#define RNDIS_REPORT_UNUSED_VAR(x) ((void)x) static const uint8_t *const station_hwaddr = tud_network_mac_address; static const uint8_t *const permanent_hwaddr = tud_network_mac_address; @@ -47,28 +50,28 @@ CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN static uint8_t ndis_report[8] = { 0x01,0 static const uint32_t OIDSupportedList[] = { - OID_GEN_SUPPORTED_LIST, - OID_GEN_HARDWARE_STATUS, - OID_GEN_MEDIA_SUPPORTED, - OID_GEN_MEDIA_IN_USE, - OID_GEN_MAXIMUM_FRAME_SIZE, - OID_GEN_LINK_SPEED, - OID_GEN_TRANSMIT_BLOCK_SIZE, - OID_GEN_RECEIVE_BLOCK_SIZE, - OID_GEN_VENDOR_ID, - OID_GEN_VENDOR_DESCRIPTION, - OID_GEN_VENDOR_DRIVER_VERSION, - OID_GEN_CURRENT_PACKET_FILTER, - OID_GEN_MAXIMUM_TOTAL_SIZE, - OID_GEN_PROTOCOL_OPTIONS, - OID_GEN_MAC_OPTIONS, - OID_GEN_MEDIA_CONNECT_STATUS, - OID_GEN_MAXIMUM_SEND_PACKETS, - OID_802_3_PERMANENT_ADDRESS, - OID_802_3_CURRENT_ADDRESS, - OID_802_3_MULTICAST_LIST, - OID_802_3_MAXIMUM_LIST_SIZE, - OID_802_3_MAC_OPTIONS + PP_RNDIS_NTOHL(OID_GEN_SUPPORTED_LIST), + PP_RNDIS_NTOHL(OID_GEN_HARDWARE_STATUS), + PP_RNDIS_NTOHL(OID_GEN_MEDIA_SUPPORTED), + PP_RNDIS_NTOHL(OID_GEN_MEDIA_IN_USE), + PP_RNDIS_NTOHL(OID_GEN_MAXIMUM_FRAME_SIZE), + PP_RNDIS_NTOHL(OID_GEN_LINK_SPEED), + PP_RNDIS_NTOHL(OID_GEN_TRANSMIT_BLOCK_SIZE), + PP_RNDIS_NTOHL(OID_GEN_RECEIVE_BLOCK_SIZE), + PP_RNDIS_NTOHL(OID_GEN_VENDOR_ID), + PP_RNDIS_NTOHL(OID_GEN_VENDOR_DESCRIPTION), + PP_RNDIS_NTOHL(OID_GEN_VENDOR_DRIVER_VERSION), + PP_RNDIS_NTOHL(OID_GEN_CURRENT_PACKET_FILTER), + PP_RNDIS_NTOHL(OID_GEN_MAXIMUM_TOTAL_SIZE), + PP_RNDIS_NTOHL(OID_GEN_PROTOCOL_OPTIONS), + PP_RNDIS_NTOHL(OID_GEN_MAC_OPTIONS), + PP_RNDIS_NTOHL(OID_GEN_MEDIA_CONNECT_STATUS), +// PP_RNDIS_NTOHL(OID_GEN_MAXIMUM_SEND_PACKETS), + PP_RNDIS_NTOHL(OID_802_3_PERMANENT_ADDRESS), + PP_RNDIS_NTOHL(OID_802_3_CURRENT_ADDRESS), + PP_RNDIS_NTOHL(OID_802_3_MULTICAST_LIST), + PP_RNDIS_NTOHL(OID_802_3_MAXIMUM_LIST_SIZE), + PP_RNDIS_NTOHL(OID_802_3_MAC_OPTIONS) }; #define OID_LIST_LENGTH TU_ARRAY_SIZE(OIDSupportedList) @@ -84,12 +87,14 @@ static void rndis_report(void) static void rndis_query_cmplt32(int status, uint32_t data) { rndis_query_cmplt_t *c; + c = (rndis_query_cmplt_t *)encapsulated_buffer; - c->MessageType = REMOTE_NDIS_QUERY_CMPLT; - c->MessageLength = sizeof(rndis_query_cmplt_t) + 4; - c->InformationBufferLength = 4; - c->InformationBufferOffset = 16; + c->MessageType = PP_RNDIS_NTOHL(REMOTE_NDIS_QUERY_CMPLT); + c->MessageLength = tu_le32toh(sizeof(rndis_query_cmplt_t) + 4); + c->InformationBufferLength = PP_RNDIS_NTOHL(4); + c->InformationBufferOffset = PP_RNDIS_NTOHL(16); c->Status = status; + data = tu_le32toh(data); memcpy(c + 1, &data, sizeof(data)); rndis_report(); } @@ -97,11 +102,12 @@ static void rndis_query_cmplt32(int status, uint32_t data) static void rndis_query_cmplt(int status, const void *data, int size) { rndis_query_cmplt_t *c; + c = (rndis_query_cmplt_t *)encapsulated_buffer; - c->MessageType = REMOTE_NDIS_QUERY_CMPLT; - c->MessageLength = sizeof(rndis_query_cmplt_t) + size; - c->InformationBufferLength = size; - c->InformationBufferOffset = 16; + c->MessageType = PP_RNDIS_NTOHL(REMOTE_NDIS_QUERY_CMPLT); + c->MessageLength = tu_le32toh(sizeof(rndis_query_cmplt_t) + size); + c->InformationBufferLength = tu_le32toh(size); + c->InformationBufferOffset = PP_RNDIS_NTOHL(16); c->Status = status; memcpy(c + 1, data, size); rndis_report(); @@ -116,43 +122,104 @@ static const char *rndis_vendor = RNDIS_VENDOR; static void rndis_query(void) { - switch (((rndis_query_msg_t *)encapsulated_buffer)->Oid) - { - case OID_GEN_SUPPORTED_LIST: rndis_query_cmplt(RNDIS_STATUS_SUCCESS, OIDSupportedList, 4 * OID_LIST_LENGTH); return; - case OID_GEN_VENDOR_DRIVER_VERSION: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0x00001000); return; - case OID_802_3_CURRENT_ADDRESS: rndis_query_cmplt(RNDIS_STATUS_SUCCESS, station_hwaddr, 6); return; - case OID_802_3_PERMANENT_ADDRESS: rndis_query_cmplt(RNDIS_STATUS_SUCCESS, permanent_hwaddr, 6); return; - case OID_GEN_MEDIA_SUPPORTED: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return; - case OID_GEN_MEDIA_IN_USE: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return; - case OID_GEN_PHYSICAL_MEDIUM: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return; - case OID_GEN_HARDWARE_STATUS: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return; - case OID_GEN_LINK_SPEED: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, RNDIS_LINK_SPEED / 100); return; - case OID_GEN_VENDOR_ID: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0x00FFFFFF); return; - case OID_GEN_VENDOR_DESCRIPTION: rndis_query_cmplt(RNDIS_STATUS_SUCCESS, rndis_vendor, strlen(rndis_vendor) + 1); return; - case OID_GEN_CURRENT_PACKET_FILTER: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, oid_packet_filter); return; - case OID_GEN_MAXIMUM_FRAME_SIZE: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU - SIZEOF_ETH_HDR); return; - case OID_GEN_MAXIMUM_TOTAL_SIZE: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); return; - case OID_GEN_TRANSMIT_BLOCK_SIZE: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); return; - case OID_GEN_RECEIVE_BLOCK_SIZE: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); return; - case OID_GEN_MEDIA_CONNECT_STATUS: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIA_STATE_CONNECTED); return; - case OID_GEN_RNDIS_CONFIG_PARAMETER: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return; - case OID_802_3_MAXIMUM_LIST_SIZE: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 1); return; - case OID_802_3_MULTICAST_LIST: rndis_query_cmplt32(RNDIS_STATUS_NOT_SUPPORTED, 0); return; - case OID_802_3_MAC_OPTIONS: rndis_query_cmplt32(RNDIS_STATUS_NOT_SUPPORTED, 0); return; - case OID_GEN_MAC_OPTIONS: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, /*MAC_OPT*/ 0); return; - case OID_802_3_RCV_ERROR_ALIGNMENT: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return; - case OID_802_3_XMIT_ONE_COLLISION: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return; - case OID_802_3_XMIT_MORE_COLLISIONS: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return; - case OID_GEN_XMIT_OK: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.txok); return; - case OID_GEN_RCV_OK: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.rxok); return; - case OID_GEN_RCV_ERROR: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.rxbad); return; - case OID_GEN_XMIT_ERROR: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.txbad); return; - case OID_GEN_RCV_NO_BUFFER: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return; - default: rndis_query_cmplt(RNDIS_STATUS_FAILURE, NULL, 0); return; + switch (((rndis_query_msg_t *)encapsulated_buffer)->Oid) { + case PP_RNDIS_NTOHL(OID_GEN_SUPPORTED_LIST): + rndis_query_cmplt(RNDIS_STATUS_SUCCESS, OIDSupportedList, 4 * OID_LIST_LENGTH); + break; + case PP_RNDIS_NTOHL(OID_GEN_VENDOR_DRIVER_VERSION): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0x00001000); + break; + case PP_RNDIS_NTOHL(OID_802_3_CURRENT_ADDRESS): + rndis_query_cmplt(RNDIS_STATUS_SUCCESS, station_hwaddr, 6); + break; + case PP_RNDIS_NTOHL(OID_802_3_PERMANENT_ADDRESS): + rndis_query_cmplt(RNDIS_STATUS_SUCCESS, permanent_hwaddr, 6); + break; + case PP_RNDIS_NTOHL(OID_GEN_MEDIA_SUPPORTED): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); + break; + case PP_RNDIS_NTOHL(OID_GEN_MEDIA_IN_USE): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); + break; + case PP_RNDIS_NTOHL(OID_GEN_PHYSICAL_MEDIUM): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); + break; + case PP_RNDIS_NTOHL(OID_GEN_HARDWARE_STATUS): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); + break; + case PP_RNDIS_NTOHL(OID_GEN_LINK_SPEED): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, RNDIS_LINK_SPEED / 100); + break; + case PP_RNDIS_NTOHL(OID_GEN_VENDOR_ID): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0x00FFFFFF); + break; + case PP_RNDIS_NTOHL(OID_GEN_VENDOR_DESCRIPTION): + rndis_query_cmplt(RNDIS_STATUS_SUCCESS, rndis_vendor, strlen(rndis_vendor) + 1); + break; + case PP_RNDIS_NTOHL(OID_GEN_CURRENT_PACKET_FILTER): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, oid_packet_filter); + break; + case PP_RNDIS_NTOHL(OID_GEN_MAXIMUM_FRAME_SIZE): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU - SIZEOF_ETH_HDR); + break; + case PP_RNDIS_NTOHL(OID_GEN_MAXIMUM_TOTAL_SIZE): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); + break; + case PP_RNDIS_NTOHL(OID_GEN_TRANSMIT_BLOCK_SIZE): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); + break; + case PP_RNDIS_NTOHL(OID_GEN_RECEIVE_BLOCK_SIZE): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); + break; + case PP_RNDIS_NTOHL(OID_GEN_MEDIA_CONNECT_STATUS): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIA_STATE_CONNECTED); + break; + case PP_RNDIS_NTOHL(OID_GEN_RNDIS_CONFIG_PARAMETER): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); + break; + case PP_RNDIS_NTOHL(OID_802_3_MAXIMUM_LIST_SIZE): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 1); + break; + case PP_RNDIS_NTOHL(OID_802_3_MULTICAST_LIST): + rndis_query_cmplt32(PP_RNDIS_NTOHL(RNDIS_STATUS_NOT_SUPPORTED), 0); + break; + case PP_RNDIS_NTOHL(OID_802_3_MAC_OPTIONS): + rndis_query_cmplt32(PP_RNDIS_NTOHL(RNDIS_STATUS_NOT_SUPPORTED), 0); + break; + case PP_RNDIS_NTOHL(OID_GEN_MAC_OPTIONS): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, /*MAC_OPT*/ 0); + break; + case PP_RNDIS_NTOHL(OID_802_3_RCV_ERROR_ALIGNMENT): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); + break; + case PP_RNDIS_NTOHL(OID_802_3_XMIT_ONE_COLLISION): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); + break; + case PP_RNDIS_NTOHL(OID_802_3_XMIT_MORE_COLLISIONS): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); + break; + case PP_RNDIS_NTOHL(OID_GEN_XMIT_OK): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.txok); + break; + case PP_RNDIS_NTOHL(OID_GEN_RCV_OK): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.rxok); + break; + case PP_RNDIS_NTOHL(OID_GEN_RCV_ERROR): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.rxbad); + break; + case PP_RNDIS_NTOHL(OID_GEN_XMIT_ERROR): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.txbad); + break; + case PP_RNDIS_NTOHL(OID_GEN_RCV_NO_BUFFER): + rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); + break; + default: + rndis_query_cmplt(PP_RNDIS_NTOHL(RNDIS_STATUS_FAILURE), NULL, 0); + break; } } -#define INFBUF ((uint8_t *)&(m->RequestId) + m->InformationBufferOffset) +#define INFBUF ((uint8_t *)&(m->RequestId) + tu_le32toh(m->InformationBufferOffset)) static void rndis_handle_config_parm(const char *data, int keyoffset, int valoffset, int keylen, int vallen) { @@ -178,14 +245,14 @@ static void rndis_handle_set_msg(void) m = (rndis_set_msg_t *)encapsulated_buffer; oid = m->Oid; - c->MessageType = REMOTE_NDIS_SET_CMPLT; - c->MessageLength = sizeof(rndis_set_cmplt_t); - c->Status = RNDIS_STATUS_SUCCESS; + c->MessageType = PP_RNDIS_NTOHL(REMOTE_NDIS_SET_CMPLT); + c->MessageLength = tu_le32toh(sizeof(rndis_set_cmplt_t)); + c->Status = PP_RNDIS_NTOHL(RNDIS_STATUS_SUCCESS); switch (oid) { /* Parameters set up in 'Advanced' tab */ - case OID_GEN_RNDIS_CONFIG_PARAMETER: + case PP_RNDIS_NTOHL(OID_GEN_RNDIS_CONFIG_PARAMETER): { rndis_config_parameter_t *p; char *ptr = (char *)m; @@ -197,35 +264,34 @@ static void rndis_handle_set_msg(void) break; /* Mandatory general OIDs */ - case OID_GEN_CURRENT_PACKET_FILTER: + case PP_RNDIS_NTOHL(OID_GEN_CURRENT_PACKET_FILTER): memcpy(&oid_packet_filter, INFBUF, 4); - if (oid_packet_filter) - { - rndis_packetFilter(oid_packet_filter); + if (oid_packet_filter) { + rndis_packetFilter(tu_le32toh(oid_packet_filter)); rndis_state = rndis_data_initialized; - } - else - { + + } else { rndis_state = rndis_initialized; } + RNDIS_REPORT_UNUSED_VAR(rndis_state); break; - case OID_GEN_CURRENT_LOOKAHEAD: + case PP_RNDIS_NTOHL(OID_GEN_CURRENT_LOOKAHEAD): break; - case OID_GEN_PROTOCOL_OPTIONS: + case PP_RNDIS_NTOHL(OID_GEN_PROTOCOL_OPTIONS): break; /* Mandatory 802_3 OIDs */ - case OID_802_3_MULTICAST_LIST: + case PP_RNDIS_NTOHL(OID_802_3_MULTICAST_LIST): break; /* Power Managment: fails for now */ - case OID_PNP_ADD_WAKE_UP_PATTERN: - case OID_PNP_REMOVE_WAKE_UP_PATTERN: - case OID_PNP_ENABLE_WAKE_UP: + case PP_RNDIS_NTOHL(OID_PNP_ADD_WAKE_UP_PATTERN): + case PP_RNDIS_NTOHL(OID_PNP_REMOVE_WAKE_UP_PATTERN): + case PP_RNDIS_NTOHL(OID_PNP_ENABLE_WAKE_UP): default: - c->Status = RNDIS_STATUS_FAILURE; + c->Status = PP_RNDIS_NTOHL(RNDIS_STATUS_FAILURE); break; } @@ -239,62 +305,63 @@ void rndis_class_set_handler(uint8_t *data, int size) encapsulated_buffer = data; (void)size; - switch (((rndis_generic_msg_t *)encapsulated_buffer)->MessageType) - { - case REMOTE_NDIS_INITIALIZE_MSG: + switch (((rndis_generic_msg_t *)encapsulated_buffer)->MessageType) { + case PP_RNDIS_NTOHL(REMOTE_NDIS_INITIALIZE_MSG): { rndis_initialize_cmplt_t *m; m = ((rndis_initialize_cmplt_t *)encapsulated_buffer); /* m->MessageID is same as before */ - m->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT; - m->MessageLength = sizeof(rndis_initialize_cmplt_t); - m->MajorVersion = RNDIS_MAJOR_VERSION; - m->MinorVersion = RNDIS_MINOR_VERSION; - m->Status = RNDIS_STATUS_SUCCESS; - m->DeviceFlags = RNDIS_DF_CONNECTIONLESS; - m->Medium = RNDIS_MEDIUM_802_3; - m->MaxPacketsPerTransfer = 1; - m->MaxTransferSize = CFG_TUD_NET_MTU + sizeof(rndis_data_packet_t); - m->PacketAlignmentFactor = 0; - m->AfListOffset = 0; - m->AfListSize = 0; + m->MessageType = PP_RNDIS_NTOHL(REMOTE_NDIS_INITIALIZE_CMPLT); + m->MessageLength = tu_le32toh(sizeof(rndis_initialize_cmplt_t)); + m->MajorVersion = PP_RNDIS_NTOHL(RNDIS_MAJOR_VERSION); + m->MinorVersion = PP_RNDIS_NTOHL(RNDIS_MINOR_VERSION); + m->Status = PP_RNDIS_NTOHL(RNDIS_STATUS_SUCCESS); + m->DeviceFlags = PP_RNDIS_NTOHL(RNDIS_DF_CONNECTIONLESS); + m->Medium = PP_RNDIS_NTOHL(RNDIS_MEDIUM_802_3); + m->MaxPacketsPerTransfer = PP_RNDIS_NTOHL(1); + m->MaxTransferSize = tu_le32toh(CFG_TUD_NET_MTU + sizeof(rndis_data_packet_t)); + m->PacketAlignmentFactor = PP_RNDIS_NTOHL(0); + m->AfListOffset = PP_RNDIS_NTOHL(0); + m->AfListSize = PP_RNDIS_NTOHL(0); rndis_state = rndis_initialized; rndis_report(); } break; - case REMOTE_NDIS_QUERY_MSG: + case PP_RNDIS_NTOHL(REMOTE_NDIS_QUERY_MSG): rndis_query(); break; - case REMOTE_NDIS_SET_MSG: + case PP_RNDIS_NTOHL(REMOTE_NDIS_SET_MSG): rndis_handle_set_msg(); break; - case REMOTE_NDIS_RESET_MSG: + case PP_RNDIS_NTOHL(REMOTE_NDIS_RESET_MSG): { rndis_reset_cmplt_t * m; m = ((rndis_reset_cmplt_t *)encapsulated_buffer); rndis_state = rndis_uninitialized; - m->MessageType = REMOTE_NDIS_RESET_CMPLT; - m->MessageLength = sizeof(rndis_reset_cmplt_t); - m->Status = RNDIS_STATUS_SUCCESS; - m->AddressingReset = 1; /* Make it look like we did something */ - /* m->AddressingReset = 0; - Windows halts if set to 1 for some reason */ + m->MessageType = PP_RNDIS_NTOHL(REMOTE_NDIS_RESET_CMPLT); + m->MessageLength = tu_le32toh(sizeof(rndis_reset_cmplt_t)); + m->Status = PP_RNDIS_NTOHL(RNDIS_STATUS_SUCCESS); + m->AddressingReset = PP_RNDIS_NTOHL(1); /* Make it look like we did something */ + + /* m->AddressingReset = 0; - Windows halts if set to 1 for some reason */ rndis_report(); } break; - case REMOTE_NDIS_KEEPALIVE_MSG: + case PP_RNDIS_NTOHL(REMOTE_NDIS_KEEPALIVE_MSG): { rndis_keepalive_cmplt_t * m; m = (rndis_keepalive_cmplt_t *)encapsulated_buffer; - m->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT; - m->MessageLength = sizeof(rndis_keepalive_cmplt_t); - m->Status = RNDIS_STATUS_SUCCESS; + m->MessageType = PP_RNDIS_NTOHL(REMOTE_NDIS_KEEPALIVE_CMPLT); + m->MessageLength = tu_le32toh(sizeof(rndis_keepalive_cmplt_t)); + m->Status = PP_RNDIS_NTOHL(RNDIS_STATUS_SUCCESS); + + /* We have data to send back */ + rndis_report(); } - /* We have data to send back */ - rndis_report(); break; default: diff --git a/src/class/net/ecm_rndis_device.c b/src/class/net/ecm_rndis_device.c index c6cd388e3a..d20de051db 100644 --- a/src/class/net/ecm_rndis_device.c +++ b/src/class/net/ecm_rndis_device.c @@ -73,7 +73,11 @@ struct ecm_notify_struct static const struct ecm_notify_struct ecm_notify_nc = { .header = { +#if defined(__CCRX__) + .bmRequestType = { 0xA1 }, /* Note: CCRX needs the braces over this struct member */ +#else .bmRequestType = 0xA1, +#endif .bRequest = 0 /* NETWORK_CONNECTION aka NetworkConnection */, .wValue = 1 /* Connected */, .wLength = 0, @@ -83,7 +87,11 @@ static const struct ecm_notify_struct ecm_notify_nc = static const struct ecm_notify_struct ecm_notify_csc = { .header = { +#if defined(__CCRX__) + .bmRequestType = { 0xA1 }, /* Note: CCRX needs the braces over this struct member */ +#else .bmRequestType = 0xA1, +#endif .bRequest = 0x2A /* CONNECTION_SPEED_CHANGE aka ConnectionSpeedChange */, .wLength = 8, }, @@ -359,11 +367,11 @@ static void handle_incoming_packet(uint32_t len) { rndis_data_packet_t *r = (rndis_data_packet_t *) ((void*) pnt); if (len >= sizeof(rndis_data_packet_t)) - if ( (r->MessageType == REMOTE_NDIS_PACKET_MSG) && (r->MessageLength <= len)) - if ( (r->DataOffset + offsetof(rndis_data_packet_t, DataOffset) + r->DataLength) <= len) + if ( (r->MessageType == PP_RNDIS_HTONL(REMOTE_NDIS_PACKET_MSG)) && (tu_le32toh(r->MessageLength) <= len)) + if ( (tu_le32toh(r->DataOffset) + offsetof(rndis_data_packet_t, DataOffset) + tu_le32toh(r->DataLength)) <= len) { - pnt = &received[r->DataOffset + offsetof(rndis_data_packet_t, DataOffset)]; - size = r->DataLength; + pnt = &received[tu_le32toh(r->DataOffset) + offsetof(rndis_data_packet_t, DataOffset)]; + size = tu_le32toh(r->DataLength); } } @@ -433,10 +441,10 @@ void tud_network_xmit(void *ref, uint16_t arg) { rndis_data_packet_t *hdr = (rndis_data_packet_t *) ((void*) transmitted); memset(hdr, 0, sizeof(rndis_data_packet_t)); - hdr->MessageType = REMOTE_NDIS_PACKET_MSG; - hdr->MessageLength = len; - hdr->DataOffset = sizeof(rndis_data_packet_t) - offsetof(rndis_data_packet_t, DataOffset); - hdr->DataLength = len - sizeof(rndis_data_packet_t); + hdr->MessageType = PP_RNDIS_HTONL(REMOTE_NDIS_PACKET_MSG); + hdr->MessageLength = tu_le32toh(len); + hdr->DataOffset = tu_le32toh(sizeof(rndis_data_packet_t) - offsetof(rndis_data_packet_t, DataOffset)); + hdr->DataLength = tu_le32toh(len - sizeof(rndis_data_packet_t)); } do_in_xfer(transmitted, len);