pmd: autobahn fixes
authorAndy Green <andy@warmcat.com>
Fri, 28 Jul 2017 05:12:03 +0000 (13:12 +0800)
committerAndy Green <andy@warmcat.com>
Fri, 28 Jul 2017 05:12:03 +0000 (13:12 +0800)
autobahn-test.sh
lib/extension-permessage-deflate.c
lib/extension.c
lib/libwebsockets.c
lib/output.c

index 1564295..91b9171 100755 (executable)
@@ -6,7 +6,7 @@ N=1
 OS=`uname`
 
 for i in '1.1.1' '1.1.2' '1.1.3' '1.1.4' '1.1.5' '1.1.6' '1.1.7' '1.1.8' '1.2.1' '1.2.2' '1.2.3' '1.2.4' '1.2.5' '1.2.6' '1.2.7' '1.2.8' '2.1' '2.2' '2.3' '2.4' '2.5' '2.6' '2.7' '2.8' '2.9' '2.10' '2.11' '3.1' '3.2' '3.3' '3.4' '3.5' '3.6' '3.7' '4.1.1' '4.1.2' '4.1.3' '4.1.4' '4.1.5' '4.2.1' '4.2.2' '4.2.3' '4.2.4' '4.2.5' '5.1' '5.2' '5.3' '5.4' '5.5' '5.6' '5.7' '5.8' '5.9' '5.10' '5.11' '5.12' '5.13' '5.14' '5.15' '5.16' '5.17' '5.18' '5.19' '5.20' '6.1.1' '6.1.2' '6.1.3' '6.2.1' '6.2.2' '6.2.3' '6.2.4' '6.3.1' '6.3.2' '6.4.1' '6.4.2' '6.4.3' '6.4.4' '6.5.1' '6.5.2' '6.5.3' '6.5.4' '6.5.5' '6.6.1' '6.6.2' '6.6.3' '6.6.4' '6.6.5' '6.6.6' '6.6.7' '6.6.8' '6.6.9' '6.6.10' '6.6.11' '6.7.1' '6.7.2' '6.7.3' '6.7.4' '6.8.1' '6.8.2' '6.9.1' '6.9.2' '6.9.3' '6.9.4' '6.10.1' '6.10.2' '6.10.3' '6.11.1' '6.11.2' '6.11.3' '6.11.4' '6.11.5' '6.12.1' '6.12.2' '6.12.3' '6.12.4' '6.12.5' '6.12.6' '6.12.7' '6.12.8' '6.13.1' '6.13.2' '6.13.3' '6.13.4' '6.13.5' '6.14.1' '6.14.2' '6.14.3' '6.14.4' '6.14.5' '6.14.6' '6.14.7' '6.14.8' '6.14.9' '6.14.10' '6.15.1' '6.16.1' '6.16.2' '6.16.3' '6.17.1' '6.17.2' '6.17.3' '6.17.4' '6.17.5' '6.18.1' '6.18.2' '6.18.3' '6.18.4' '6.18.5' '6.19.1' '6.19.2' '6.19.3' '6.19.4' '6.19.5' '6.20.1' '6.20.2' '6.20.3' '6.20.4' '6.20.5' '6.20.6' '6.20.7' '6.21.1' '6.21.2' '6.21.3' '6.21.4' '6.21.5' '6.21.6' '6.21.7' '6.21.8' '6.22.1' '6.22.2' '6.22.3' '6.22.4' '6.22.5' '6.22.6' '6.22.7' '6.22.8' '6.22.9' '6.22.10' '6.22.11' '6.22.12' '6.22.13' '6.22.14' '6.22.15' '6.22.16' '6.22.17' '6.22.18' '6.22.19' '6.22.20' '6.22.21' '6.22.22' '6.22.23' '6.22.24' '6.22.25' '6.22.26' '6.22.27' '6.22.28' '6.22.29' '6.22.30' '6.22.31' '6.22.32' '6.22.33' '6.22.34' '6.23.1' '6.23.2' '6.23.3' '6.23.4' '6.23.5' '6.23.6' '6.23.7' '7.1.1' '7.1.2' '7.1.3' '7.1.4' '7.1.5' '7.1.6' '7.3.1' '7.3.2' '7.3.3' '7.3.4' '7.3.5' '7.3.6' '7.5.1' '7.7.1' '7.7.2' '7.7.3' '7.7.4' '7.7.5' '7.7.6' '7.7.7' '7.7.8' '7.7.9' '7.7.10' '7.7.11' '7.7.12' '7.7.13' '7.9.1' '7.9.2' '7.9.3' '7.9.4' '7.9.5' '7.9.6' '7.9.7' '7.9.8' '7.9.9' '7.9.10' '7.9.11' '7.9.12' '7.9.13' '7.13.1' '7.13.2' '9.1.1' '9.1.2' '9.1.3' '9.1.4' '9.1.5' '9.1.6' '9.2.1' '9.2.2' '9.2.3' '9.2.4' '9.2.5' '9.2.6' '9.3.1' '9.3.2' '9.3.3' '9.3.4' '9.3.5' '9.3.6' '9.3.7' '9.3.8' '9.3.9' '9.4.1' '9.4.2' '9.4.3' '9.4.4' '9.4.5' '9.4.6' '9.4.7' '9.4.8' '9.4.9' '9.5.1' '9.5.2' '9.5.3' '9.5.4' '9.5.5' '9.5.6' '9.6.1' '9.6.2' '9.6.3' '9.6.4' '9.6.5' '9.6.6' '9.7.1' '9.7.2' '9.7.3' '9.7.4' '9.7.5' '9.7.6' '9.8.1' '9.8.2' '9.8.3' '9.8.4' '9.8.5' '9.8.6' '10.1.1' '12.1.1' '12.1.2' '12.1.3' '12.1.4' '12.1.5' '12.1.6' '12.1.7' '12.1.8' '12.1.9' '12.1.10' '12.1.11' '12.1.12' '12.1.13' '12.1.14' '12.1.15' '12.1.16' '12.1.17' '12.1.18' '12.2.1' '12.2.2' '12.2.3' '12.2.4' '12.2.5' '12.2.6' '12.2.7' '12.2.8' '12.2.9' '12.2.10' '12.2.11' '12.2.12' '12.2.13' '12.2.14' '12.2.15' '12.2.16' '12.2.17' '12.2.18' '12.3.1' '12.3.2' '12.3.3' '12.3.4' '12.3.5' '12.3.6' '12.3.7' '12.3.8' '12.3.9' '12.3.10' '12.3.11' '12.3.12' '12.3.13' '12.3.14' '12.3.15' '12.3.16' '12.3.17' '12.3.18' '12.4.1' '12.4.2' '12.4.3' '12.4.4' '12.4.5' '12.4.6' '12.4.7' '12.4.8' '12.4.9' '12.4.10' '12.4.11' '12.4.12' '12.4.13' '12.4.14' '12.4.15' '12.4.16' '12.4.17' '12.4.18' '12.5.1' '12.5.2' '12.5.3' '12.5.4' '12.5.5' '12.5.6' '12.5.7' '12.5.8' '12.5.9' '12.5.10' '12.5.11' '12.5.12' '12.5.13' '12.5.14' '12.5.15' '12.5.16' '12.5.17' '12.5.18' '13.1.1' '13.1.2' '13.1.3' '13.1.4' '13.1.5' '13.1.6' '13.1.7' '13.1.8' '13.1.9' '13.1.10' '13.1.11' '13.1.12' '13.1.13' '13.1.14' '13.1.15' '13.1.16' '13.1.17' '13.1.18' '13.2.1' '13.2.2' '13.2.3' '13.2.4' '13.2.5' '13.2.6' '13.2.7' '13.2.8' '13.2.9' '13.2.10' '13.2.11' '13.2.12' '13.2.13' '13.2.14' '13.2.15' '13.2.16' '13.2.17' '13.2.18' '13.3.1' '13.3.2' '13.3.3' '13.3.4' '13.3.5' '13.3.6' '13.3.7' '13.3.8' '13.3.9' '13.3.10' '13.3.11' '13.3.12' '13.3.13' '13.3.14' '13.3.15' '13.3.16' '13.3.17' '13.3.18' '13.4.1' '13.4.2' '13.4.3' '13.4.4' '13.4.5' '13.4.6' '13.4.7' '13.4.8' '13.4.9' '13.4.10' '13.4.11' '13.4.12' '13.4.13' '13.4.14' '13.4.15' '13.4.16' '13.4.17' '13.4.18' '13.5.1' '13.5.2' '13.5.3' '13.5.4' '13.5.5' '13.5.6' '13.5.7' '13.5.8' '13.5.9' '13.5.10' '13.5.11' '13.5.12' '13.5.13' '13.5.14' '13.5.15' '13.5.16' '13.5.17' '13.5.18' '13.6.1' '13.6.2' '13.6.3' '13.6.4' '13.6.5' '13.6.6' '13.6.7' '13.6.8' '13.6.9' '13.6.10' '13.6.11' '13.6.12' '13.6.13' '13.6.14' '13.6.15' '13.6.16' '13.6.17' '13.6.18' '13.7.1' '13.7.2' '13.7.3' '13.7.4' '13.7.5' '13.7.6' '13.7.7' '13.7.8' '13.7.9' '13.7.10' '13.7.11' '13.7.12' '13.7.13' '13.7.14' '13.7.15' '13.7.16' '13.7.17' '13.7.18' ; do
