aboutsummaryrefslogtreecommitdiffstats
path: root/libglouglou/libglouglou.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglouglou/libglouglou.c')
-rw-r--r--libglouglou/libglouglou.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/libglouglou/libglouglou.c b/libglouglou/libglouglou.c
index f702d2a..9f41313 100644
--- a/libglouglou/libglouglou.c
+++ b/libglouglou/libglouglou.c
@@ -50,6 +50,8 @@ gg_packet_props_t gg_packet_props[] = {
{ (PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.data) },
[PACKET_NAME] = \
{ ((PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.name) - GG_PKTARG_MAX) },
+ [PACKET_TRACE] = \
+ { ((PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.trace) - (sizeof(struct gg_packet_tracehop) * GG_PKTARG_MAX)) },
[PACKET_FORK] = \
{ (PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.fork) },
[PACKET_EXEC] = \
@@ -514,8 +516,7 @@ pkt_decode(char **buf, int *buf_len)
{
static struct gg_packet newpkt;
struct gg_packet *pkt;
- int len;
- int packet_len;
+ int i, len, packet_len;
len = *buf_len;
@@ -566,6 +567,22 @@ pkt_decode(char **buf, int *buf_len)
strncpy((char *)newpkt.name_fqdn, (char *)pkt->name_fqdn,
newpkt.name_len);
break;
+ case PACKET_TRACE:
+ newpkt.trace_addr = ntohl(pkt->trace_addr);
+ newpkt.trace_hopcount = pkt->trace_hopcount;
+ if (newpkt.trace_hopcount > GG_PKTARG_MAX)
+ invalid("type trace hopcount");
+ packet_len = packet_len \
+ + newpkt.trace_hopcount * sizeof(struct gg_packet_tracehop);
+ if (len < packet_len)
+ goto incomplete;
+ for (i=0; i<newpkt.trace_hopcount; i++) {
+ newpkt.trace_hops[i].addr = ntohl(pkt->trace_hops[i].addr);
+ newpkt.trace_hops[i].delay = ntohs(pkt->trace_hops[i].delay);
+ newpkt.trace_hops[i].loss = pkt->trace_hops[i].loss;
+ newpkt.trace_hops[i].asn = pkt->trace_hops[i].asn;
+ }
+ break;
case PACKET_FORK:
newpkt.fork_pid = ntohl(pkt->fork_pid);
newpkt.fork_ppid = ntohl(pkt->fork_ppid);
@@ -615,6 +632,8 @@ invalid:
int
pkt_encode(struct gg_packet *pkt, struct gg_packet *newpkt)
{
+ int i;
+
if (pkt->type < PACKET_TYPE_MIN || pkt->type > PACKET_TYPE_MAX)
invalid("type");
@@ -643,6 +662,18 @@ pkt_encode(struct gg_packet *pkt, struct gg_packet *newpkt)
strncpy((char *)newpkt->name_fqdn, (char *)pkt->name_fqdn,
pkt->name_len);
break;
+ case PACKET_TRACE:
+ if (pkt->trace_hopcount > GG_PKTARG_MAX)
+ goto invalid;
+ newpkt->trace_addr = htonl(pkt->trace_addr);
+ newpkt->trace_hopcount = pkt->trace_hopcount;
+ for (i=0; i<newpkt->trace_hopcount; i++) {
+ newpkt->trace_hops[i].addr = htonl(pkt->trace_hops[i].addr);
+ newpkt->trace_hops[i].delay = htons(pkt->trace_hops[i].delay);
+ newpkt->trace_hops[i].loss = pkt->trace_hops[i].loss;
+ newpkt->trace_hops[i].asn = pkt->trace_hops[i].asn;
+ }
+ break;
case PACKET_FORK:
newpkt->fork_pid = htonl(pkt->fork_pid);
newpkt->fork_ppid = htonl(pkt->fork_ppid);
@@ -691,6 +722,11 @@ pkt_getsize(struct gg_packet *pkt)
goto invalid;
packet_len = packet_len + pkt->name_len;
break;
+ case PACKET_TRACE:
+ if (pkt->trace_hopcount > GG_PKTARG_MAX)
+ goto invalid;
+ packet_len = packet_len + pkt->trace_hopcount * sizeof(struct gg_packet_tracehop);
+ break;
case PACKET_EXEC:
if (pkt->exec_cmdlen > GG_PKTARG_MAX)
goto invalid;