OSDN Git Service

Module bug fix.
[ultramonkey-l7/ultramonkey-l7-v2.git] / module / protocol / protomod_pfilter.c
index 9697067..1182f4b 100644 (file)
@@ -69,8 +69,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);
@@ -94,7 +96,8 @@ static struct l7vs_protomod pfilter_protomod = {
        0,              /* 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 */
@@ -436,19 +439,18 @@ compare_out:
 }
 
 /*!
- * Check the client packet and determine a real server.
+ * Determine a real server.
  * @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
  * @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_pfilter_service *pfilter_service;
        int ret;
@@ -462,7 +464,6 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                char conn_str[DEBUG_STR_LEN] = {0};
                char dest_str[DEBUG_STR_LEN] = {0};
                char len_str[DEBUG_STR_LEN] = {0};
-               char tcps_str[DEBUG_STR_LEN] = {0};
                l7vs_service_c_str(srv_str, srv);
                l7vs_conn_c_str(conn_str, conn);
                if (dest != NULL) {
@@ -477,17 +478,11 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                else {
                        strncpy(len_str, "NULL", DEBUG_STR_LEN);
                }
-               if (tcps != NULL) {
-                       snprintf(tcps_str, DEBUG_STR_LEN, "%d", *tcps);
-               }
-               else {
-                       strncpy(tcps_str, "NULL", DEBUG_STR_LEN);
-               }
                PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,296,
-                   "in_function: int match_cldata(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=&(%s)",
-                   srv_str, conn_str, request, len_str, dest_str, tcps_str);
+                   "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s), dest=&(&(%s))",
+                   srv_str, conn_str, request, len_str, dest_str);
        }
        /*------ DEBUG LOG END ------*/
 
@@ -495,32 +490,27 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (srv == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,253, "Arg(srv) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (srv->pm == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,254, "Arg(srv->pm) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (request == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,255, "Arg(request) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (len == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,256, "Arg(len) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (dest == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,257, "Arg(dest) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
-       }
-       if (tcps == NULL) {
-               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,258, "Arg(tcps) is NULL pointer.");
-               return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* search service that has such a service ID */
@@ -539,7 +529,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (pfilter_service == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,259, "Could not find such service handle's pfilter service.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* initialize protocol module ... clear destination list */
@@ -547,14 +537,117 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (ret != 0) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,260, "Could not initialize protomod.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
+       }
+
+       /* finalize */
+       ret = srv->pm->finalize(srv, conn, request, *len, dest, pfilter_service->reschedule);
+       if (ret != 0) {
+               PUT_LOG_INFO(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,18, "Could not finalize protomod. (Realserver decision failure)");
+               return_value = -1;
+               goto select_dest_out;
+       }
+
+select_dest_out:
+       /*-------- DEBUG LOG --------*/
+       if (pfilter_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,298,
+                   "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;
+}
+
+/*!
+ * Check the 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_pfilter_service *pfilter_service;
+       int ret;
+       int return_value = 0;
+    std::string packet_data;
+
+       /*-------- DEBUG LOG --------*/
+       if (pfilter_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == pfilter_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(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,296,
+                   "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(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,253, "Arg(srv) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (srv->pm == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,254, "Arg(srv->pm) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (request == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,255, "Arg(request) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (len == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,256, "Arg(len) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
+       /* search service that has such a service ID */
+       pfilter_service = l7vs_protomod_pfilter_search_service(srv->handle);
+
+       /*-------- DEBUG LOG --------*/
+       if (pfilter_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char pfilter_str[DEBUG_STR_LEN] = {0};
+               l7vs_pfilter_service_c_str(pfilter_str, pfilter_service);
+               PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,297, "pointer assign: pfilter_service=&(%s)",
+                   pfilter_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       if (pfilter_service == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,259, "Could not find such service handle's pfilter service.");
+               return_value = -1;
+               goto analyze_cldata_out;
        }
 
        /* check pattern_match != 0 */
        if (pfilter_service->pattern_match[0] == '\0') {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,261, "Pattern match is NULL pointer");
                return_value = -1;
-               goto match_cldata_out;
+               goto analyze_cldata_out;
        }
 
        /* check pattern match */
@@ -571,26 +664,16 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if ( boost::regex_search(packet_data, pfilter_service->regex) ) {
 #endif
                return_value = -1;
-               goto match_cldata_out;
-       }
-
-       *tcps = 0;
-
-       /* finalize */
-       ret = srv->pm->finalize(srv, conn, request, *len, dest, pfilter_service->reschedule);
-       if (ret != 0) {
-               PUT_LOG_INFO(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,18, "Could not finalize protomod. (Realserver decision failure)");
-               return_value = -1;
-               goto match_cldata_out;
+               goto analyze_cldata_out;
        }
 
-match_cldata_out:
+analyze_cldata_out:
        /*-------- DEBUG LOG --------*/
        if (pfilter_protomod.get_log_level != NULL &&
            LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,298,
-                   "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 ------*/
@@ -599,7 +682,7 @@ match_cldata_out:
 }
 
 /*!
- * Check the real server packet and insert a Set-Cookie field.
+ * Do nothing
  * @param[in] srv service struct include service handle, protocol module and schedule module.
  * @param[in] conn connection data.
  * @param[in] response packet data from real server