tcpdump mailing list archives

[PATCH 1/4] Fix mixing recursive and flat Path Data


From: Jamal Hadi Salim <hadi () cyberus ca>
Date: Tue, 25 Jan 2011 08:16:15 -0500

 +--PD
 .  +--PD
 .  |
 .  |
 .  +--PD
 .
 .
 +--PD
 |
 |
 +--PD

or
 +--PD
 .  +--PD
 .     +
 .     |
 .     +--PD
 .         +
 .         |
 .         +-- PD
 .         +
 .         |
 .         +-- PD
 +--PD
 |
 |
 +--PD

etc

Signed-off-by: Jamal Hadi Salim <hadi () mojatatu com>
---
 print-forces.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/print-forces.c b/print-forces.c
index 26e83d3..9833892 100644
--- a/print-forces.c
+++ b/print-forces.c
@@ -285,6 +285,7 @@ pdatacnt_print(register const u_char * pptr, register u_int len,
                        rc = ops->print((const u_char *)pdtlv,
                                        tll + pad + TLV_HDRL, op_msk,
                                        indent + 2);
+                       len -= (TLV_HDRL + pad + tll);
                } else {
                        printf("Invalid path data content type 0x%x len %d\n",
                               type, EXTRACT_16BITS(&pdtlv->length));
@@ -298,7 +299,7 @@ pd_err:
                        }
                }
        }
-       return 0;
+       return len;
 
 trunc:
        fputs("[|forces]", stdout);
@@ -312,6 +313,8 @@ pdata_print(register const u_char * pptr, register u_int len,
        const struct pathdata_h *pdh = (struct pathdata_h *)pptr;
        char *ib = indent_pr(indent, 0);
        u_int minsize = 0;
+       int more_pd = 0;
+       u_int32_t idcnt = 0;
 
        TCHECK(*pdh);
        if (len < sizeof(struct pathdata_h))
@@ -326,7 +329,8 @@ pdata_print(register const u_char * pptr, register u_int len,
        }
        pptr += sizeof(struct pathdata_h);
        len -= sizeof(struct pathdata_h);
-       minsize = EXTRACT_16BITS(&pdh->pIDcnt) * 4;
+       idcnt = EXTRACT_16BITS(&pdh->pIDcnt);
+       minsize = idcnt * 4;
        if (len < minsize) {
                printf("\t\t\ttruncated IDs expected %uB got %uB\n", minsize,
                       len);
@@ -334,7 +338,15 @@ pdata_print(register const u_char * pptr, register u_int len,
                printf("]\n");
                return -1;
        }
-       return pdatacnt_print(pptr, len, EXTRACT_16BITS(&pdh->pIDcnt), op_msk, indent);
+       more_pd = pdatacnt_print(pptr, len, idcnt, op_msk, indent);
+       if (more_pd > 0) {
+               int consumed = len - more_pd;
+               pptr += consumed;
+               len = more_pd; 
+               /* XXX: Argh, recurse some more */
+               return recpdoptlv_print(pptr, len, op_msk, indent+1);
+       } else
+               return 0;
 
 trunc:
        fputs("[|forces]", stdout);
-- 
1.7.0.4

-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.


Current thread: