int cwsend_configuration_status_request(struct conn * conn,struct radioinfo * radioinfo,struct wtpinfo * wtpinfo)
{
	uint8_t buffer[CWMSG_MAX_SIZE];
	struct cwmsg cwmsg;

	cwmsg_init(&cwmsg,buffer,CWMSG_DISCOVERY_REQUEST,conn_get_next_seqnum(conn),radioinfo);
	
	cwmsg_addelem(&cwmsg,CWMSGELEM_DISCOVERY_TYPE,&wtpinfo->discovery_type,sizeof(uint8_t));
	cwmsg_addelem_wtp_board_data(&cwmsg,wtpinfo);
	cwmsg_addelem_wtp_descriptor(&cwmsg,wtpinfo);
	cwmsg_addelem(&cwmsg,CWMSGELEM_WTP_FRAME_TUNNEL_MODE,&wtpinfo->frame_tunnel_mode,sizeof(uint8_t));
	cwmsg_addelem(&cwmsg,CWMSGELEM_WTP_MAC_TYPE,&wtpinfo->mac_type,sizeof(uint8_t));
	cwmsg_addelem_wtp_radio_infos(&cwmsg,wtpinfo);
	cwmsg_addelem_mtu_discovery_padding(&cwmsg,conn);

	return conn_send_cwmsg(conn,&cwmsg);
}
예제 #2
0
void cwsend_join_response(struct conn *conn, int seqnum, int rc, struct radioinfo *radioinfo,
			  struct ac_info *acinfo, struct wtpinfo *wtpinfo)
{
	struct cwmsg *cwmsg = &conn->resp_msg;
	cwmsg_init(cwmsg, conn->resp_buffer, CW_MSG_JOIN_RESPONSE, seqnum, NULL);
	cwmsg->capwap_mode = conn->capwap_mode;

	/* mandatory messagesg elements */
	cwmsg_addelem_result_code(cwmsg, rc);

	cwmsg_addelem_ac_descriptor(cwmsg, acinfo,wtpinfo);
	cwmsg_addelem(cwmsg, CW_ELEM_AC_NAME, acinfo->ac_name, strlen((char *) acinfo->ac_name));
	cwmsg_addelem(cwmsg, CWMSGELEM_ECN_SUPPORT, &acinfo->ecn_support, sizeof(uint8_t));
//	cwmsg_addelem_ctrl_ip_addrs(cwmsg, acinfo);
//      cwmsg_addelem_cw_local_ip_addr(cwmsg,conn);


	/* */
//      cwmsg_addelem_image_identifier(cwmsg,CW_VENDOR_ID_CISCO,(uint8_t*)"/tobias",strlen("/tobias"));


	uint8_t buffer[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	buffer[0] = 0;		/* Mwar Type */
	buffer[1] = 1;		/* h/w version */
	buffer[2] = 2;		/* h/w Release */
	buffer[3] = 0;		/* h/w Maint */
	buffer[4] = 3;		/* h/w Build */

	buffer[5] = 5;		/* s/w version */
	buffer[6] = 0;		/* s/w Release */
	buffer[7] = 19;		/* s/w Maint */
	buffer[8] = 2;		/* s/w Build */

	*((uint16_t *) (buffer + 9)) = htons(13);	/* Active MS */
	*((uint16_t *) (buffer + 9 + 2)) = htons(23);	/* Supported MS */
	*((uint16_t *) (buffer + 9 + 4)) = htons(5);	/* Active RAD's */
	*((uint16_t *) (buffer + 9 + 6)) = htons(15);	/* Supported RAD's */
//      cwmsg_addelem_vendor_specific_payload(cwmsg,CW_VENDOR_ID_CISCO, CWVENDOR_CISCO_MWAR, buffer,34);


	conn_send_response(conn, cwmsg, seqnum);

}
void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn)
{
        struct sockaddr_storage a;
        socklen_t alen = sizeof(struct sockaddr_storage);
	getsockname (conn->sock,(struct sockaddr *)&a,&alen);

	switch (((struct sockaddr*)&a)->sa_family){
		case AF_INET:
		{
			struct sockaddr_in  * sain = (struct sockaddr_in*)&a;
			cwmsg_addelem(msg,CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS,(uint8_t*)&sain->sin_addr,4);
		}
			break;
#ifdef WITH_IPV6				
		case AF_INET6:
		{
			struct sockaddr_in6  * sain = (struct sockaddr_in6*)&a;
			cwmsg_addelem(msg,CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS,(uint8_t*)&sain->sin6_addr,16);
		}
		break;
#endif				
		}
}
void  cw_addelem_capwap_local_ip_addr(struct cwmsg *msg, int sock, int cw_mode)
{
        struct sockaddr_storage a;
        socklen_t alen = sizeof(struct sockaddr_storage);
	getsockname (sock,(struct sockaddr *)&a,&alen);

	int cw_mode = cwmsg->capwap_mode;

	switch (((struct sockaddr*)&a)->sa_family){
		case AF_INET:
		{
			struct sockaddr_in  * sain = (struct sockaddr_in*)&a;
			int id;
			if (cw_mode == CWMODE_CISCO)
				id = CWMSGELEM_WTP_IPV4_IP_ADDR; 
			else
				id = CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS;
			
			cwmsg_addelem(msg,id,(uint8_t*)&sain->sin_addr,4);
			break;
		}


		case AF_INET6:
		{
			int id;
			if (cw_mode == CWMODE_CISCO)
				id = CWMSGELEM_WTP_IPV6_IP_ADDR; 
			else
				id = CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS;
			struct sockaddr_in6  * sain = (struct sockaddr_in6*)&a;
			return cwmsg_addelem(msg,id,(uint8_t*)&sain->sin6_addr,16);
		}
		break;
	}

}