ツナワタリ

心臓に悪いです。
昨日出てた Android の make における openssl な不具合ですが、clean してリコンパイルしたら発現しませんでした。一体何だったんだろうか。

無線 AP との接続

AP が悪いのか端末側が悪いのかも不明。armadillo だけでなく、HT-03A も接続が微妙。
現状のカーネルバッファなログは以下な模様。ちなみにターゲットな AP に接続はしているらしく、IP を取得中、なメセジが設定画面に表示されている状態。というかそのまま固まっているようにも見えます。

RTMPSoftDecryptCCMP : The key is not available !
ERROR : SW decrypt AES data fails.
====>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1471

上記メセジを出力する部分を確認。とりあえず RTMPSoftDecryptionAction という手続きが呼び出されている模様。ソースファイルは common/cmm_wpa.c になります。

NDIS_STATUS	RTMPSoftDecryptionAction(
		IN PRTMP_ADAPTER pAd,
		IN PUCHAR pHdr,
		IN UCHAR UserPriority,
		IN PCIPHER_KEY pKey,
		INOUT PUCHAR pData,
		INOUT UINT16 *DataByteCnt)
{		
    switch (pKey->CipherAlg)
    {    	        	        

switch で分岐してるんですが、以下なブロックを通過している様子。

        case CIPHER_AES:
        /* handle AES decryption */
            if (RTMPSoftDecryptCCMP(pAd, pHdr, pKey, pData, &(*DataByteCnt)) == FALSE)
            {
                DBGPRINT(RT_DEBUG_ERROR, ("ERROR : SW decrypt AES data fails.\n"));
                // give up this frame
                return NDIS_STATUS_FAILURE; 
            }
            break;

if の分岐に入っていると思われます。RTMPSoftDecryptCCMP 手続きは common/cmm_aes.c に記述されております。

BOOLEAN RTMPSoftDecryptCCMP(
	IN 		PRTMP_ADAPTER 	pAd,
	IN 		PUCHAR			pHdr,
	IN 		PCIPHER_KEY		pKey,
	INOUT 	PUCHAR			pData,
	INOUT 	UINT16			*DataLen)
{
	UINT8			frame_type, frame_subtype;
	UINT8			from_ds, to_ds;
	UINT8 			a4_exists, qc_exists;
	UINT8			aad_hdr[30];
	UINT			aad_len = 0;
	UINT8			pn[LEN_PN];	
	PUCHAR			cipherData_ptr;
	UINT32			cipherData_len;
	UINT8			nonce_hdr[13];	
	UINT32			nonce_hdr_len = 0;	
	UINT32			out_len = *DataLen;

#ifdef RT_BIG_ENDIAN
	RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE);
#endif

	/* Check the key is valid */
	if (pKey->KeyLen == 0)
	{
		DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is not available !\n", __FUNCTION__));
		return FALSE;
	}

いきなりメセジ出力して FALSE を戻しているのかorz
とりあえず呼び出し元を確認してみます。RTMPSoftEncryptionAction を呼び出しているのは sta/rtmp_data.c で定義されている STA_AMPDU_Frame_Tx という手続きな模様。そしてそれを呼び出しているのは STAHardTransmit という手続きになっている。
このあたり結構一直線ですな。STAHardTransmit 手続きは common/cmm_data.c にある RTMPDeQueuePacket になってます。grep してみたら流石にこの手続きは色々な所から呼び出されておりますな。

むむ

リバースで見てくのではなくて、全体的な動作を確認したいんですが、grep してみたら module_init は os/linux/usb_main_dev.c な模様。入口出口は以下か。

// Init driver module
INT __init rtusb_init(void)
{
	printk("rtusb init --->\n");   
	return usb_register(&rtusb_driver);
}

// Deinit driver module
VOID __exit rtusb_exit(void)
{
	usb_deregister(&rtusb_driver);	
	printk("<--- rtusb exit\n");
}

module_init(rtusb_init);
module_exit(rtusb_exit);

で、rtusb_driver の定義が以下。

struct usb_driver rtusb_driver = {
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
	.owner = THIS_MODULE,
#endif	
	.name="rt2870",
	.probe=rtusb_probe,
	.disconnect=rtusb_disconnect,
	.id_table=rtusb_dev_id,

#ifdef CONFIG_PM
	suspend:	rt2870_suspend,
	resume:		rt2870_resume,
#endif
	};

probe に設定されてる手続きが事実上のエントリポイントになるのかな。

static void *rtusb_probe(struct usb_device *dev, UINT interface,
						const USB_DEVICE_ID *id)
{
	struct usb_interface *intf;
	RTMP_ADAPTER *pAd;
	int rv;


	/* get the active interface descriptor */
	intf = &dev->actconfig->interface[interface];

	// call generic probe procedure.	
	rv = rt2870_probe(intf, dev, id, &pAd);
	if (rv != 0)
		pAd = NULL;
	
	return (void *)pAd;
}

struct usb_driver 型の probe メンバの型が分からん。上記で本当に正しいのだろうか。

てーか

スリープ時に無線接続を切断しない設定を盛り込んだら無線 AP とのやりとりは正常な事が確認できていたりしてます。こちら方面掘削するよりは、wifi.c 確認した方が良いのかどうか。
それ以前に上の層の諸々について確認入れてフォローした方が良いんだろうな (を