Skip to content

Commit

Permalink
add fr_vmps_print_hex()
Browse files Browse the repository at this point in the history
  • Loading branch information
alandekok committed May 4, 2018
1 parent 88db2e6 commit cc65661
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/modules/proto_vmps/vqp.c
Expand Up @@ -72,7 +72,9 @@ RCSID("$Id$")

char const *fr_vmps_codes[FR_MAX_VMPS_CODE] = {
[FR_VMPS_PACKET_TYPE_VALUE_VMPS_JOIN_REQUEST] = "VMPS-Join-Request",
[FR_VMPS_PACKET_TYPE_VALUE_VMPS_JOIN_RESPONSE] = "VMPS-Join-Response",
[FR_VMPS_PACKET_TYPE_VALUE_VMPS_RECONFIRM_REQUEST] = "VMPS-Reconfirm-Request",
[FR_VMPS_PACKET_TYPE_VALUE_VMPS_RECONFIRM_RESPONSE] = "VMPS-Reconfirm-Response",
};


Expand Down Expand Up @@ -687,3 +689,66 @@ ssize_t vqp_packet_size(uint8_t const *data, size_t data_len)
*/
return ptr - data;
}

static void print_hex_data(uint8_t const *ptr, int attrlen, int depth)
{
int i;
static char const 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";

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");
}


/** Print a raw VMPS packet as hex.
*
*/
void fr_vmps_print_hex(FILE *fp, uint8_t const *packet, size_t packet_len)
{
int length;
uint8_t const *attr, *end;
uint32_t id;

if (packet_len < 8) return;

fprintf(fp, " Version:\t\t%u\n", packet[0]);

if ((packet[1] > 0) && (packet[1] < FR_MAX_VMPS_CODE) && fr_vmps_codes[packet[1]]) {
fprintf(fp, " OpCode:\t\t%s\n", fr_vmps_codes[packet[1]]);
} else {
fprintf(fp, " OpCode:\t\t%u\n", packet[1]);
}

if ((packet[2] > 0) && (packet[2] < FR_MAX_VMPS_CODE) && fr_vmps_codes[packet[2]]) {
fprintf(fp, " OpCode:\t\t%s\n", fr_vmps_codes[packet[2]]);
} else {
fprintf(fp, " OpCode:\t\t%u\n", packet[2]);
}

fprintf(fp, " Data Count:\t\t%u\n", packet[3]);

memcpy(&id, packet + 4, 4);
id = ntohl(id);

fprintf(fp, " ID:\t%08x\n", id);

if (packet_len == 8) return;

for (attr = packet + 8, end = packet + packet_len;
attr < end;
attr += length) {
memcpy(&id, attr, 4);
id = ntohl(id);

length = (attr[4] << 8) | attr[5];

fprintf(fp, "\t\t%08x %04x ", id, length);

print_hex_data(attr + 5, length, 3);
}
}
1 change: 1 addition & 0 deletions src/modules/proto_vmps/vqp.h
Expand Up @@ -41,6 +41,7 @@ int vqp_send(RADIUS_PACKET *packet);
int vqp_decode(RADIUS_PACKET *packet);
int vqp_encode(RADIUS_PACKET *packet, RADIUS_PACKET *original);
ssize_t vqp_packet_size(uint8_t const *data, size_t data_len);
void fr_vmps_print_hex(FILE *fp, uint8_t const *packet, size_t packet_len);

extern char const *fr_vmps_codes[FR_MAX_VMPS_CODE];

Expand Down

0 comments on commit cc65661

Please sign in to comment.