Print out hex version of encoded attributes
authorAlan T. DeKok <aland@freeradius.org>
Thu, 24 Mar 2011 11:19:38 +0000 (12:19 +0100)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 24 Mar 2011 11:19:38 +0000 (12:19 +0100)
This makes debugging the encoder much easier

src/lib/radius.c

index 62e3d05..fc17d47 100644 (file)
@@ -147,26 +147,42 @@ void fr_printf_log(const char *fmt, ...)
        return;
 }
 
+static const char *tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+
+static void print_hex_data(const uint8_t *ptr, int attrlen, int depth)
+{
+       int i;
+
+       for (i = 0; i < attrlen; i++) {
+               if ((i > 0) && ((i & 0x0f) == 0x00))
+                       fprintf(fr_log_fp, "%.*s", depth, tabs);
+               fprintf(fr_log_fp, "%02x ", ptr[i]);
+               if ((i & 0x0f) == 0x0f) fprintf(fr_log_fp, "\n");
+       }
+       if ((i & 0x0f) != 0) fprintf(fr_log_fp, "\n");
+}
+
+
 void rad_print_hex(RADIUS_PACKET *packet)
 {
        int i;
 
-       if (!packet->data) return;
+       if (!packet->data || !fr_log_fp) return;
 
-       printf("  Code:\t\t%u\n", packet->data[0]);
-       printf("  Id:\t\t%u\n", packet->data[1]);
-       printf("  Length:\t%u\n", ((packet->data[2] << 8) |
+       fprintf(fr_log_fp, "  Code:\t\t%u\n", packet->data[0]);
+       fprintf(fr_log_fp, "  Id:\t\t%u\n", packet->data[1]);
+       fprintf(fr_log_fp, "  Length:\t%u\n", ((packet->data[2] << 8) |
                                   (packet->data[3])));
-       printf("  Vector:\t");
+       fprintf(fr_log_fp, "  Vector:\t");
        for (i = 4; i < 20; i++) {
-               printf("%02x", packet->data[i]);
+               fprintf(fr_log_fp, "%02x", packet->data[i]);
        }
-       printf("\n");
+       fprintf(fr_log_fp, "\n");
 
        if (packet->data_len > 20) {
                int total;
                const uint8_t *ptr;
-               printf("  Data:");
+               fprintf(fr_log_fp, "  Data:");
 
                total = packet->data_len - 20;
                ptr = packet->data + 20;
@@ -175,26 +191,26 @@ void rad_print_hex(RADIUS_PACKET *packet)
                        int attrlen;
                        unsigned int vendor = 0;
 
-                       printf("\t\t");
+                       fprintf(fr_log_fp, "\t\t");
                        if (total < 2) { /* too short */
-                               printf("%02x\n", *ptr);
+                               fprintf(fr_log_fp, "%02x\n", *ptr);
                                break;
                        }
 
                        if (ptr[1] > total) { /* too long */
                                for (i = 0; i < total; i++) {
-                                       printf("%02x ", ptr[i]);
+                                       fprintf(fr_log_fp, "%02x ", ptr[i]);
                                }
                                break;
                        }
 
-                       printf("%02x  %02x  ", ptr[0], ptr[1]);
+                       fprintf(fr_log_fp, "%02x  %02x  ", ptr[0], ptr[1]);
                        attrlen = ptr[1] - 2;
 
                        if ((ptr[0] == PW_VENDOR_SPECIFIC) &&
                            (attrlen > 4)) {
                                vendor = (ptr[3] << 16) | (ptr[4] << 8) | ptr[5];
-                               printf("%02x%02x%02x%02x (%u)  ",
+                               fprintf(fr_log_fp, "%02x%02x%02x%02x (%u)  ",
                                       ptr[2], ptr[3], ptr[4], ptr[5], vendor);
                                attrlen -= 4;
                                ptr += 6;
@@ -206,14 +222,9 @@ void rad_print_hex(RADIUS_PACKET *packet)
                                vendor = 0;
                        }
 
-                       for (i = 0; i < attrlen; i++) {
-                               if ((i > 0) && ((i & 0x0f) == 0x00))
-                                       printf("\t\t\t");
-                               printf("%02x ", ptr[i]);
-                               if ((i & 0x0f) == 0x0f) printf("\n");
-                       }
+                       print_hex_data(ptr, attrlen, 3);
 
-                       if ((attrlen & 0x0f) != 0x00) printf("\n");
+                       if ((attrlen & 0x0f) != 0x00) fprintf(fr_log_fp, "\n");
 
                        ptr += attrlen;
                        total -= attrlen;
@@ -759,11 +770,20 @@ static ssize_t vp2data_tlvs(const RADIUS_PACKET *packet,
                /* len can NEVER be more than 253 */
                
                ptr[1] += len;
+
+#ifndef NDEBUG
+               if ((fr_debug_flag > 3) && fr_log_fp) {
+                       fprintf(fr_log_fp, "\t\t%02x %02x  ", ptr[0], ptr[1]);
+                       print_hex_data(ptr + 2, len, 3);
+               }
+#endif
+
                room -= ptr[1];
                ptr += ptr[1];
                *pvp = vp;
                
                if (!do_next_tlv(old_vp, nest)) break;
+               debug_pair(vp);
        }
 
        return ptr - start;
@@ -1172,6 +1192,24 @@ int rad_vp2wimax(const RADIUS_PACKET *packet,
        ptr[1] += len;
        ptr[7] += len;
 
+#ifndef NDEBUG
+       if ((fr_debug_flag > 3) && fr_log_fp) {
+               DICT_ATTR *da;
+
+               da = dict_attrbyvalue(ptr[6], vp->vendor);
+               if (da && (da->type == PW_TYPE_TLV)) {
+                       fprintf(fr_log_fp, "\t%s = ...\n", da->name);
+               }
+
+               fprintf(fr_log_fp, "\t\t%02x %02x  %02x%02x%02x%02x (%u)  %02x %02x %02x   ",
+                      ptr[0], ptr[1],
+                      ptr[2], ptr[3], ptr[4], ptr[5],
+                      (ptr[3] << 16) | (ptr[4] << 8) | ptr[5],
+                      ptr[6], ptr[7], ptr[8]);
+               print_hex_data(ptr + 9, len, 3);
+       }
+#endif
+
        return (ptr + ptr[1]) - start;
 }
 
@@ -1200,6 +1238,13 @@ static ssize_t vp2attr_rfc(const RADIUS_PACKET *packet,
 
        ptr[1] += len;
 
+#ifndef NDEBUG
+       if ((fr_debug_flag > 3) && fr_log_fp) {
+               fprintf(fr_log_fp, "\t\t%02x %02x  ", ptr[0], ptr[1]);
+               print_hex_data(ptr + 2, len, 3);
+       }
+#endif
+
        return ptr[1];
 }
 
@@ -1243,15 +1288,25 @@ static ssize_t vp2attr_vsa(const RADIUS_PACKET *packet,
                ptr[1] = (attribute >> 16) & 0xff;
                ptr[2] = (attribute >> 8) & 0xff;
                ptr[3] = attribute & 0xff;
+#ifndef NDEBUG
+               if ((fr_debug_flag > 3) && fr_log_fp) fprintf(fr_log_fp, "\t\t%02x%02x%02x%02x ",
+                                             ptr[0], ptr[1], ptr[2], ptr[3]);
+#endif
                break;
 
        case 2:
                ptr[0] = (attribute >> 8) & 0xff;
                ptr[1] = attribute & 0xff;
+#ifndef NDEBUG
+               if ((fr_debug_flag > 3) && fr_log_fp) fprintf(fr_log_fp, "\t\t%02x%02x ", ptr[0], ptr[1]);
+#endif
                break;
 
        case 1:
                ptr[0] = attribute & 0xff;
+#ifndef NDEBUG
+               if ((fr_debug_flag > 3) && fr_log_fp) fprintf(fr_log_fp, "\t\t%02x ", ptr[0]);
+#endif
                break;
        }
 
@@ -1266,10 +1321,19 @@ static ssize_t vp2attr_vsa(const RADIUS_PACKET *packet,
 
        case 2:
                ptr[dv->type] = 0;
-               /* FALL-THROUGH */
+               ptr[dv->type + 1] = dv->type + 2;
+#ifndef NDEBUG
+               if ((fr_debug_flag > 3) && fr_log_fp) fprintf(fr_log_fp, "%02x%02x  ",
+                                             ptr[dv->type],
+                                             ptr[dv->type + 1]);
+#endif
+               break;
 
        case 1:
-               ptr[dv->type + dv->length - 1] = dv->type + dv->length;
+               ptr[dv->type] = dv->type;
+#ifndef NDEBUG
+               if ((fr_debug_flag > 3) && fr_log_fp) fprintf(fr_log_fp, "%02x  ", ptr[dv->type]);
+#endif
                break;
 
        }
@@ -1284,6 +1348,12 @@ static ssize_t vp2attr_vsa(const RADIUS_PACKET *packet,
 
        if (dv->length) ptr[dv->type + dv->length - 1] += len;
 
+#ifndef NDEBUG
+       if ((fr_debug_flag > 3) && fr_log_fp) {
+               print_hex_data(ptr + dv->type + dv->length, len, 3);
+       }
+#endif
+
        return dv->type + dv->length + len;
 }
 
@@ -1333,6 +1403,16 @@ int rad_vp2vsa(const RADIUS_PACKET *packet, const RADIUS_PACKET *original,
                          ptr + ptr[1], room);
        if (len < 0) return len;
 
+#ifndef NDEBUG
+       if ((fr_debug_flag > 3) && fr_log_fp) {
+               fprintf(fr_log_fp, "\t\t%02x %02x  %02x%02x%02x%02x (%u)  ",
+                      ptr[0], ptr[1],
+                      ptr[2], ptr[3], ptr[4], ptr[5],
+                      (ptr[3] << 16) | (ptr[4] << 8) | ptr[5]);
+               print_hex_data(ptr + 6, len, 3);
+       }
+#endif
+
        ptr[1] += len;
 
        return ptr[1];
@@ -1397,6 +1477,12 @@ int rad_vp2attr(const RADIUS_PACKET *packet, const RADIUS_PACKET *original,
                        start[0] = PW_MESSAGE_AUTHENTICATOR;
                        start[1] = 18;
                        memset(start + 2, 0, 16);
+#ifndef NDEBUG
+                       if ((fr_debug_flag > 3) && fr_log_fp) {
+                               fprintf(fr_log_fp, "\t\t50 12 ...\n");
+                       }
+#endif
+
                        *pvp = (*pvp)->next;
                        return 18;
                }
@@ -1777,7 +1863,7 @@ int rad_send(RADIUS_PACKET *packet, const RADIUS_PACKET *original,
        }
 
 #ifndef NDEBUG
-       if (fr_debug_flag > 3) rad_print_hex(packet);
+       if ((fr_debug_flag > 3) && fr_log_fp) rad_print_hex(packet);
 #endif
 
        /*
@@ -2391,7 +2477,7 @@ RADIUS_PACKET *rad_recv(int fd, int flags)
        }
 
 #ifndef NDEBUG
-       if (fr_debug_flag > 3) rad_print_hex(packet);
+       if ((fr_debug_flag > 3) && fr_log_fp) rad_print_hex(packet);
 #endif
 
        return packet;