OSDN Git Service

Module bug fix.
[ultramonkey-l7/ultramonkey-l7-v2.git] / module / protocol / protomod_sessionless.c
index 9786367..8163700 100644 (file)
@@ -52,8 +52,10 @@ static void  fini(void);
 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);
@@ -77,7 +79,8 @@ static struct l7vs_protomod sessionless_protomod = {
        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 */
@@ -365,13 +368,12 @@ compare(handle_t srv_handle1, handle_t srv_handle2)
  * @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;
@@ -404,10 +406,10 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                        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 ------*/
 
@@ -415,32 +417,27 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        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 */
@@ -459,7 +456,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        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 */
@@ -467,7 +464,113 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        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 */
@@ -475,7 +578,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                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");
 
@@ -513,25 +616,13 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                }
        }
 
-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 ------*/