diff --git a/conf/ac.conf b/conf/ac.conf
index 8dc841b..f589ff7 100755
--- a/conf/ac.conf
+++ b/conf/ac.conf
@@ -77,9 +77,11 @@ application: {
};
backend: {
+ id = "1";
+ version = "1.0";
server: (
- { url = "http://localhost/csoap.php"; },
- { url = "https://localhost/csoap.php"; x509: { calist = "/etc/capwap/ca.crt"; certificate = "/etc/capwap/ac.crt"; privatekey = "/etc/capwap/ac.key"; privatekeypassword = ""; }; }
+ { url = "http://127.0.0.1/csoap.php"; }
+ #{ url = "https://127.0.0.1/csoap.php"; x509: { calist = "/etc/capwap/casoap.crt"; certificate = "/etc/capwap/clientsoap.crt"; privatekey = "/etc/capwap/clientsoap.key"; privatekeypassword = ""; }; }
);
};
diff --git a/src/ac/ac.c b/src/ac/ac.c
index 5353947..b2d8a41 100644
--- a/src/ac/ac.c
+++ b/src/ac/ac.c
@@ -103,6 +103,14 @@ static void ac_destroy(void) {
capwap_list_free(g_ac.datasessionshandshake);
/* Backend */
+ if (g_ac.backendacid) {
+ capwap_free(g_ac.backendacid);
+ }
+
+ if (g_ac.backendversion) {
+ capwap_free(g_ac.backendversion);
+ }
+
for (i = 0; i < g_ac.availablebackends->count; i++) {
ac_soapclient_free_server(*(struct ac_http_soap_server**)capwap_array_get_item_pointer(g_ac.availablebackends, i));
}
@@ -570,6 +578,18 @@ static int ac_parsing_configuration_1_0(config_t* config) {
}
/* Backend */
+ if (config_lookup_string(config, "backend.id", &configString) == CONFIG_TRUE) {
+ if (strlen(configString) > 0) {
+ g_ac.backendacid = capwap_duplicate_string(configString);
+ }
+ }
+
+ if (config_lookup_string(config, "backend.version", &configString) == CONFIG_TRUE) {
+ if (strlen(configString) > 0) {
+ g_ac.backendversion = capwap_duplicate_string(configString);
+ }
+ }
+
configSetting = config_lookup(config, "backend.server");
if (configSetting) {
int count = config_setting_length(configSetting);
diff --git a/src/ac/ac.h b/src/ac/ac.h
index 101972f..ae26d1e 100644
--- a/src/ac/ac.h
+++ b/src/ac/ac.h
@@ -107,6 +107,9 @@ struct ac_t {
struct capwap_dtls_context dtlscontext;
/* Backend Management */
+ char* backendacid;
+ char* backendversion;
+ char* backendsessionid;
struct capwap_array* availablebackends;
};
diff --git a/src/ac/ac_backend.c b/src/ac/ac_backend.c
index eea355c..9096d52 100644
--- a/src/ac/ac_backend.c
+++ b/src/ac/ac_backend.c
@@ -32,6 +32,7 @@ static int ac_backend_soap_join(void) {
struct ac_soap_request* request;
struct ac_http_soap_server* server;
+ ASSERT(g_ac.backendsessionid == NULL);
ASSERT(g_ac_backend.soaprequest == NULL);
/* Get HTTP Soap Server */
@@ -44,6 +45,8 @@ static int ac_backend_soap_join(void) {
if (!g_ac_backend.endthread) {
request = ac_soapclient_create_request("joinBackend", SOAP_NAMESPACE_URI);
if (request) {
+ ac_soapclient_add_param(request, "xs:string", "acid", g_ac.backendacid);
+ ac_soapclient_add_param(request, "xs:string", "version", g_ac.backendversion);
g_ac_backend.soaprequest = ac_soapclient_prepare_request(request, server);
}
}
@@ -66,7 +69,11 @@ static int ac_backend_soap_join(void) {
/* Get join result */
if ((response->responsecode == HTTP_RESULT_OK) && response->xmlResponseReturn) {
xmlChar* xmlResult = xmlNodeGetContent(response->xmlResponseReturn);
- result = atoi((const char*)xmlResult);
+ if (xmlStrlen(xmlResult)) {
+ result = 1;
+ g_ac.backendsessionid = capwap_duplicate_string((const char*)xmlResult);
+ }
+
xmlFree(xmlResult);
}
@@ -94,6 +101,7 @@ static int ac_backend_soap_waitevent(void) {
struct ac_http_soap_server* server;
ASSERT(g_ac_backend.soaprequest == NULL);
+ ASSERT(g_ac.backendsessionid != NULL);
/* Get HTTP Soap Server */
server = *(struct ac_http_soap_server**)capwap_array_get_item_pointer(g_ac.availablebackends, g_ac_backend.activebackend);
@@ -105,6 +113,7 @@ static int ac_backend_soap_waitevent(void) {
if (!g_ac_backend.endthread) {
request = ac_soapclient_create_request("waitBackendEvent", SOAP_NAMESPACE_URI);
if (request) {
+ ac_soapclient_add_param(request, "xs:string", "sessionid", g_ac.backendsessionid);
g_ac_backend.soaprequest = ac_soapclient_prepare_request(request, server);
/* Change result timeout */
@@ -158,7 +167,7 @@ static void ac_backend_soap_leave(void) {
ASSERT(g_ac_backend.soaprequest == NULL);
/* */
- if (!g_ac_backend.backendstatus) {
+ if (!g_ac_backend.backendstatus || !g_ac.backendsessionid) {
return;
}
@@ -171,6 +180,7 @@ static void ac_backend_soap_leave(void) {
/* Build Soap Request */
request = ac_soapclient_create_request("leaveBackend", SOAP_NAMESPACE_URI);
if (request) {
+ ac_soapclient_add_param(request, "xs:string", "sessionid", g_ac.backendsessionid);
g_ac_backend.soaprequest = ac_soapclient_prepare_request(request, server);
}
@@ -214,13 +224,20 @@ static void ac_backend_run(void) {
if (connected) {
result = ac_backend_soap_waitevent();
if (result < 0) {
- if (!g_ac_backend.endthread) {
- capwap_logging_debug("Lost connection with Backend Server");
+ if (g_ac_backend.endthread) {
+ break;
}
/* Connection error, change Backend Server */
connected = 0;
+ capwap_logging_debug("Lost connection with Backend Server");
capwap_lock_enter(&g_ac_backend.backendlock);
+
+ /* Lost session id */
+ capwap_free(g_ac.backendsessionid);
+ g_ac.backendsessionid = NULL;
+
+ /* Change backend */
g_ac_backend.activebackend = (g_ac_backend.activebackend + 1) % g_ac.availablebackends->count;
}
} else {
@@ -259,6 +276,12 @@ static void ac_backend_run(void) {
ac_backend_soap_leave();
g_ac_backend.backendstatus = 0;
+ /* */
+ if (g_ac.backendsessionid) {
+ capwap_free(g_ac.backendsessionid);
+ g_ac.backendsessionid = NULL;
+ }
+
/* */
if (!connected) {
capwap_lock_exit(&g_ac_backend.backendlock);
@@ -304,7 +327,13 @@ int ac_backend_start(void) {
memset(&g_ac_backend, 0, sizeof(struct ac_backend_t));
/* */
- if (!g_ac.availablebackends->count) {
+ if (!g_ac.backendacid) {
+ capwap_logging_error("AC Backend ID isn't set");
+ return 0;
+ } else if (!g_ac.backendversion) {
+ capwap_logging_error("Backend Protocol Version isn't set");
+ return 0;
+ } else if (!g_ac.availablebackends->count) {
capwap_logging_error("List of available backends is empty");
return 0;
}
diff --git a/src/ac/ac_session.c b/src/ac/ac_session.c
index 0dc51dc..9a9eeb9 100644
--- a/src/ac/ac_session.c
+++ b/src/ac/ac_session.c
@@ -748,9 +748,12 @@ struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* sessi
/* Critical section */
capwap_lock_enter(&session->sessionlock);
+ ASSERT(g_ac.backendsessionid != NULL);
+
/* Build Soap Request */
request = ac_soapclient_create_request(method, SOAP_NAMESPACE_URI);
if (request) {
+ ac_soapclient_add_param(request, "xs:string", "sessionid", g_ac.backendsessionid);
session->soaprequest = ac_soapclient_prepare_request(request, server);
}
diff --git a/src/ac/ac_session.h b/src/ac/ac_session.h
index 35cc59e..3c76f9e 100644
--- a/src/ac/ac_session.h
+++ b/src/ac/ac_session.h
@@ -137,7 +137,7 @@ int ac_dfa_state_dead(struct ac_session_t* session, struct capwap_parsed_packet*
/* Soap function */
struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* session, char* method, int numparam, ...);
-#define ac_soap_authorizejoin(s, id) ac_session_send_soap_request((s), "authorizeJoin", 1, "xs:string", "idwtp", id)
+#define ac_soap_authorizejoin(s, wtpid) ac_session_send_soap_request((s), "authorizeJoin", 1, "xs:string", "wtpid", wtpid)
#endif /* __AC_SESSION_HEADER__ */
diff --git a/webservice/smartcapwap.wsdl b/webservice/smartcapwap.wsdl
index 69ea86c..6b83d88 100644
--- a/webservice/smartcapwap.wsdl
+++ b/webservice/smartcapwap.wsdl
@@ -4,18 +4,28 @@
-
-
-
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
@@ -30,12 +40,14 @@
+
+
@@ -69,6 +81,7 @@
+
@@ -81,6 +94,7 @@
+