From 9d13a68fd139a3a9e9b818ebc4644cf726a9c8a9 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 6 Mar 2016 18:14:02 +0000 Subject: [PATCH] AC reads capwap local ip address element. FossilOrigin-Name: e45588aa4449d1e321ed4e71236f2a21dab2fcfd7ebcd10b0a6cef3bf9645702 --- src/cw/Makefile | 2 + src/cw/capwap.h | 4 +- src/cw/cw.h | 7 ++++ src/cw/cw_in_capwap_control_ip_address.c | 26 ++++++++++-- src/cw/cw_in_capwap_local_ipv4_address.c | 26 ++++++++++++ src/cw/cw_in_capwap_local_ipv6_address.c | 25 ++++++++++++ src/cw/cw_readelem_capwap_local_ip_addr.c | 49 ----------------------- src/cw/mbag.h | 21 ++++++++++ src/cw/mbag_type_sockaddr.c | 30 +------------- src/mod/capwap/capwap_actions_ac.c | 28 +++++++++++++ 10 files changed, 135 insertions(+), 83 deletions(-) create mode 100644 src/cw/cw_in_capwap_local_ipv4_address.c create mode 100644 src/cw/cw_in_capwap_local_ipv6_address.c delete mode 100644 src/cw/cw_readelem_capwap_local_ip_addr.c diff --git a/src/cw/Makefile b/src/cw/Makefile index 5ecdd084..20c55b63 100644 --- a/src/cw/Makefile +++ b/src/cw/Makefile @@ -151,6 +151,8 @@ CAPWAPOBJS= \ cw_out_capwap_local_ip_address.o\ cw_out_capwap_control_ip_addr_list.o \ cw_in_capwap_control_ip_address.o\ + cw_in_capwap_local_ipv4_address.o \ + cw_in_capwap_local_ipv6_address.o \ cw_in_radio_administrative_state.o \ cw_in_radio_administrative_state_wtp.o \ strheap.o \ diff --git a/src/cw/capwap.h b/src/cw/capwap.h index 90952cd9..dbebcb0b 100644 --- a/src/cw/capwap.h +++ b/src/cw/capwap.h @@ -588,8 +588,8 @@ extern void cw_read_image_data_request(struct cwimage_data *, uint8_t * msg, int //extern int cw_readelem_ac_descriptor(struct ac_info *acinfo, int type, uint8_t * msgelem, // int len); -extern int cw_readelem_capwap_local_ip_addr(struct sockaddr *local_ip, int type, - uint8_t * msgelem, int len); +//extern int cw_readelem_capwap_local_ip_addr(struct sockaddr *local_ip, int type, +// uint8_t * msgelem, int len); diff --git a/src/cw/cw.h b/src/cw/cw.h index 9c3be057..09c06c15 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -99,6 +99,13 @@ extern int cw_in_vendor_specific_payload(struct conn *conn, struct cw_action_in extern int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from); + +extern int cw_in_capwap_local_ipv4_address(struct conn *conn, struct cw_action_in *a, + uint8_t * data, int len,struct sockaddr *from); + +extern int cw_in_capwap_local_ipv6_address(struct conn *conn, struct cw_action_in *a, + uint8_t * data, int len,struct sockaddr *from); + /** * @} */ diff --git a/src/cw/cw_in_capwap_control_ip_address.c b/src/cw/cw_in_capwap_control_ip_address.c index 4add5a0f..f9f5db57 100644 --- a/src/cw/cw_in_capwap_control_ip_address.c +++ b/src/cw/cw_in_capwap_control_ip_address.c @@ -1,4 +1,25 @@ +/* + This file is part of actube. + actube is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +/** + * @file + * @brief Implements cw_in_capwap_control_ip_address + */ #include #include @@ -57,11 +78,8 @@ int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a, } - - - cw_aciplist_replace(list,acip); - return 1; } + diff --git a/src/cw/cw_in_capwap_local_ipv4_address.c b/src/cw/cw_in_capwap_local_ipv4_address.c new file mode 100644 index 00000000..024de215 --- /dev/null +++ b/src/cw/cw_in_capwap_local_ipv4_address.c @@ -0,0 +1,26 @@ + +#include +#include +#include +#include + + +#include "cw.h" +#include "capwap_items.h" +#include "mbag.h" + + +int cw_in_capwap_local_ipv4_address(struct conn *conn, struct cw_action_in *a, + uint8_t * data, int len,struct sockaddr *from) +{ + struct sockaddr_in addr; + memcpy(&addr.sin_addr,data,4); + addr.sin_family=AF_INET; + + mbag_set_sockaddr(conn->incomming,CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS,(struct sockaddr*)&addr); + + + return 1; +} + + diff --git a/src/cw/cw_in_capwap_local_ipv6_address.c b/src/cw/cw_in_capwap_local_ipv6_address.c new file mode 100644 index 00000000..284302a7 --- /dev/null +++ b/src/cw/cw_in_capwap_local_ipv6_address.c @@ -0,0 +1,25 @@ + +#include + +#include +#include +#include + +#include "cw.h" +#include "capwap_items.h" +#include "mbag.h" + +int cw_in_capwap_local_ipv6_address(struct conn *conn, struct cw_action_in *a, + uint8_t * data, int len,struct sockaddr *from) +{ + struct sockaddr_in6 addr; + memcpy(&addr.sin6_addr,data,4); + addr.sin6_family=AF_INET6; + + mbag_set_sockaddr(conn->incomming,CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS,(struct sockaddr*)&addr); + + + return 1; +} + + diff --git a/src/cw/cw_readelem_capwap_local_ip_addr.c b/src/cw/cw_readelem_capwap_local_ip_addr.c deleted file mode 100644 index 7a703d8e..00000000 --- a/src/cw/cw_readelem_capwap_local_ip_addr.c +++ /dev/null @@ -1,49 +0,0 @@ -#include - -#include -#include -#include -#include "capwap.h" - -int cw_readelem_capwap_local_ip_addr(struct sockaddr * local_ip, int type, uint8_t * msgelem, int len) -{ - switch (type){ - case CW_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS: - case CW_ELEM_WTP_IPV4_IP_ADDRESS: - { - if (len!=4) - return -1; - struct sockaddr_in * sain = (struct sockaddr_in*)local_ip; - memset(sain,0,sizeof(struct sockaddr_in)); - #ifdef HAVE_SIN_LEN - sain->sa_len=sizeof(struct sockaddr_in); - #endif - memcpy(&sain->sin_addr,msgelem,len); - sain->sin_family=AF_INET; - return 1; - } -#ifdef WITH_IPV6 - case CW_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS: - case CW_ELEM_WTP_IPV6_IP_ADDRESS: - { - if (len!=16) - return -1; - - struct sockaddr_in6 * sain = (struct sockaddr_in6*)local_ip; - memset(sain,0,sizeof(struct sockaddr_in6)); - #ifdef HAVE_SIN6_LEN - sain->sa_len=sizeof(struct sockaddr_in); - #endif - memcpy(&sain->sin6_addr,msgelem,len); - sain->sin6_family=AF_INET6; - - - return 1; - } - -#endif - } - return 0; -} - - diff --git a/src/cw/mbag.h b/src/cw/mbag.h index e7fc3e6e..6d6e4187 100644 --- a/src/cw/mbag.h +++ b/src/cw/mbag.h @@ -29,6 +29,7 @@ #include #include "mavl.h" #include "bstr.h" +#include "sock.h" struct mbag_item; @@ -109,6 +110,7 @@ extern const struct mbag_typedef mbag_type_str; extern const struct mbag_typedef mbag_type_avltree; extern const struct mbag_typedef mbag_type_const_data; extern const struct mbag_typedef mbag_type_mbag_dyn; +extern const struct mbag_typedef mbag_type_sockaddr; /** *@defgroup MbagTypes MBAG Types @@ -127,6 +129,7 @@ extern const struct mbag_typedef mbag_type_mbag_dyn; #define MBAG_AVLTREE (&mbag_type_avltree) #define MBAG_FUN MBAG_STR #define MBAG_CONST_DATA (&mbag_type_const_data) +#define MBAG_SOCKADDR (&mbag_type_sockaddr) /**@}*/ extern mbag_t mbag_create(); @@ -497,6 +500,24 @@ static inline int mbag_set_str(mbag_t s, const char *id, const char *str) } +static inline int mbag_set_sockaddr(mbag_t s, const char *id, const struct sockaddr * sa) +{ + struct mbag_item *i = mbag_item_create(s, id); + if (!i) + return 0; + struct sockaddr_storage * sad = malloc(sizeof(struct sockaddr_storage)); + if (!sad){ + free(i); + return 0; + } + sock_copyaddr(sad,sa); + i->type = MBAG_SOCKADDR; + i->data = sad; + return 1; + +} + + struct mbag_item_fundef { void *(*get) (void *arg); diff --git a/src/cw/mbag_type_sockaddr.c b/src/cw/mbag_type_sockaddr.c index aa4eadda..786b5d55 100644 --- a/src/cw/mbag_type_sockaddr.c +++ b/src/cw/mbag_type_sockaddr.c @@ -18,44 +18,18 @@ /** * @file - * @brief Implementation of mbag_type_word + * @brief Implementation of mbag_type_sockaddr * @addtogroup MbagFunctions * @{ */ -#include -#include -#include -#include - - #include "mbag.h" -#include "format.h" - -/* -static struct mbag_item * from_str(const char *src) -{ - struct mbag_item *i= malloc(sizeof(struct sockaddr_storage)); - if (!i) - return NULL; - - i->type = MBAG_WORD; - i->word=atoi(src); - return i; -} - -static int to_str(void *item,char *dst) -{ - mbag_item_t *i= item; - return sprintf(dst, "%d", i->word); -} -*/ /** * MBAG items of this type hold an struct sockaddr element. */ const struct mbag_typedef mbag_type_sockaddr = { - "WORD",free, + "SocakAddr",free, }; diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c index 5aa0c615..ca7b3aca 100644 --- a/src/mod/capwap/capwap_actions_ac.c +++ b/src/mod/capwap/capwap_actions_ac.c @@ -24,6 +24,7 @@ #include "cw/strheap.h" #include "cw/radio.h" + #include "mod_capwap.h" static cw_action_in_t actions_in[] = { @@ -209,6 +210,33 @@ static cw_action_in_t actions_in[] = { } , + /* Local IPv4 Address - Join Request */ + { + .capwap_state = CW_STATE_JOIN, + .msg_id = CW_MSG_JOIN_REQUEST, + .elem_id = CW_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS, + .item_id = CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS, + .start = cw_in_capwap_local_ipv4_address, + .mand = 1, + .min_len = 4, + .max_len = 4 + } + , + + /* Local IPv6 Address - Join Request */ + { + .capwap_state = CW_STATE_JOIN, + .msg_id = CW_MSG_JOIN_REQUEST, + .elem_id = CW_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS, + .item_id = CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS, + .start = cw_in_capwap_local_ipv4_address, + .mand = 1, + .min_len = 16, + .max_len = 16 + } + , + + /* Vendor Specific Payload - Join Request*/