| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ZIRCON_SYSTEM_DEV_ETHERNET_RNDIS_RNDISHOST_H_ |
| #define ZIRCON_SYSTEM_DEV_ETHERNET_RNDIS_RNDISHOST_H_ |
| |
| #include <stdint.h> |
| #include <zircon/compiler.h> |
| |
| // clang-format off |
| |
| // USB subclass and protocol for binding |
| #define RNDIS_SUBCLASS 0x01 |
| #define RNDIS_PROTOCOL 0x03 |
| |
| #define RNDIS_MAJOR_VERSION 0x00000001 |
| #define RNDIS_MINOR_VERSION 0x00000000 |
| #define RNDIS_MAX_XFER_SIZE 0x00004000 |
| |
| // Messages |
| #define RNDIS_PACKET_MSG 0x00000001 |
| #define RNDIS_INITIALIZE_MSG 0x00000002 |
| #define RNDIS_QUERY_MSG 0x00000004 |
| #define RNDIS_SET_MSG 0x00000005 |
| #define RNDIS_INITIALIZE_CMPLT 0x80000002 |
| #define RNDIS_QUERY_CMPLT 0x80000004 |
| #define RNDIS_SET_CMPLT 0x80000005 |
| |
| // Statuses |
| #define RNDIS_STATUS_SUCCESS 0x00000000 |
| #define RNDIS_STATUS_FAILURE 0xC0000001 |
| #define RNDIS_STATUS_INVALID_DATA 0xC0010015 |
| #define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BB |
| #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000B |
| #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000C |
| |
| // OIDs |
| #define OID_802_3_PERMANENT_ADDRESS 0x01010101 |
| #define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 |
| #define OID_GEN_CURRENT_PACKET_FILTER 0x0001010e |
| #define OID_GEN_PHYSICAL_MEDIUM 0x00010202 |
| |
| // Filter options |
| #define RNDIS_PACKET_TYPE_DIRECTED 0x00000001 |
| #define RNDIS_PACKET_TYPE_MULTICAST 0x00000002 |
| #define RNDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 |
| #define RNDIS_PACKET_TYPE_BROADCAST 0x00000008 |
| #define RNDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 |
| #define RNDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 |
| #define RNDIS_PACKET_TYPE_SMT 0x00000040 |
| #define RNDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 |
| #define RNDIS_PACKET_TYPE_GROUP 0x00001000 |
| #define RNDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000 |
| #define RNDIS_PACKET_TYPE_FUNCTIONAL 0x00004000 |
| #define RNDIS_PACKET_TYPE_MAC_FRAME 0x00008000 |
| |
| #define RNDIS_BUFFER_SIZE 1024 |
| #define RNDIS_QUERY_BUFFER_OFFSET 20 |
| #define RNDIS_CONTROL_TIMEOUT ZX_SEC(5) |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| } __PACKED rndis_header; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t status; |
| } __PACKED rndis_header_complete; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t major_version; |
| uint32_t minor_version; |
| uint32_t max_xfer_size; |
| } __PACKED rndis_init; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t status; |
| uint32_t major_version; |
| uint32_t minor_version; |
| uint32_t device_flags; |
| uint32_t medium; |
| uint32_t max_packers_per_xfer; |
| uint32_t max_xfer_size; |
| uint32_t packet_alignment; |
| uint32_t reserved0; |
| uint32_t reserved1; |
| } __PACKED rndis_init_complete; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t oid; |
| uint32_t info_buffer_length; |
| uint32_t info_buffer_offset; |
| uint32_t reserved; |
| } __PACKED rndis_query; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t status; |
| uint32_t info_buffer_length; |
| uint32_t info_buffer_offset; |
| } __PACKED rndis_query_complete; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t oid; |
| uint32_t info_buffer_length; |
| uint32_t info_buffer_offset; |
| uint32_t reserved; |
| } __PACKED rndis_set; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t request_id; |
| uint32_t status; |
| // TODO: Figure out why these fields aren't send in the reply. Maybe the |
| // Pixel I'm testing with implements the spec badly? |
| //uint32_t info_buffer_length; |
| //uint32_t info_buffer_offset; |
| } __PACKED rndis_set_complete; |
| |
| typedef struct { |
| uint32_t msg_type; |
| uint32_t msg_length; |
| uint32_t data_offset; |
| uint32_t data_length; |
| uint32_t oob_data_offset; |
| uint32_t oob_data_length; |
| uint32_t num_oob_elements; |
| uint32_t per_packet_info_offset; |
| uint32_t per_packet_info_length; |
| uint32_t reserved0; |
| uint32_t reserved1; |
| } __PACKED rndis_packet_header; |
| |
| #endif // ZIRCON_SYSTEM_DEV_ETHERNET_RNDIS_RNDISHOST_H_ |