#include "config.h"
#endif
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
#include <stdlib.h>
#include <string.h>
-#include "interface.h"
+#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
#include "tcp.h"
#include "ip.h"
-#ifdef INET6
#include "ip6.h"
-#endif
#include "ipproto.h"
#include "rpc_auth.h"
#include "rpc_msg.h"
-#include "nameser.h"
-
#ifdef HAVE_LIBCRYPTO
#include <openssl/md5.h>
-#include <signature.h>
+#include "signature.h"
static int tcp_verify_signature(netdissect_options *ndo,
const struct ip *ip, const struct tcphdr *tp,
tcp_seq ack;
};
-#ifdef INET6
struct tha6 {
struct in6_addr src;
struct in6_addr dst;
tcp_seq seq;
tcp_seq ack;
};
-#endif
#define TSEQ_HASHSIZE 919
#define ZEROLENOPT(o) ((o) == TCPOPT_EOL || (o) == TCPOPT_NOP)
static struct tcp_seq_hash tcp_seq_hash4[TSEQ_HASHSIZE];
-#ifdef INET6
static struct tcp_seq_hash6 tcp_seq_hash6[TSEQ_HASHSIZE];
-#endif
static const struct tok tcp_flag_values[] = {
{ TH_FIN, "F" },
u_int utoval;
uint16_t magic;
register int rev;
-#ifdef INET6
register const struct ip6_hdr *ip6;
-#endif
- tp = (struct tcphdr *)bp;
- ip = (struct ip *)bp2;
-#ifdef INET6
+ tp = (const struct tcphdr *)bp;
+ ip = (const struct ip *)bp2;
if (IP_V(ip) == 6)
- ip6 = (struct ip6_hdr *)bp2;
+ ip6 = (const struct ip6_hdr *)bp2;
else
ip6 = NULL;
-#endif /*INET6*/
ch = '\0';
if (!ND_TTEST(tp->th_dport)) {
ND_PRINT((ndo, "%s > %s: [|tcp]",
hlen = TH_OFF(tp) * 4;
-#ifdef INET6
if (ip6) {
if (ip6->ip6_nxt == IPPROTO_TCP) {
ND_PRINT((ndo, "%s.%s > %s.%s: ",
ip6addr_string(ndo, &ip6->ip6_src),
- tcpport_string(sport),
+ tcpport_string(ndo, sport),
ip6addr_string(ndo, &ip6->ip6_dst),
- tcpport_string(dport)));
+ tcpport_string(ndo, dport)));
} else {
ND_PRINT((ndo, "%s > %s: ",
- tcpport_string(sport), tcpport_string(dport)));
+ tcpport_string(ndo, sport), tcpport_string(ndo, dport)));
}
- } else
-#endif /*INET6*/
- {
+ } else {
if (ip->ip_p == IPPROTO_TCP) {
ND_PRINT((ndo, "%s.%s > %s.%s: ",
ipaddr_string(ndo, &ip->ip_src),
- tcpport_string(sport),
+ tcpport_string(ndo, sport),
ipaddr_string(ndo, &ip->ip_dst),
- tcpport_string(dport)));
+ tcpport_string(ndo, dport)));
} else {
ND_PRINT((ndo, "%s > %s: ",
- tcpport_string(sport), tcpport_string(dport)));
+ tcpport_string(ndo, sport), tcpport_string(ndo, dport)));
}
}
* both directions).
*/
rev = 0;
-#ifdef INET6
if (ip6) {
register struct tcp_seq_hash6 *th;
struct tcp_seq_hash6 *tcp_seq_hash;
th->nxt = (struct tcp_seq_hash6 *)
calloc(1, sizeof(*th));
if (th->nxt == NULL)
- error("tcp_print: calloc");
+ (*ndo->ndo_error)(ndo,
+ "tcp_print: calloc");
}
th->addr = tha;
if (rev)
thseq = th->seq;
thack = th->ack;
} else {
-#else /*INET6*/
- {
-#endif /*INET6*/
register struct tcp_seq_hash *th;
struct tcp_seq_hash *tcp_seq_hash;
const struct in_addr *src, *dst;
th->nxt = (struct tcp_seq_hash *)
calloc(1, sizeof(*th));
if (th->nxt == NULL)
- error("tcp_print: calloc");
+ (*ndo->ndo_error)(ndo,
+ "tcp_print: calloc");
}
th->addr = tha;
if (rev)
else
ND_PRINT((ndo, " (correct)"));
}
- }
-#ifdef INET6
- else if (IP_V(ip) == 6 && ip6->ip6_plen) {
+ } else if (IP_V(ip) == 6 && ip6->ip6_plen) {
if (ND_TTEST2(tp->th_sport, length)) {
sum = nextproto6_cksum(ip6, (const uint8_t *)tp,
length, length, IPPROTO_TCP);
}
}
-#endif
}
length -= hlen;
case TCPOPT_SACK:
datalen = len - 2;
if (datalen % 8 != 0) {
- ND_PRINT((ndo, "malformed sack"));
+ ND_PRINT((ndo, "invalid sack"));
} else {
uint32_t s, e;
ND_PRINT((ndo, ": "));
rtsp_print(ndo, bp, length);
} else if (length > 2 &&
- (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT ||
- sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) {
+ (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT)) {
/*
* TCP DNS query has 2byte length at the head.
* XXX packet could be unaligned, it can go strange
* to NFS print routines.
*/
uint32_t fraglen;
- register struct sunrpc_msg *rp;
+ register const struct sunrpc_msg *rp;
enum sunrpc_msg_type direction;
fraglen = EXTRACT_32BITS(bp) & 0x7FFFFFFF;
if (fraglen > (length) - 4)
fraglen = (length) - 4;
- rp = (struct sunrpc_msg *)(bp + 4);
+ rp = (const struct sunrpc_msg *)(bp + 4);
if (ND_TTEST(rp->rm_direction)) {
direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
if (dport == NFS_PORT && direction == SUNRPC_CALL) {
ND_PRINT((ndo, ": NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
- nfsreq_print_noaddr(ndo, (u_char *)rp, fraglen, (u_char *)ip);
+ nfsreq_print_noaddr(ndo, (const u_char *)rp, fraglen, (const u_char *)ip);
return;
}
if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
ND_PRINT((ndo, ": NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
- nfsreply_print_noaddr(ndo, (u_char *)rp, fraglen, (u_char *)ip);
+ nfsreply_print_noaddr(ndo, (const u_char *)rp, fraglen, (const u_char *)ip);
return;
}
}
} else {
/* Fast Open Cookie */
if (datalen % 2 != 0 || datalen < 4 || datalen > 16) {
- ND_PRINT((ndo, " malformed"));
+ ND_PRINT((ndo, " invalid"));
} else {
ND_PRINT((ndo, " cookie "));
for (i = 0; i < datalen; ++i)
char zero_proto = 0;
MD5_CTX ctx;
uint16_t savecsum, tlen;
-#ifdef INET6
- struct ip6_hdr *ip6;
+ const struct ip6_hdr *ip6;
uint32_t len32;
uint8_t nxt;
-#endif
if (data + length > ndo->ndo_snapend) {
ND_PRINT((ndo, "snaplen too short, "));
* Step 1: Update MD5 hash with IP pseudo-header.
*/
if (IP_V(ip) == 4) {
- MD5_Update(&ctx, (char *)&ip->ip_src, sizeof(ip->ip_src));
- MD5_Update(&ctx, (char *)&ip->ip_dst, sizeof(ip->ip_dst));
- MD5_Update(&ctx, (char *)&zero_proto, sizeof(zero_proto));
- MD5_Update(&ctx, (char *)&ip->ip_p, sizeof(ip->ip_p));
+ MD5_Update(&ctx, (const char *)&ip->ip_src, sizeof(ip->ip_src));
+ MD5_Update(&ctx, (const char *)&ip->ip_dst, sizeof(ip->ip_dst));
+ MD5_Update(&ctx, (const char *)&zero_proto, sizeof(zero_proto));
+ MD5_Update(&ctx, (const char *)&ip->ip_p, sizeof(ip->ip_p));
tlen = EXTRACT_16BITS(&ip->ip_len) - IP_HL(ip) * 4;
tlen = htons(tlen);
- MD5_Update(&ctx, (char *)&tlen, sizeof(tlen));
-#ifdef INET6
+ MD5_Update(&ctx, (const char *)&tlen, sizeof(tlen));
} else if (IP_V(ip) == 6) {
- ip6 = (struct ip6_hdr *)ip;
- MD5_Update(&ctx, (char *)&ip6->ip6_src, sizeof(ip6->ip6_src));
- MD5_Update(&ctx, (char *)&ip6->ip6_dst, sizeof(ip6->ip6_dst));
+ ip6 = (const struct ip6_hdr *)ip;
+ MD5_Update(&ctx, (const char *)&ip6->ip6_src, sizeof(ip6->ip6_src));
+ MD5_Update(&ctx, (const char *)&ip6->ip6_dst, sizeof(ip6->ip6_dst));
len32 = htonl(EXTRACT_16BITS(&ip6->ip6_plen));
- MD5_Update(&ctx, (char *)&len32, sizeof(len32));
+ MD5_Update(&ctx, (const char *)&len32, sizeof(len32));
nxt = 0;
- MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
- MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
- MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
+ MD5_Update(&ctx, (const char *)&nxt, sizeof(nxt));
+ MD5_Update(&ctx, (const char *)&nxt, sizeof(nxt));
+ MD5_Update(&ctx, (const char *)&nxt, sizeof(nxt));
nxt = IPPROTO_TCP;
- MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
-#endif
+ MD5_Update(&ctx, (const char *)&nxt, sizeof(nxt));
} else {
-#ifdef INET6
ND_PRINT((ndo, "IP version not 4 or 6, "));
-#else
- ND_PRINT((ndo, "IP version not 4, "));
-#endif
return (CANT_CHECK_SIGNATURE);
}
*/
savecsum = tp1.th_sum;
tp1.th_sum = 0;
- MD5_Update(&ctx, (char *)&tp1, sizeof(struct tcphdr));
+ MD5_Update(&ctx, (const char *)&tp1, sizeof(struct tcphdr));
tp1.th_sum = savecsum;
/*
* Step 3: Update MD5 hash with TCP segment data, if present.