diff --git a/src/cw/cw_in_check_join_req.c b/src/cw/cw_in_check_join_req.c index 86549078..9d633181 100644 --- a/src/cw/cw_in_check_join_req.c +++ b/src/cw/cw_in_check_join_req.c @@ -4,6 +4,8 @@ #include "dbg.h" #include "log.h" #include "capwap_items.h" +#include "format.h" +#include "connlist.h" int cw_in_check_join_req(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,struct sockaddr *from) @@ -22,6 +24,17 @@ int cw_in_check_join_req(struct conn *conn, struct cw_action_in *a, uint8_t * da cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a); } + connlist_lock(conn->connlist); + struct conn *cc = connlist_get_by_session_id(conn->connlist,conn); + if (!cc){ + connlist_add_by_session_id(conn->connlist,conn); + } + connlist_unlock(conn->connlist); + if (cc){ + cw_dbg(DBG_ELEM_ERR,"Session already in use %s",format_bin2hex(conn->session_id,16)); + conn->capwap_state=CW_STATE_JOIN; + return CW_RESULT_JOIN_FAILURE_SESSION_ALREADY_IN_USE; + } /* set result code to ok and change to configure state */ mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);