diff options
| author | hathach <[email protected]> | 2013-09-11 15:03:37 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-09-11 15:03:37 +0700 |
| commit | 09dd83c05bea646df7ed95099537a712fe876110 (patch) | |
| tree | c05be44a4d574fc8aaf58c95d4b297b8092804cb /tinyusb | |
| parent | 2d021e07287cbfaa52e61d1c7e2827667c08feab (diff) | |
add set msg & get set cmplt for OID_GEN_CURRENT_PACKET_FILTER (default = 0 reject all) to
○ NDIS_PACKET_TYPE_DIRECTED
○ NDIS_PACKET_TYPE_MULTICAST
○ NDIS_PACKET_TYPE_BROADCAST
Diffstat (limited to 'tinyusb')
| -rw-r--r-- | tinyusb/class/cdc_rndis.h | 1 | ||||
| -rw-r--r-- | tinyusb/class/cdc_rndis_host.c | 116 |
2 files changed, 73 insertions, 44 deletions
diff --git a/tinyusb/class/cdc_rndis.h b/tinyusb/class/cdc_rndis.h index ad667ab2e..334f6145d 100644 --- a/tinyusb/class/cdc_rndis.h +++ b/tinyusb/class/cdc_rndis.h @@ -64,6 +64,7 @@ typedef enum { RNDIS_MSG_QUERY_CMPLT = 0x80000004UL, RNDIS_MSG_SET = 0x00000005UL, + RNDIS_MSG_SET_CMPLT = 0x80000005UL, RNDIS_MSG_RESET = 0x00000006UL, RNDIS_MSG_RESET_CMPLT = 0x80000006UL, diff --git a/tinyusb/class/cdc_rndis_host.c b/tinyusb/class/cdc_rndis_host.c index 5ae808b68..98c0f3ed6 100644 --- a/tinyusb/class/cdc_rndis_host.c +++ b/tinyusb/class/cdc_rndis_host.c @@ -135,6 +135,39 @@ void rndish_close(uint8_t dev_addr) osal_semaphore_reset( rndish_data[dev_addr-1].sem_notification_hdl ); } + +static rndis_msg_initialize_t const msg_init = +{ + .type = RNDIS_MSG_INITIALIZE, + .length = sizeof(rndis_msg_initialize_t), + .request_id = 1, // TODO should use some magic number + .major_version = 1, + .minor_version = 0, + .max_xfer_size = 0x4000 // TODO mimic windows +}; + +static rndis_msg_query_t const msg_query_permanent_addr = +{ + .type = RNDIS_MSG_QUERY, + .length = sizeof(rndis_msg_query_t)+6, + .request_id = 1, + .oid = OID_802_3_PERMANENT_ADDRESS, + .buffer_length = 6, + .buffer_offset = 20, + .oid_buffer = {0, 0, 0, 0, 0, 0} +}; + +static rndis_msg_set_t const msg_set_packet_filter = +{ + .type = RNDIS_MSG_SET, + .length = sizeof(rndis_msg_set_t)+4, + .request_id = 1, + .oid = OID_GEN_CURRENT_PACKET_FILTER, + .buffer_length = 4, + .buffer_offset = 20, + .oid_buffer = { (uint8_t) (NDIS_PACKET_TYPE_DIRECTED | NDIS_PACKET_TYPE_MULTICAST | NDIS_PACKET_TYPE_BROADCAST), 0, 0, 0} +}; + tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) { tusb_error_t error; @@ -142,16 +175,7 @@ tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) OSAL_SUBTASK_BEGIN //------------- Message Initialize -------------// - *((rndis_msg_initialize_t*) msg_payload) = (rndis_msg_initialize_t) - { - .type = RNDIS_MSG_INITIALIZE, - .length = sizeof(rndis_msg_initialize_t), - .request_id = 1, // TODO should use some magic number - .major_version = 1, - .minor_version = 0, - .max_xfer_size = 0x4000 // TODO mimic windows - }; - + memcpy(msg_payload, &msg_init, sizeof(rndis_msg_initialize_t)); OSAL_SUBTASK_INVOKED_AND_WAIT( send_message_get_response_subtask( dev_addr, p_cdc, msg_payload, sizeof(rndis_msg_initialize_t), @@ -160,25 +184,14 @@ tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) ); if ( TUSB_ERROR_NONE != error ) SUBTASK_EXIT(error); + // TODO currently not support multiple data packets per xfer rndis_msg_initialize_cmplt_t * const p_init_cmpt = (rndis_msg_initialize_cmplt_t *) msg_payload; - - - // TODO currently not support multiple data packets per xfer SUBTASK_ASSERT(p_init_cmpt->type == RNDIS_MSG_INITIALIZE_CMPLT && p_init_cmpt->status == RNDIS_STATUS_SUCCESS && p_init_cmpt->max_packet_per_xfer == 1 && p_init_cmpt->max_xfer_size <= RNDIS_MSG_PAYLOAD_MAX); rndish_data[dev_addr-1].max_xfer_size = p_init_cmpt->max_xfer_size; //------------- Message Query 802.3 Permanent Address -------------// - *((rndis_msg_query_t*) msg_payload) = (rndis_msg_query_t) - { - .type = RNDIS_MSG_QUERY, - .length = sizeof(rndis_msg_query_t) + 6, // size message and MAC address - .request_id = 1, // TODO should use some magic number - .oid = OID_802_3_PERMANENT_ADDRESS, - .buffer_length = 6, // sizeof MAC address - .buffer_offset = 20, // offset(rndis_msg_query_t, oid_buffer) - offset(rndis_msg_query_t, request_id) - }; - memclr_( ((rndis_msg_query_t*) msg_payload)->oid_buffer, 6); + memcpy(msg_payload, &msg_query_permanent_addr, sizeof(rndis_msg_query_t) + 6); // 6 bytes for MAC address OSAL_SUBTASK_INVOKED_AND_WAIT( send_message_get_response_subtask( dev_addr, p_cdc, @@ -192,6 +205,22 @@ tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) SUBTASK_ASSERT(p_query_cmpt->type == RNDIS_MSG_QUERY_CMPLT && p_query_cmpt->status == RNDIS_STATUS_SUCCESS); memcpy(rndish_data[dev_addr-1].mac_address, msg_payload + 8 + p_query_cmpt->buffer_offset, 6); + //------------- Set OID_GEN_CURRENT_PACKET_FILTER to (DIRECTED | MULTICAST | BROADCAST) -------------// + memcpy(msg_payload, &msg_set_packet_filter, sizeof(rndis_msg_set_t) + 4); // 4 bytes for filter flags + + OSAL_SUBTASK_INVOKED_AND_WAIT( + send_message_get_response_subtask( dev_addr, p_cdc, + msg_payload, sizeof(rndis_msg_set_t) + 4, + msg_payload), + error + ); + if ( TUSB_ERROR_NONE != error ) SUBTASK_EXIT(error); + + rndis_msg_set_cmplt_t * const p_set_cmpt = (rndis_msg_set_cmplt_t *) msg_payload; + SUBTASK_ASSERT(p_set_cmpt->type == RNDIS_MSG_SET_CMPLT && p_set_cmpt->status == RNDIS_STATUS_SUCCESS); + + + // if ( tusbh_cdc_rndis_mounted_cb ) { tusbh_cdc_rndis_mounted_cb(dev_addr); @@ -211,27 +240,6 @@ void rndish_xfer_isr(cdch_data_t *p_cdc, pipe_handle_t pipe_hdl, tusb_event_t ev //--------------------------------------------------------------------+ // INTERNAL & HELPER //--------------------------------------------------------------------+ -//static tusb_error_t send_process_msg_initialize_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) -//{ -// tusb_error_t error; -// -// OSAL_SUBTASK_BEGIN -// -// *((rndis_msg_initialize_t*) msg_payload) = (rndis_msg_initialize_t) -// { -// .type = RNDIS_MSG_INITIALIZE, -// .length = sizeof(rndis_msg_initialize_t), -// .request_id = 1, // TODO should use some magic number -// .major_version = 1, -// .minor_version = 0, -// .max_xfer_size = 0x4000 // TODO mimic windows -// }; -// -// -// -// OSAL_SUBTASK_END -//} - static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_data_t *p_cdc, uint8_t * p_mess, uint32_t mess_length, uint8_t *p_response) @@ -267,4 +275,24 @@ static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_da OSAL_SUBTASK_END } +//static tusb_error_t send_process_msg_initialize_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) +//{ +// tusb_error_t error; +// +// OSAL_SUBTASK_BEGIN +// +// *((rndis_msg_initialize_t*) msg_payload) = (rndis_msg_initialize_t) +// { +// .type = RNDIS_MSG_INITIALIZE, +// .length = sizeof(rndis_msg_initialize_t), +// .request_id = 1, // TODO should use some magic number +// .major_version = 1, +// .minor_version = 0, +// .max_xfer_size = 0x4000 // TODO mimic windows +// }; +// +// +// +// OSAL_SUBTASK_END +//} #endif |
