⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dot1xauthenticatorlib.c

📁 dot1x认证源码,包括dot1x数据包的收发,认证的配置,MIB的设计等
💻 C
📖 第 1 页 / 共 2 页
字号:
		case dot1xMsg_Req_Notify:
			pEap_Hdr->code = EAP_Request;
			pEap_Hdr->id = identify;
			pEap_Hdr->len = EAP_TYPE_HEADER_LEN + msgLen;
			pEap_Hdr->type = EAP_Type_Notify;
			pEapol_Hdr->len = pEap_Hdr->len;
			memcpy((void *)((char *)pEap_Hdr+EAP_TYPE_HEADER_LEN), (void *)msgBody, msgLen);
			buflen = EAPOL_HEADER_LEN + pEap_Hdr->len;
			break;

		case dot1xMsg_Req_Adver:
			pEap_Hdr->code = EAP_Request;
			pEap_Hdr->id = identify;
			pEap_Hdr->len = EAP_TYPE_HEADER_LEN + msgLen;
			pEap_Hdr->type = EAP_Type_ADV;
			pEapol_Hdr->len = pEap_Hdr->len;
			memcpy((void *)((char *)pEap_Hdr+EAP_TYPE_HEADER_LEN), (void *)msgBody, msgLen);
			buflen = EAPOL_HEADER_LEN + pEap_Hdr->len;
			break;

		case dot1xMsg_Req_PAP:
			pEap_Hdr->code = EAP_Request;
			pEap_Hdr->id = identify;
			pEap_Hdr->len = EAP_TYPE_HEADER_LEN;
			pEap_Hdr->type = EAP_Type_PAP;
			pEapol_Hdr->len = EAP_TYPE_HEADER_LEN;
			buflen = EAPOL_HEADER_LEN + pEap_Hdr->len;
			break;

		case dot1xMsg_Req_LCBAP:
			pEap_Hdr->code = EAP_Request;
			pEap_Hdr->id = identify;
			pEap_Hdr->len = EAP_TYPE_HEADER_LEN + msgLen;
			pEap_Hdr->type = EAP_Type_LCBAP;
			pEapol_Hdr->len = pEap_Hdr->len;
			memcpy((void *)((char *)pEap_Hdr+EAP_TYPE_HEADER_LEN), (void *)msgBody, msgLen);
			buflen = EAPOL_HEADER_LEN + pEap_Hdr->len;
			break;

		case dot1xMsg_Req_MD5:
			pEapMD5_Hdr = (struct Eap_Type_Header *)msgBody;
			pEapol_Hdr->len = pEapMD5_Hdr->len;
			memcpy((void *)pEap_Hdr, pEapMD5_Hdr, pEapol_Hdr->len);
			buflen = EAPOL_HEADER_LEN + pEap_Hdr->len;
			break;
			
	}

	pEap_Hdr->len = htons(pEap_Hdr->len);
	pEapol_Hdr->len = htons(pEapol_Hdr->len);

	pMblk = netTupleGet(pNetPool, DEFAULT_PACKET_LEN, M_DONTWAIT, MT_DATA, TRUE);
	if ( pMblk == NULL )
	{
		Dot1x_logMsgSend(DOT1X_MODULE, SYSLOG_SEVERITY_EMERG, "dot1xSend", "netTupleGet failed!!");
		return -1;
	}

	p = pMblk->m_data;

	memcpy ((void *)p, (const void *)dot1xBuf, buflen);
	p += buflen;

	/* Adjust the the length to the real size. */
	pMblk->mBlkHdr.mLen 	= p - (uchar_t *)pMblk->m_data;
	pMblk->mBlkPktHdr.len	= p - (uchar_t *)pMblk->m_data;

	Spare = vlan | (port << 16);
		
	if (muxTkSend(pdot1xCookie,
		pMblk,
		(char *)mac,
		htons(PAE_Ether_Type),
		(void *)Spare ) == ERROR)
	{
		Dot1x_logMsgSend(DOT1X_MODULE, SYSLOG_SEVERITY_CRIT, "dot1xSend", "muxTKSend failed!!");
	}

	return 0;
	
}

