diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 012315e21..a2a162c5e 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -70,11 +70,6 @@ #define BD_NAME_LEN 248 #define BD_MAX_INQUIRY_DEVS 255 -enum pair_mode { - PAIR_MODE_NORMAL, - PAIR_MODE_TEMPORARY -}; - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -155,12 +150,14 @@ s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb); s32 BTE_ExitPeriodicInquiry(void); s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key); s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr); +s32 BTE_PinCodeRequestReply(struct bd_addr *bdaddr,u8 pinlen,u8 *pincode); void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason); void BTE_SetHostSyncButtonCallback(void (*callback)(u32 held)); void BTE_SetConnectionRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *cod,u8 link_type)); void BTE_SetLinkKeyRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr)); void BTE_SetLinkKeyNotificationCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *key)); -u8 BTE_GetPairMode(void); +void BTE_SetPinCodeRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr)); +s32 BTE_GetLocalAddress(struct bd_addr *bdaddr); s32 BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key); s32 BTE_ClearStoredLinkKeys(void); s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr); diff --git a/lwbt/bte.c b/lwbt/bte.c index a9bd83ca1..2732b103a 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -42,8 +42,6 @@ struct bt_state u8_t num_maxdevs; - u8_t pair_mode; - struct bte_inquiry_res inq_res; btecallback cb; @@ -89,7 +87,6 @@ static u8_t bte_patch1[92] = { static u8 ppc_stack[STACKSIZE] ATTRIBUTE_ALIGN(8); err_t acl_wlp_completed(void *arg,struct bd_addr *bdaddr); -err_t pin_req(void *arg,struct bd_addr *bdaddr); err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t status); err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err); err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr); @@ -392,7 +389,6 @@ void BTE_Init(void) hci_connection_complete(acl_conn_complete); hci_auth_complete(acl_auth_complete); hci_remote_name_req_complete(bte_read_remote_name_complete); - hci_pin_req(pin_req); _CPU_ISR_Restore(level); tb.tv_sec = 1; @@ -584,11 +580,6 @@ s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr) return last_err; } -u8 BTE_GetPairMode(void) -{ - return btstate.pair_mode; -} - void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason) { return l2cap_disconnect_bb(callback); @@ -684,6 +675,47 @@ s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr) return last_err; } +void BTE_SetPinCodeRequestCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr)) +{ + u32 level; + + _CPU_ISR_Disable(level); + hci_pin_req(callback); + _CPU_ISR_Restore(level); +} + +s32 BTE_GetLocalAddress(struct bd_addr *bdaddr) +{ + u32 level; + err_t last_err = ERR_OK; + + LOG("BTE_GetLocalAddress\n"); + + _CPU_ISR_Disable(level); + hci_get_bd_addr(bdaddr); + _CPU_ISR_Restore(level); + + return last_err; +} + +s32 BTE_PinCodeRequestReply(struct bd_addr *bdaddr,u8 pinlen,u8 *pincode) +{ + u32 level; + err_t last_err = ERR_OK; + + LOG("BTE_PinCodeRequestReply\n"); + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_pin_code_request_reply(bdaddr, pinlen, pincode); + _CPU_ISR_Restore(level); + + return last_err; +} + struct bte_pcb* bte_new(void) { struct bte_pcb *pcb; @@ -713,7 +745,6 @@ s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb) _CPU_ISR_Disable(level); if(btstate.inq_res.count==0 || flush==1) { btstate.inq_complete_cb = cb; - btstate.pair_mode = PAIR_MODE_NORMAL; btstate.num_maxdevs = max_cnt; hci_arg(&btstate); // Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes @@ -724,6 +755,21 @@ s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb) return ERR_OK; } +s32 BTE_InquiryEx(u8 max_cnt,u8 flush,btecallback cb,u32 lap) +{ + u32 level; + + _CPU_ISR_Disable(level); + if(btstate.inq_res.count==0 || flush==1) { + btstate.inq_complete_cb = cb; + btstate.num_maxdevs = max_cnt; + hci_arg(&btstate); + hci_inquiry(lap,0x03,max_cnt,bte_inquiry_complete); + } + _CPU_ISR_Restore(level); + return ERR_OK; +} + s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb) { u32 level; @@ -731,7 +777,6 @@ s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb) _CPU_ISR_Disable(level); if(btstate.inq_res.count==0 || flush==1) { btstate.inq_complete_cb = cb; - btstate.pair_mode = PAIR_MODE_TEMPORARY; btstate.num_maxdevs = max_cnt; hci_arg(&btstate); // Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes @@ -742,12 +787,26 @@ s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb) return ERR_OK; } +s32 BTE_PeriodicInquiryEx(u8 max_cnt,u8 flush,btecallback cb, u32 lap) +{ + u32 level; + + _CPU_ISR_Disable(level); + if(btstate.inq_res.count==0 || flush==1) { + btstate.inq_complete_cb = cb; + btstate.num_maxdevs = max_cnt; + hci_arg(&btstate); + hci_periodic_inquiry(lap,0x04,0x05,0x03,max_cnt,bte_inquiry_complete); + } + _CPU_ISR_Restore(level); + return ERR_OK; +} + s32 BTE_ExitPeriodicInquiry(void) { u32 level; _CPU_ISR_Disable(level); - btstate.pair_mode = PAIR_MODE_NORMAL; hci_exit_periodic_inquiry(); _CPU_ISR_Restore(level); return ERR_OK; @@ -1046,25 +1105,6 @@ err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr) return ERR_OK; } -err_t pin_req(void *arg,struct bd_addr *bdaddr) -{ - struct bd_addr addr; - LOG("pin_req\n"); - - if (btstate.pair_mode == PAIR_MODE_NORMAL) - { - // Pairing from sync button (permanent) - hci_get_bd_addr(&addr); - } - else - { - // Pairing from 1+2 (guest/temporary) - bd_addr_set(&addr, bdaddr); - } - hci_pin_code_request_reply(bdaddr, sizeof(addr.addr), addr.addr); - return ERR_OK; -} - err_t l2cap_disconnected_ind(void *arg, struct l2cap_pcb *pcb, err_t err) { struct bte_pcb *bte = (struct bte_pcb*)arg; @@ -1220,8 +1260,7 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire state->hci_cmddone = 1; state->inq_complete_cb(ERR_OK,&state->inq_res); _CPU_ISR_Restore(level); - } else if (state->pair_mode == PAIR_MODE_NORMAL) - hci_inquiry(0x009E8B00,0x03,btstate.num_maxdevs,bte_inquiry_complete); + } } return ERR_OK; } diff --git a/lwbt/hci.c b/lwbt/hci.c index fbe8c2e4c..9385d0c0d 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1581,8 +1581,7 @@ u16_t lp_pdu_maxsize(void) /*-----------------------------------------------------------------------------------*/ /* hci_get_bd_addr(): * - * Called by L2CAP to check the maxsize of the PDU. In this case it is the largest - * ACL packet that the Host Controller can buffer. + * Called by the host to get its own local Bluetooth address. */ /*-----------------------------------------------------------------------------------*/ void hci_get_bd_addr(struct bd_addr *bdaddr) diff --git a/lwbt/l2cap.c b/lwbt/l2cap.c index b26a6c528..69f9311b9 100644 --- a/lwbt/l2cap.c +++ b/lwbt/l2cap.c @@ -293,6 +293,10 @@ void l2cap_process_sig(struct pbuf *q, struct l2cap_hdr *l2caphdr, struct bd_add switch(sighdr->code) { case L2CAP_CMD_REJ: + if(pcb == NULL) { + /* A rejection without a matching PCB is silently discarded */ + break; + } /* Remove signal from unresponded list and deallocate it */ L2CAP_SIG_RMV(&(pcb->unrsp_sigs), sig); btpbuf_free(sig->p); @@ -701,7 +705,7 @@ void l2cap_process_sig(struct pbuf *q, struct l2cap_hdr *l2caphdr, struct bd_add /* Give upper layer indication */ pcb->state = L2CAP_CLOSED; LOG("l2cap_process_sig: Disconnection request\n"); - L2CA_ACTION_DISCONN_IND(pcb,ERR_OK,ret); + L2CA_ACTION_DISCONN_IND(pcb,ERR_OK,ret); } } break; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 7c4b37a38..9a25c3fd5 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -99,6 +99,7 @@ static conf_pads __wpad_devs = {0}; static conf_pad_guests __wpad_guests = {0}; static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED] = {0}; static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER] = {0}; +static bool __wpad_pair_guest_mode = FALSE; static sem_t __wpad_confsave_sem; static bool __wpad_confsave_thread_running = false; @@ -325,10 +326,8 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) wm = __wpad_assign_slot(wml, err); if (wm) { - guestEntry = GetGuestSlot(&wml->bdaddr); registeredEntry = GetRegisteredSlot(&wml->bdaddr); - - if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { + if(!__wpad_pair_guest_mode) { // Permanent pair, need to save bdaddr as known controller if(registeredEntry >= __wpad_devs.num_registered) { // If currently guest, we want to allow for upgrade to permanent pair @@ -340,18 +339,21 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); } - WIIUSE_DEBUG("Registering Wiimote '%s' with system...", wml->name); + WIIUSE_INFO("Registering Wiimote '%s' with system...", wml->name); memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) __wpad_devs.num_registered++; LWP_SemPost(__wpad_confsave_sem); + } else { + WIIUSE_INFO("Registered pad '%s' found in slot %d", wml->name, registeredEntry); } } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller + guestEntry = GetGuestSlot(&wml->bdaddr); if(guestEntry >= CONF_PAD_MAX_ACTIVE) { - WIIUSE_DEBUG("Saving Wiimote '%s' as guest...", wml->name); + WIIUSE_INFO("Saving Wiimote '%s' as guest...", wml->name); memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_ACTIVE-1)); BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); @@ -885,13 +887,13 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) { slot = GetActiveSlot(&info->bdaddr); if (slot < CONF_PAD_MAX_ACTIVE) { - WIIUSE_DEBUG("Wiimote already active in slot %d", slot); + WIIUSE_INFO("Wiimote already active in slot %d", slot); } else { // Not active, try to make active slot = WPAD_MAX_DEVICES; for(i=0; ibdaddr,&bdaddr)) { - WIIUSE_DEBUG("Balance Board already registered"); + WIIUSE_INFO("Balance Board already registered"); slot = WPAD_BALANCE_BOARD; } // Not active, try to make active if(slot != WPAD_BALANCE_BOARD) { if(!(__wpads_used & (1<= WPAD_MAX_DEVICES) { @@ -997,13 +999,13 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.registered[i].bdaddr); if(bd_addr_cmp(pad_addr,&bdaddr)) { name = (const u8 *)__wpad_devs.registered[i].name; - WIIUSE_DEBUG("Registered pad '%s' found in slot %d", name, i); + WIIUSE_INFO("Registered pad '%s' found in slot %d", name, i); // Not active, try to make active if(!strncmp("Nintendo RVL-CNT-", __wpad_devs.registered[i].name, 17)) { for(j=0; j