* BSD-style license that accompanies tcpdump or the GNU GPL version 2
*/
+/* \summary: Datagram Congestion Control Protocol (DCCP) printer */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
#include <stdio.h>
#include <string.h>
-#include "interface.h"
+#include "netdissect.h"
#include "addrtoname.h"
-#include "extract.h" /* must come after interface.h */
+#include "extract.h"
#include "ip.h"
-#ifdef INET6
#include "ip6.h"
-#endif
#include "ipproto.h"
/* RFC4340: Datagram Congestion Control Protocol (DCCP) */
dccp_csum_coverage(dh, len), IPPROTO_DCCP);
}
-#ifdef INET6
-static int dccp6_cksum(const struct ip6_hdr *ip6, const struct dccp_hdr *dh, u_int len)
+static int dccp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6,
+ const struct dccp_hdr *dh, u_int len)
{
- return nextproto6_cksum(ip6, (const uint8_t *)(const void *)dh, len,
+ return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)dh, len,
dccp_csum_coverage(dh, len), IPPROTO_DCCP);
}
-#endif
static const char *dccp_reset_code(uint8_t code)
{
if (DCCPH_X(dh) != 0) {
const struct dccp_hdr_ext *dhx = (const struct dccp_hdr_ext *)bp;
- seqno = EXTRACT_48BITS(dhx->dccph_seq);
+ seqno = EXTRACT_BE_U_6(dhx->dccph_seq);
} else {
- seqno = EXTRACT_24BITS(dh->dccph_seq);
+ seqno = EXTRACT_BE_U_3(dh->dccph_seq);
}
return seqno;
uint64_t ackno;
if (DCCPH_X(dh) != 0) {
- ND_TCHECK2(*ackp, 8);
- ackno = EXTRACT_48BITS(ackp + 2);
+ ND_TCHECK_8(ackp);
+ ackno = EXTRACT_BE_U_6(ackp + 2);
} else {
- ND_TCHECK2(*ackp, 4);
- ackno = EXTRACT_24BITS(ackp + 1);
+ ND_TCHECK_4(ackp);
+ ackno = EXTRACT_BE_U_3(ackp + 1);
}
ND_PRINT((ndo, "(ack=%" PRIu64 ") ", ackno));
* @data2 - beginning of enclosing
* @len - lenght of ip packet
*/
-void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2,
- u_int len)
+void
+dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2,
+ u_int len)
{
const struct dccp_hdr *dh;
const struct ip *ip;
-#ifdef INET6
const struct ip6_hdr *ip6;
-#endif
const u_char *cp;
u_short sport, dport;
u_int hlen;
dh = (const struct dccp_hdr *)bp;
ip = (const struct ip *)data2;
-#ifdef INET6
if (IP_V(ip) == 6)
ip6 = (const struct ip6_hdr *)data2;
else
ip6 = NULL;
-#endif /*INET6*/
/* make sure we have enough data to look at the X bit */
cp = (const u_char *)(dh + 1);
len - fixed_hdrlen));
return;
}
- ND_TCHECK2(*dh, fixed_hdrlen);
+ ND_TCHECK_LEN(dh, fixed_hdrlen);
- sport = EXTRACT_16BITS(&dh->dccph_sport);
- dport = EXTRACT_16BITS(&dh->dccph_dport);
+ sport = EXTRACT_BE_U_2(&dh->dccph_sport);
+ dport = EXTRACT_BE_U_2(&dh->dccph_dport);
hlen = dh->dccph_doff * 4;
-#ifdef INET6
if (ip6) {
ND_PRINT((ndo, "%s.%d > %s.%d: ",
ip6addr_string(ndo, &ip6->ip6_src), sport,
ip6addr_string(ndo, &ip6->ip6_dst), dport));
- } else
-#endif /*INET6*/
- {
+ } else {
ND_PRINT((ndo, "%s.%d > %s.%d: ",
ipaddr_string(ndo, &ip->ip_src), sport,
ipaddr_string(ndo, &ip->ip_dst), dport));
}
/* checksum calculation */
- if (ndo->ndo_vflag && ND_TTEST2(bp[0], len)) {
+ if (ndo->ndo_vflag && ND_TTEST_LEN(bp, len)) {
uint16_t sum = 0, dccp_sum;
- dccp_sum = EXTRACT_16BITS(&dh->dccph_checksum);
+ dccp_sum = EXTRACT_BE_U_2(&dh->dccph_checksum);
ND_PRINT((ndo, "cksum 0x%04x ", dccp_sum));
if (IP_V(ip) == 4)
sum = dccp_cksum(ndo, ip, dh, len);
-#ifdef INET6
else if (IP_V(ip) == 6)
- sum = dccp6_cksum(ip6, dh, len);
-#endif
+ sum = dccp6_cksum(ndo, ip6, dh, len);
if (sum != 0)
ND_PRINT((ndo, "(incorrect -> 0x%04x)",in_cksum_shouldbe(dccp_sum, sum)));
else
ND_TCHECK(*dhr);
ND_PRINT((ndo, "%s (service=%d) ",
tok2str(dccp_pkt_type_str, "", dccph_type),
- EXTRACT_32BITS(&dhr->dccph_req_service)));
+ EXTRACT_BE_U_4(&dhr->dccph_req_service)));
break;
}
case DCCP_PKT_RESPONSE: {
ND_TCHECK(*dhr);
ND_PRINT((ndo, "%s (service=%d) ",
tok2str(dccp_pkt_type_str, "", dccph_type),
- EXTRACT_32BITS(&dhr->dccph_resp_service)));
+ EXTRACT_BE_U_4(&dhr->dccph_resp_service)));
break;
}
case DCCP_PKT_DATA:
/* process options */
if (hlen > fixed_hdrlen){
- const u_char *cp;
u_int optlen;
cp = bp + fixed_hdrlen;
ND_PRINT((ndo, " <"));
{
uint8_t optlen, i;
- ND_TCHECK(*option);
+ ND_TCHECK_1(option);
- if (*option >= 32) {
- ND_TCHECK(*(option+1));
- optlen = *(option +1);
+ if (EXTRACT_U_1(option) >= 32) {
+ ND_TCHECK_1(option + 1);
+ optlen = EXTRACT_U_1(option + 1);
if (optlen < 2) {
- if (*option >= 128)
- ND_PRINT((ndo, "CCID option %u optlen too short", *option));
+ if (EXTRACT_U_1(option) >= 128)
+ ND_PRINT((ndo, "CCID option %u optlen too short", EXTRACT_U_1(option)));
else
ND_PRINT((ndo, "%s optlen too short",
- tok2str(dccp_option_values, "Option %u", *option)));
+ tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option))));
return 0;
}
} else
optlen = 1;
if (hlen < optlen) {
- if (*option >= 128)
+ if (EXTRACT_U_1(option) >= 128)
ND_PRINT((ndo, "CCID option %u optlen goes past header length",
- *option));
+ EXTRACT_U_1(option)));
else
ND_PRINT((ndo, "%s optlen goes past header length",
- tok2str(dccp_option_values, "Option %u", *option)));
+ tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option))));
return 0;
}
- ND_TCHECK2(*option, optlen);
+ ND_TCHECK_LEN(option, optlen);
- if (*option >= 128) {
- ND_PRINT((ndo, "CCID option %d", *option));
+ if (EXTRACT_U_1(option) >= 128) {
+ ND_PRINT((ndo, "CCID option %d", EXTRACT_U_1(option)));
switch (optlen) {
case 4:
- ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2)));
+ ND_PRINT((ndo, " %u", EXTRACT_BE_U_2(option + 2)));
break;
case 6:
- ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2)));
break;
default:
break;
}
} else {
- ND_PRINT((ndo, "%s", tok2str(dccp_option_values, "Option %u", *option)));
- switch (*option) {
+ ND_PRINT((ndo, "%s", tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option))));
+ switch (EXTRACT_U_1(option)) {
case 32:
case 33:
case 34:
ND_PRINT((ndo, " optlen too short"));
return optlen;
}
- if (*(option + 2) < 10){
- ND_PRINT((ndo, " %s", dccp_feature_nums[*(option + 2)]));
+ if (EXTRACT_U_1(option + 2) < 10){
+ ND_PRINT((ndo, " %s", dccp_feature_nums[EXTRACT_U_1(option + 2)]));
for (i = 0; i < optlen - 3; i++)
- ND_PRINT((ndo, " %d", *(option + 3 + i)));
+ ND_PRINT((ndo, " %d", EXTRACT_U_1(option + 3 + i)));
}
break;
case 36:
if (optlen > 2) {
ND_PRINT((ndo, " 0x"));
for (i = 0; i < optlen - 2; i++)
- ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i)));
}
break;
case 37:
for (i = 0; i < optlen - 2; i++)
- ND_PRINT((ndo, " %d", *(option + 2 + i)));
+ ND_PRINT((ndo, " %d", EXTRACT_U_1(option + 2 + i)));
break;
case 38:
if (optlen > 2) {
ND_PRINT((ndo, " 0x"));
for (i = 0; i < optlen - 2; i++)
- ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i)));
}
break;
case 39:
if (optlen > 2) {
ND_PRINT((ndo, " 0x"));
for (i = 0; i < optlen - 2; i++)
- ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i)));
}
break;
case 40:
if (optlen > 2) {
ND_PRINT((ndo, " 0x"));
for (i = 0; i < optlen - 2; i++)
- ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i)));
}
break;
case 41:
if (optlen == 4)
- ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2)));
else
ND_PRINT((ndo, " optlen != 4"));
break;
case 42:
if (optlen == 4)
- ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2)));
else
ND_PRINT((ndo, " optlen != 4"));
break;
case 43:
if (optlen == 6)
- ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2)));
+ ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2)));
else if (optlen == 4)
- ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2)));
+ ND_PRINT((ndo, " %u", EXTRACT_BE_U_2(option + 2)));
else
ND_PRINT((ndo, " optlen != 4 or 6"));
break;
if (optlen > 2) {
ND_PRINT((ndo, " "));
for (i = 0; i < optlen - 2; i++)
- ND_PRINT((ndo, "%02x", *(option + 2 + i)));
+ ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i)));
}
break;
}