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); }
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; } }