diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2014-04-17 17:08:39 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2014-08-06 09:46:14 +0200 |
commit | a1829260243c2d338b14f7709b0a554eb558ac1c (patch) | |
tree | 726804ac37cb56bf75d18f21b048c176e370258f /src/pcap.c | |
parent | 9457685320fe418263952469737c3ffd00f9dbcc (diff) | |
download | libssh-a1829260243c2d338b14f7709b0a554eb558ac1c.tar.gz libssh-a1829260243c2d338b14f7709b0a554eb558ac1c.tar.xz libssh-a1829260243c2d338b14f7709b0a554eb558ac1c.zip |
buffers: adapt pcap.c to ssh_buffer_(un)pack()
Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'src/pcap.c')
-rw-r--r-- | src/pcap.c | 149 |
1 files changed, 53 insertions, 96 deletions
@@ -342,7 +342,7 @@ static int ssh_pcap_context_connect(ssh_pcap_context ctx){ int ssh_pcap_context_write(ssh_pcap_context ctx,enum ssh_pcap_direction direction , void *data, uint32_t len, uint32_t origlen){ ssh_buffer ip; - int err; + int rc; if(ctx==NULL || ctx->file ==NULL) return SSH_ERROR; if(ctx->connected==0) @@ -353,147 +353,104 @@ int ssh_pcap_context_write(ssh_pcap_context ctx,enum ssh_pcap_direction directio ssh_set_error_oom(ctx->session); return SSH_ERROR; } - /* build an IP packet */ - /* V4, 20 bytes */ - err = buffer_add_u8(ip,4 << 4 | 5); - if (err < 0) { - goto error; - } - /* tos */ - err = buffer_add_u8(ip,0); - if (err < 0) { - goto error; - } - /* total len */ - err = buffer_add_u16(ip,htons(origlen + TCPIPHDR_LEN)); - if (err < 0) { - goto error; - } - /* IP id number */ - err = buffer_add_u16(ip,htons(ctx->file->ipsequence)); - if (err < 0) { - goto error; - } + + /* build an IP packet */ + rc = ssh_buffer_pack(ip, + "bbwwwbbw", + 4 << 4 | 5, /* V4, 20 bytes */ + 0, /* tos */ + origlen + TCPIPHDR_LEN, /* total len */ + ctx->file->ipsequence, /* IP id number */ + 0, /* fragment offset */ + 64, /* TTL */ + 6, /* protocol TCP=6 */ + 0); /* checksum */ + ctx->file->ipsequence++; - /* fragment offset */ - err = buffer_add_u16(ip,htons(0)); - if (err < 0) { - goto error; - } - /* TTL */ - err = buffer_add_u8(ip,64); - if (err < 0) { - goto error; - } - /* protocol TCP=6 */ - err = buffer_add_u8(ip,6); - if (err < 0) { - goto error; - } - /* checksum */ - err = buffer_add_u16(ip,0); - if (err < 0) { - goto error; - } + if (rc != SSH_OK){ + goto error; + } if(direction==SSH_PCAP_DIR_OUT){ - err = buffer_add_u32(ip,ctx->ipsource); - if (err < 0) { + rc = buffer_add_u32(ip,ctx->ipsource); + if (rc < 0) { goto error; } - err = buffer_add_u32(ip,ctx->ipdest); - if (err < 0) { + rc = buffer_add_u32(ip,ctx->ipdest); + if (rc < 0) { goto error; } } else { - err = buffer_add_u32(ip,ctx->ipdest); - if (err < 0) { + rc = buffer_add_u32(ip,ctx->ipdest); + if (rc < 0) { goto error; } - err = buffer_add_u32(ip,ctx->ipsource); - if (err < 0) { + rc = buffer_add_u32(ip,ctx->ipsource); + if (rc < 0) { goto error; } } /* TCP */ if(direction==SSH_PCAP_DIR_OUT){ - err = buffer_add_u16(ip,ctx->portsource); - if (err < 0) { + rc = buffer_add_u16(ip,ctx->portsource); + if (rc < 0) { goto error; } - err = buffer_add_u16(ip,ctx->portdest); - if (err < 0) { + rc = buffer_add_u16(ip,ctx->portdest); + if (rc < 0) { goto error; } } else { - err = buffer_add_u16(ip,ctx->portdest); - if (err < 0) { + rc = buffer_add_u16(ip,ctx->portdest); + if (rc < 0) { goto error; } - err = buffer_add_u16(ip,ctx->portsource); - if (err < 0) { + rc = buffer_add_u16(ip,ctx->portsource); + if (rc < 0) { goto error; } } /* sequence number */ if(direction==SSH_PCAP_DIR_OUT){ - err = buffer_add_u32(ip,ntohl(ctx->outsequence)); - if (err < 0) { + rc = ssh_buffer_pack(ip, "d", ctx->outsequence); + if (rc != SSH_OK) { goto error; } ctx->outsequence+=origlen; } else { - err = buffer_add_u32(ip,ntohl(ctx->insequence)); - if (err < 0) { + rc = ssh_buffer_pack(ip, "d", ctx->insequence); + if (rc != SSH_OK) { goto error; } ctx->insequence+=origlen; } /* ack number */ if(direction==SSH_PCAP_DIR_OUT){ - err = buffer_add_u32(ip,ntohl(ctx->insequence)); - if (err < 0) { + rc = ssh_buffer_pack(ip, "d", ctx->insequence); + if (rc != SSH_OK) { goto error; } } else { - err = buffer_add_u32(ip,ntohl(ctx->outsequence)); - if (err < 0) { + rc = ssh_buffer_pack(ip, "d", ctx->outsequence); + if (rc != SSH_OK) { goto error; } } - /* header len = 20 = 5 * 32 bits, at offset 4*/ - err = buffer_add_u8(ip,5 << 4); - if (err < 0) { - goto error; - } - /* flags */ - err = buffer_add_u8(ip,TH_PUSH | TH_ACK); - if (err < 0) { - goto error; - } - /* window */ - err = buffer_add_u16(ip,htons(65535)); - if (err < 0) { - goto error; - } - /* checksum */ - err = buffer_add_u16(ip,htons(0)); - if (err < 0) { - goto error; - } - /* urgent data ptr */ - err = buffer_add_u16(ip,0); - if (err < 0) { - goto error; - } - /* actual data */ - err = ssh_buffer_add_data(ip, data, len); - if (err < 0) { + + rc = ssh_buffer_pack(ip, + "bbwwwP", + 5 << 4, /* header len = 20 = 5 * 32 bits, at offset 4*/ + TH_PUSH | TH_ACK, /* flags */ + 65535, /* window */ + 0, /* checksum */ + 0, /* urgent data ptr */ + (size_t)len, data); /* actual data */ + if (rc != SSH_OK) { goto error; } - err=ssh_pcap_file_write_packet(ctx->file,ip,origlen + TCPIPHDR_LEN); + rc=ssh_pcap_file_write_packet(ctx->file,ip,origlen + TCPIPHDR_LEN); error: ssh_buffer_free(ip); - return err; + return rc; } /** @brief sets the pcap file used to trace the session |