int dot1xTestSend(int type)
{
	uchar_t dstMac[7] = {0x00, 0x50, 0xba, 0x27, 0x76, 0x06, 0};
	uchar_t identify = 0xaa;
	uchar_t msgBody[DEFAULT_PACKET_LEN] = {0};
	int msgLen = DEFAULT_PACKET_LEN;
	u_long msgType;
	struct Eap_Type_Header *pEapMD5_Hdr = NULL;
	uchar_t md5Pass[23] = "\x10\xAB\x33\x73\xA2\x02\x67\xD9\x8D\x37\x3E\x65\xC9\xEA\x33\xE4\xCD\x76\x6C\x61\x6E\x31\x31";
	uchar_t notifyMsg[] = "O what a circus! Oh what a show\n"
						"Argentina has gone to town\n"
						"Over the death of an actress called Eva Peron\n"
						"We've all gone crazy\n"
						"Mourning all day and mourning all night\n"
						"Falling over ourselves to get all of the misery right\n";
	
	switch ( type )
	{
	case 1: /* success */
		msgType = dot1xMsg_Success;
		break;

	case 2: /* failure */
		msgType = dot1xMsg_Failure;
		break;

	case 3: /* request-id */
		msgType = dot1xMsg_Req_Id;
		break;

	case 4: /* PAP */
		msgType = dot1xMsg_Req_PAP;
		break;

	case 5:	/* LCBAP */
		msgType = dot1xMsg_Req_LCBAP;
		msgLen = 16;
		memcpy(msgBody, "0123456789abcdef", msgLen);		
		break;

	case 6: /* EAP_MD5 */
		msgType = dot1xMsg_Req_MD5;
		pEapMD5_Hdr = (struct Eap_Type_Header *)msgBody;
		pEapMD5_Hdr->code = EAP_Request;
		pEapMD5_Hdr->id = identify;
		pEapMD5_Hdr->len = 23;
		pEapMD5_Hdr->type = EAP_Type_MD5;
		memcpy(&msgBody[5], md5Pass, 23);
		break;

	case 7:/* notification */
		msgType = dot1xMsg_Req_Notify;
		msgLen = strlen(notifyMsg);
		memcpy(&msgBody, notifyMsg, msgLen);
		break;

	case 8: /* advert */
		msgType = dot1xMsg_Req_Adver;
		msgLen = strlen(notifyMsg);
		memcpy(msgBody, notifyMsg, msgLen);
		break;
		
	default:
		printf("\n");
		printf("1     - success\n");
		printf("2     - failure\n");
		printf("3     - request id\n");
		printf("4     - request password (PAP)\n");
		printf("5     - request password (LCBAP)\n");
		printf("6     - request password (EAP_MD5)\n");
		printf("7     - notification\n");
		printf("8     - advertment\n");
		return OK;
	}

	return dot1xSend(dstMac, 1, 0, msgType, msgBody, msgLen, identify, 0x12345678);
}


