static int create(void*, handle_t);
static void* create_sa(struct l7vs_service_arg*);
static int compare(handle_t, handle_t);
-static int match_cldata(struct l7vs_service*, struct l7vs_conn*,
- char*, size_t*, struct l7vs_dest**, int*);
+static int select_dest(struct l7vs_service*, struct l7vs_conn*,
+ char*, size_t*, struct l7vs_dest**);
+static int analyze_cldata(struct l7vs_service*, struct l7vs_conn*,
+ char*, size_t*);
static int analyze_rsdata(struct l7vs_service*, struct l7vs_conn*,
char*, size_t*);
static int destroy(handle_t);
1, /* fast schedule */
create, /* create function */
compare, /* compare function */
- match_cldata, /* match_cldata function */
+ select_dest, /* select_dest function */
+ analyze_cldata, /* analyze_cldata function */
analyze_rsdata, /* analyze_rsdata function */
destroy, /* destroy function */
fini, /* fini function */
* @param[in] request packet data from client
* @param[in] len length of packet data
* @param[out] dest destination (real server) list
- * @param[out] tcps TCP Splicer flag
* @retval 0 successfully check packet data
* @retval -1 some errors occur.
*/
static int
-match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
- char *request, size_t *len, struct l7vs_dest **dest, int *tcps)
+select_dest(struct l7vs_service *srv, struct l7vs_conn *conn,
+ char *request, size_t *len, struct l7vs_dest **dest)
{
struct l7vs_sessionless_service *sessionless_service;
int ret;
strncpy(len_str, "NULL", DEBUG_STR_LEN);
}
PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,70,
- "in_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+ "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
"char* request, size_t* len, struct l7vs_dest** dest, int* tcps):srv=&(%s), conn=&(%s), "
- "request=\"%s\", len=&(%s), dest=&(&(%s)), tcps=&(%d)",
- srv_str, conn_str, request, len_str, dest_str, *tcps);
+ "request=\"%s\", len=&(%s), dest=&(&(%s))",
+ srv_str, conn_str, request, len_str, dest_str);
}
/*------ DEBUG LOG END ------*/
if (srv == NULL) {
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,55, "Arg(srv) is NULL pointer.");
return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
}
if (srv->pm == NULL) {
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,56, "Arg(srv->pm) is NULL pointer.");
return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
}
if (request == NULL) {
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,57, "Arg(request) is NULL pointer.");
return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
}
if (len == NULL) {
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,58, "Arg(len) is NULL pointer.");
return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
}
if (dest == NULL) {
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,59, "Arg(dest) is NULL pointer.");
return_value = -1;
- goto match_cldata_out;
- }
- if (tcps == NULL) {
- PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,60, "Arg(tcps) is NULL pointer.");
- return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
}
/* search service that has such a service ID */
if (sessionless_service == NULL) {
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,61, "Could not find such service handle's sessionless service.");
return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
}
/* initialize protocol module ... clear destination list */
if (ret != 0){
PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,62, "Could not initialize protomod.");
return_value = -1;
- goto match_cldata_out;
+ goto select_dest_out;
+ }
+
+ /* finalize, always set reschedule flag */
+ ret = srv->pm->finalize(srv, conn, request, *len, dest, 1);
+ if (ret != 0){
+ PUT_LOG_INFO(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,10, "Could not finalize protomod. (Realserver decision failure)");
+ return_value = -1;
+ goto select_dest_out;
+ }
+
+select_dest_out:
+ /*-------- DEBUG LOG --------*/
+ if (sessionless_protomod.get_log_level != NULL &&
+ LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+ PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,72,
+ "out_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+ "char* request, size_t* len, struct l7vs_dest** dest):return_value=%d",
+ return_value);
+ }
+ /*------ DEBUG LOG END ------*/
+
+ return return_value;
+}
+
+/*!
+ * Analyze and modify client packet
+ * @param[in] srv service struct include service handle, protocol module and schedule module.
+ * @param[in] conn connection data.
+ * @param[in] request packet data from client
+ * @param[in] len length of packet data
+ * @retval 0 successfully check packet data
+ * @retval -1 some errors occur.
+ */
+static int
+analyze_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
+ char *request, size_t *len)
+{
+ struct l7vs_sessionless_service *sessionless_service;
+ int ret;
+ int offset_length;
+ char *x_forwarded_value;
+ char *next_line = NULL;
+ char x_forwarded_for_header[X_FORWARDED_FOR_LENGTH];
+ size_t uri_len = 0;
+ int return_value = 0;
+
+ /*-------- DEBUG LOG --------*/
+ if (sessionless_protomod.get_log_level != NULL &&
+ LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+ char srv_str[DEBUG_STR_LEN] = {0};
+ char conn_str[DEBUG_STR_LEN] = {0};
+ char len_str[DEBUG_STR_LEN] = {0};
+ l7vs_service_c_str(srv_str, srv);
+ l7vs_conn_c_str(conn_str, conn);
+ if (len != NULL) {
+ snprintf(len_str, DEBUG_STR_LEN, "%lu", (unsigned long int) *len);
+ }
+ else {
+ strncpy(len_str, "NULL", DEBUG_STR_LEN);
+ }
+ PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,70,
+ "in_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+ "char* request, size_t* len):srv=&(%s), conn=&(%s), request=\"%s\", len=&(%s)",
+ srv_str, conn_str, request, len_str);
+ }
+ /*------ DEBUG LOG END ------*/
+
+ /* check null */
+ if (srv == NULL) {
+ PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,55, "Arg(srv) is NULL pointer.");
+ return_value = -1;
+ goto analyze_cldata_out;
+ }
+ if (srv->pm == NULL) {
+ PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,56, "Arg(srv->pm) is NULL pointer.");
+ return_value = -1;
+ goto analyze_cldata_out;
+ }
+ if (request == NULL) {
+ PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,57, "Arg(request) is NULL pointer.");
+ return_value = -1;
+ goto analyze_cldata_out;
+ }
+ if (len == NULL) {
+ PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,58, "Arg(len) is NULL pointer.");
+ return_value = -1;
+ goto analyze_cldata_out;
+ }
+
+ /* search service that has such a service ID */
+ sessionless_service = l7vs_protomod_sessionless_search_service(srv->handle);
+
+ /*-------- DEBUG LOG --------*/
+ if (sessionless_protomod.get_log_level != NULL &&
+ LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+ char sessionless_str[DEBUG_STR_LEN] = {0};
+ l7vs_sessionless_service_c_str(sessionless_str, sessionless_service);
+ PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,71, "pointer assign: sessionless_service=&(%s)",
+ sessionless_str);
+ }
+ /*------ DEBUG LOG END ------*/
+
+ if (sessionless_service == NULL) {
+ PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,61, "Could not find such service handle's sessionless service.");
+ return_value = -1;
+ goto analyze_cldata_out;
}
/* set X-Forwarded-For field */
uri_len = *len;
/* check request */
if (http_check_request_method(request, &uri_len) == NULL)
- goto match_cldata_finalize;
+ goto analyze_cldata_out;
x_forwarded_value = http_search_header_field(request, "X-Forwarded-For");
}
}
-match_cldata_finalize:
- *tcps = 0;
-
- /* finalize, always set reschedule flag */
- ret = srv->pm->finalize(srv, conn, request, *len, dest, 1);
-
- if (ret != 0){
- PUT_LOG_INFO(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,10, "Could not finalize protomod. (Realserver decision failure)");
- return_value = -1;
- goto match_cldata_out;
- }
-
-match_cldata_out:
+analyze_cldata_out:
/*-------- DEBUG LOG --------*/
if (sessionless_protomod.get_log_level != NULL &&
LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,72,
- "out_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
- "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
+ "out_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+ "char* request, size_t* len):return_value=%d",
return_value);
}
/*------ DEBUG LOG END ------*/