-       libwebsockets-test-echo --client localhost --port 9001 -u "/runCase?case=$N&agent=libwebsockets" -v -n 1 &
+       libwebsockets-test-echo --client 127.0.0.1 --port 9001 -u "/runCase?case=$N&agent=libwebsockets" -v -n 1 &
 
        C=99
        while [ $C -gt 8 ] ; do
index fe71666..f027e1f 100644 (file)
@@ -94,13 +94,16 @@ lws_extension_callback_pm_deflate(struct lws_context *context,
 
        case LWS_EXT_CB_OPTION_SET:
                oa = in;
-               lwsl_info("%s: option set: idx %d, %s, len %d\n", __func__,
+               lwsl_notice("%s: option set: idx %d, %s, len %d\n", __func__,
                          oa->option_index, oa->start, oa->len);
                if (oa->start)
                        priv->args[oa->option_index] = atoi(oa->start);
                else
                        priv->args[oa->option_index] = 1;
 
+               if (priv->args[PMD_CLIENT_MAX_WINDOW_BITS] == 8)
+                       priv->args[PMD_CLIENT_MAX_WINDOW_BITS] = 9;
+
                lws_extension_pmdeflate_restrict_args(wsi, priv);
                break;
 
@@ -325,16 +328,18 @@ lws_extension_callback_pm_deflate(struct lws_context *context,
 
        case LWS_EXT_CB_PAYLOAD_TX:
 
-               if (!priv->tx_init)
-                       if (deflateInit2(&priv->tx, priv->args[PMD_COMP_LEVEL],
+               if (!priv->tx_init) {
+                       n = deflateInit2(&priv->tx, priv->args[PMD_COMP_LEVEL],
                                         Z_DEFLATED,
-                                        -priv->args[PMD_CLIENT_MAX_WINDOW_BITS +
-                                                    !wsi->vhost->listen_port],
+                                        -priv->args[PMD_SERVER_MAX_WINDOW_BITS +
+                                                    (wsi->vhost->listen_port <= 0)],
                                         priv->args[PMD_MEM_LEVEL],
-                                        Z_DEFAULT_STRATEGY) != Z_OK) {
-                               lwsl_ext("inflateInit2 failed\n");
+                                        Z_DEFAULT_STRATEGY);
+                       if (n != Z_OK) {
+                               lwsl_ext("inflateInit2 failed %d\n", n);
                                return 1;
                        }
+               }
                priv->tx_init = 1;
                if (!priv->buf_tx_deflated)
                        priv->buf_tx_deflated = lws_malloc(LWS_PRE + 7 + 5 +
@@ -436,7 +441,9 @@ lws_extension_callback_pm_deflate(struct lws_context *context,
                        break;
                priv->compressed_out = 0;
 
-               if ((*(eff_buf->token) & 0x80) && priv->args[PMD_CLIENT_NO_CONTEXT_TAKEOVER]) {
+               if ((*(eff_buf->token) & 0x80) &&
+                   priv->args[PMD_CLIENT_NO_CONTEXT_TAKEOVER]) {
+                       lwsl_debug("PMD_CLIENT_NO_CONTEXT_TAKEOVER\n");
                        (void)deflateEnd(&priv->tx);
                        priv->tx_init = 0;
                }
index d09b5af..ac28204 100644 (file)
@@ -62,7 +62,7 @@ lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
                                                        oa.option_index = n;
                                                        lwsl_ext("hit %d\n", oa.option_index);
                                                        leap = LEAPS_SEEK_VAL;
-                                                       if (len ==1)
+                                                       if (len == 1)
                                                                goto set_arg;
                                                        break;
                                                }
index 01cf469..65b88ee 100755 (executable)
@@ -65,9 +65,14 @@ static const char * const log_level_names[] = {
 void
 lws_free_wsi(struct lws *wsi)
 {
+       struct lws_context_per_thread *pt;
+       int n;
+
        if (!wsi)
                return;
        
+       pt = &wsi->context->pt[(int)wsi->tsi];
+
        /* Protocol user data may be allocated either internally by lws
         * or by specified the user.
         * We should only free what we allocated. */
@@ -80,8 +85,22 @@ lws_free_wsi(struct lws *wsi)
 
        /* we may not have an ah, but may be on the waiting list... */
        lwsl_info("ah det due to close\n");
+       /* we're closing, losing some rx is OK */
+       lws_header_table_force_to_detachable_state(wsi);
        lws_header_table_detach(wsi, 0);
 
+       lws_pt_lock(pt);
+       for (n = 0; n < wsi->context->max_http_header_pool; n++) {
+               if (pt->ah_pool[n].in_use &&
+                   pt->ah_pool[n].wsi == wsi) {
+                       lwsl_err("%s: ah leak: wsi %p\n", __func__, wsi);
+                       pt->ah_pool[n].in_use = 0;
+                       pt->ah_pool[n].wsi = NULL;
+                       pt->ah_count_in_use--;
+               }
+       }
+       lws_pt_unlock(pt);
+
        wsi->context->count_wsi_allocated--;
        lwsl_debug("%s: %p, remaining wsi %d\n", __func__, wsi,
                        wsi->context->count_wsi_allocated);
index 9f72443..465cb5f 100644 (file)
@@ -286,7 +286,8 @@ LWS_VISIBLE int lws_write(struct lws *wsi, unsigned char *buf, size_t len,
        if (wsi->state == LWSS_ESTABLISHED && wsi->u.ws.tx_draining_ext) {
                /* remove us from the list */
                struct lws **w = &pt->tx_draining_ext_list;
-               lwsl_debug("%s: TX EXT DRAINING: Remove from list\n", __func__);
+
+       //      lwsl_notice("%s: TX EXT DRAINING: Remove from list\n", __func__);
                wsi->u.ws.tx_draining_ext = 0;
                /* remove us from context draining ext list */
                while (*w) {
@@ -349,11 +350,13 @@ LWS_VISIBLE int lws_write(struct lws *wsi, unsigned char *buf, size_t len,
        case LWS_WRITE_CLOSE:
                break;
        default:
+               lwsl_debug("LWS_EXT_CB_PAYLOAD_TX\n");
                n = lws_ext_cb_active(wsi, LWS_EXT_CB_PAYLOAD_TX, &eff_buf, wp);
                if (n < 0)
                        return -1;
 
                if (n && eff_buf.token_len) {
+                       lwsl_debug("drain len %d\n", (int)eff_buf.token_len);
                        /* extension requires further draining */
                        wsi->u.ws.tx_draining_ext = 1;
                        wsi->u.ws.tx_draining_ext_list = pt->tx_draining_ext_list;
@@ -387,8 +390,8 @@ LWS_VISIBLE int lws_write(struct lws *wsi, unsigned char *buf, size_t len,
         */
        if ((char *)buf != eff_buf.token) {
                /*
-                * ext might eat it, but no have anything to issue yet
-                * in that case we have to follow his lead, but stash and
+                * ext might eat it, but not have anything to issue yet.
+                * In that case we have to follow his lead, but stash and
                 * replace the write type that was lost here the first time.
                 */
                if (len && !eff_buf.token_len) {
@@ -407,6 +410,13 @@ LWS_VISIBLE int lws_write(struct lws *wsi, unsigned char *buf, size_t len,
        buf = (unsigned char *)eff_buf.token;
        len = eff_buf.token_len;
 
+       lwsl_debug("%p / %d\n", buf, (int)len);
+
+       if (!buf) {
+               lwsl_err("null buf (%d)\n", (int)len);
+               return -1;
+       }
+
        switch (wsi->ietf_spec_revision) {
        case 13:
                if (masked7) {