int dot1xInit()
{
	END_OBJ * pEndObj;

	/*****************************************
	* init drv
	*/
	if ( muxTkDrvCheck( SW_DEVICE_NAME ) != 1 )
	{
		logMsg("Not an NPT Driver %s%d.\n",
			   (int)SW_DEVICE_NAME, SW_DEVICE_UNIT, 3, 4, 5, 6);
		goto err1;
	}
	
	pEndObj = endFindByName(SW_DEVICE_NAME, 0);
	if (!pEndObj)
	{
		perror("dot1xTestInit: endFindByname Failed");
		goto err1;
	}

	
	/***********************************
	* bind to sw
	*/
	pdot1xCookie = (void *) muxTkBind( SW_DEVICE_NAME, 0,
			dot1xRecv, dot1xShutdownRtn, dot1xTxRestartRtn, dot1xErrorRtn,
			PAE_Ether_Type, "dot1x802.1x", 
			pEndObj, (void *) 0, (void *) 0);
	
	if (!pdot1xCookie)
	{
		perror("dot1xTestInit: muxTkBind Failed");
		goto err2;
	}

	/******************************************
	* retrive mac address
	*/
	memset( PAE_SRC_MAC, 0, sizeof(PAE_SRC_MAC) );		
	muxIoctl( pdot1xCookie, EIOCGADDR, PAE_SRC_MAC );
	
	/*****************************************
	* init net pool
	*/
	if ((pNetPool = calloc(1, sizeof(NET_POOL))) == NULL)
	{
		perror("dot1xTestInit: Could not allocate NetPool structure");
		goto err3;
	}
	
	dot1xClDescTbl[0].clNum = 1000;	/* wanghn 20030414 change 4 to 1000 */
	dot1xMclConfig.mBlkNum  = dot1xClDescTbl[0].clNum;
	dot1xMclConfig.clBlkNum = dot1xClDescTbl[0].clNum;
	
	dot1xMclConfig.memSize = (dot1xMclConfig.mBlkNum * (MSIZE + sizeof(long))) +
		 (dot1xMclConfig.clBlkNum * (CL_BLK_SZ + sizeof(long)));
	
	dot1xMclConfig.memArea = (char *) memalign(sizeof(long), dot1xMclConfig.memSize);
	if (dot1xMclConfig.memArea == NULL)
	{
		goto err4;
	}
	
	dot1xClDescTbl[0].memSize = (dot1xClDescTbl[0].clNum * (DEFAULT_PACKET_LEN + 8)) + sizeof(int);
	
	dot1xClDescTbl[0].memArea = (char *) cacheDmaMalloc(dot1xClDescTbl[0].memSize);
	
	if ((int) dot1xClDescTbl[0].memArea == NULL)
	{
		perror("dot1xTestInit: Memory for buffers unavailable");
		goto err5;
	}
	
	if (netPoolInit(pNetPool, &dot1xMclConfig,
		&dot1xClDescTbl[0], dot1xClDescTblNumEnt, NULL) == ERROR)
	{
		perror("dot1xTestInit: Could not init buffers");
		goto err5;
	}

	return OK;		

	/**************************************
	* release net pool
	*/
	netPoolDelete( pNetPool );

err5:
	cfree( (char *)dot1xClDescTbl[0].memArea);
	dot1xClDescTbl[0].memArea = NULL;
	
err4:
	cfree( (char *)pNetPool);
	pNetPool = NULL;

	
err3:
	/**************************************
	* unbind from sw
	*/
	muxUnbind( pdot1xCookie, PAE_Ether_Type, dot1xRecv );
	pdot1xCookie = NULL;

err2:

err1:	

	return 0;
}









int dot1xTestAddr()
{
	Test_t msg;
	bzero((char *)&msg, sizeof(msg));

	msg.buf[0] = 'a';
	msg.buf[1] = 'b';
	msg.buf[2] = 'c';
	msg.buf[3] = 'd';

	msg.buf1[0] = '0';
	msg.buf1[1] = '1';
	msg.buf1[2] = '2';

	msg.buf2 = '3';
	#if 1
	{
		int i;	
		char *p;
		p = (char *)&msg;
		printf("\n\n TestAddr, message address is 0x%lx\nmessage is :", (u_long)&msg);
		for (i=0; i<sizeof(msg); i++)
		{
			if (!(i % 16)) printf("\n");
			printf("%02x ", p[i]);
		}
		printf("\n long is in %ld", ((u_long)&(msg.typelong)-(u_long)&msg));
		printf("\n short is in %ld \n", ((u_long)&(msg.typeshort)-(u_long)&msg));
	}
	#endif

	return (sizeof(msg));

}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -