summaryrefslogtreecommitdiff
path: root/print-rx.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2017-12-10 16:23:34 -0800
committerGuy Harris <guy@alum.mit.edu>2017-12-10 16:23:34 -0800
commit3f3f2505f2a02fcc471f7baba884959ccb2233c9 (patch)
tree7d3eaab1e2ead51f2b0ead6b42ee0e6e3c031ee8 /print-rx.c
parentfa2faabe6139e9d4b2596b3989318d965075a197 (diff)
downloadtcpdump-3f3f2505f2a02fcc471f7baba884959ccb2233c9.tar.gz
Make nd_uint8_t and nd_int8_t arrays, to catch direct references.
This catches direct references, so we can change them to use EXTRACT_U_1 or EXTRACT_S_1. Also, change some structures to use the nd_ types that weren't already using them. Then make the appropriate EXTRACT_{U,S}_1() changes.
Diffstat (limited to 'print-rx.c')
-rw-r--r--print-rx.c146
1 files changed, 82 insertions, 64 deletions
diff --git a/print-rx.c b/print-rx.c
index f6e738d7..3f3eea1a 100644
--- a/print-rx.c
+++ b/print-rx.c
@@ -112,15 +112,18 @@ struct rx_header {
#define RX_MAXACKS 255
struct rx_ackPacket {
- uint16_t bufferSpace; /* Number of packet buffers available */
- uint16_t maxSkew; /* Max diff between ack'd packet and */
+ nd_uint16_t bufferSpace; /* Number of packet buffers available */
+ nd_uint16_t maxSkew; /* Max diff between ack'd packet and */
/* highest packet received */
- uint32_t firstPacket; /* The first packet in ack list */
- uint32_t previousPacket; /* Previous packet recv'd (obsolete) */
- uint32_t serial; /* # of packet that prompted the ack */
- uint8_t reason; /* Reason for acknowledgement */
- uint8_t nAcks; /* Number of acknowledgements */
+ nd_uint32_t firstPacket; /* The first packet in ack list */
+ nd_uint32_t previousPacket; /* Previous packet recv'd (obsolete) */
+ nd_uint32_t serial; /* # of packet that prompted the ack */
+ nd_uint8_t reason; /* Reason for acknowledgement */
+ nd_uint8_t nAcks; /* Number of acknowledgements */
+ /* Followed by nAcks acknowledgments */
+#if 0
uint8_t acks[RX_MAXACKS]; /* Up to RX_MAXACKS acknowledgements */
+#endif
};
/*
@@ -528,6 +531,7 @@ rx_print(netdissect_options *ndo,
{
register const struct rx_header *rxh;
uint32_t i;
+ uint8_t type, flags;
uint32_t opcode;
if (!ND_TTEST2(*bp, sizeof (struct rx_header))) {
@@ -537,30 +541,32 @@ rx_print(netdissect_options *ndo,
rxh = (const struct rx_header *) bp;
- ND_PRINT((ndo, " rx %s", tok2str(rx_types, "type %u", rxh->type)));
+ type = EXTRACT_U_1(rxh->type);
+ ND_PRINT((ndo, " rx %s", tok2str(rx_types, "type %u", type)));
+ flags = EXTRACT_U_1(rxh->flags);
if (ndo->ndo_vflag) {
int firstflag = 0;
if (ndo->ndo_vflag > 1)
ND_PRINT((ndo, " cid %08x call# %u",
- EXTRACT_BE_U_4(&rxh->cid),
- EXTRACT_BE_U_4(&rxh->callNumber)));
+ EXTRACT_BE_U_4(rxh->cid),
+ EXTRACT_BE_U_4(rxh->callNumber)));
ND_PRINT((ndo, " seq %u ser %u",
- EXTRACT_BE_U_4(&rxh->seq),
- EXTRACT_BE_U_4(&rxh->serial)));
+ EXTRACT_BE_U_4(rxh->seq),
+ EXTRACT_BE_U_4(rxh->serial)));
if (ndo->ndo_vflag > 2)
ND_PRINT((ndo, " secindex %u serviceid %hu",
- rxh->securityIndex,
- EXTRACT_BE_U_2(&rxh->serviceId)));
+ EXTRACT_U_1(rxh->securityIndex),
+ EXTRACT_BE_U_2(rxh->serviceId)));
if (ndo->ndo_vflag > 1)
for (i = 0; i < NUM_RX_FLAGS; i++) {
- if (rxh->flags & rx_flags[i].flag &&
+ if (flags & rx_flags[i].flag &&
(!rx_flags[i].packetType ||
- rxh->type == rx_flags[i].packetType)) {
+ type == rx_flags[i].packetType)) {
if (!firstflag) {
firstflag = 1;
ND_PRINT((ndo, " "));
@@ -581,9 +587,9 @@ rx_print(netdissect_options *ndo,
* as well.
*/
- if (rxh->type == RX_PACKET_TYPE_DATA &&
- EXTRACT_BE_U_4(&rxh->seq) == 1 &&
- rxh->flags & RX_CLIENT_INITIATED) {
+ if (type == RX_PACKET_TYPE_DATA &&
+ EXTRACT_BE_U_4(rxh->seq) == 1 &&
+ flags & RX_CLIENT_INITIATED) {
/*
* Insert this call into the call cache table, so we
@@ -625,10 +631,10 @@ rx_print(netdissect_options *ndo,
* because printing out the return code can be useful at times.
*/
- } else if (((rxh->type == RX_PACKET_TYPE_DATA &&
- EXTRACT_BE_U_4(&rxh->seq) == 1) ||
- rxh->type == RX_PACKET_TYPE_ABORT) &&
- (rxh->flags & RX_CLIENT_INITIATED) == 0 &&
+ } else if (((type == RX_PACKET_TYPE_DATA &&
+ EXTRACT_BE_U_4(rxh->seq) == 1) ||
+ type == RX_PACKET_TYPE_ABORT) &&
+ (flags & RX_CLIENT_INITIATED) == 0 &&
rx_cache_find(rxh, (const struct ip *) bp2,
sport, &opcode)) {
@@ -664,7 +670,7 @@ rx_print(netdissect_options *ndo,
* ack packet, so we can use one for all AFS services)
*/
- } else if (rxh->type == RX_PACKET_TYPE_ACK)
+ } else if (type == RX_PACKET_TYPE_ACK)
rx_ack_print(ndo, bp, length);
@@ -690,11 +696,11 @@ rx_cache_insert(netdissect_options *ndo,
if (++rx_cache_next >= RX_CACHE_SIZE)
rx_cache_next = 0;
- rxent->callnum = EXTRACT_BE_U_4(&rxh->callNumber);
+ rxent->callnum = EXTRACT_BE_U_4(rxh->callNumber);
UNALIGNED_MEMCPY(&rxent->client, &ip->ip_src, sizeof(uint32_t));
UNALIGNED_MEMCPY(&rxent->server, &ip->ip_dst, sizeof(uint32_t));
rxent->dport = dport;
- rxent->serviceId = EXTRACT_BE_U_4(&rxh->serviceId);
+ rxent->serviceId = EXTRACT_BE_U_4(rxh->serviceId);
rxent->opcode = EXTRACT_BE_U_4(bp + sizeof(struct rx_header));
}
@@ -722,10 +728,10 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, u_int sport,
i = rx_cache_hint;
do {
rxent = &rx_cache[i];
- if (rxent->callnum == EXTRACT_BE_U_4(&rxh->callNumber) &&
+ if (rxent->callnum == EXTRACT_BE_U_4(rxh->callNumber) &&
rxent->client.s_addr == clip &&
rxent->server.s_addr == sip &&
- rxent->serviceId == EXTRACT_BE_U_4(&rxh->serviceId) &&
+ rxent->serviceId == EXTRACT_BE_U_4(rxh->serviceId) &&
rxent->dport == sport) {
/* We got a match! */
@@ -1057,6 +1063,7 @@ fs_reply_print(netdissect_options *ndo,
{
uint32_t i;
const struct rx_header *rxh;
+ uint8_t type;
if (length <= sizeof(struct rx_header))
return;
@@ -1070,13 +1077,14 @@ fs_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " fs reply %s", tok2str(fs_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response
*/
- if (rxh->type == RX_PACKET_TYPE_DATA) {
+ if (type == RX_PACKET_TYPE_DATA) {
switch (opcode) {
case 131: /* Fetch ACL */
{
@@ -1106,7 +1114,7 @@ fs_reply_print(netdissect_options *ndo,
default:
;
}
- } else if (rxh->type == RX_PACKET_TYPE_ABORT) {
+ } else if (type == RX_PACKET_TYPE_ABORT) {
/*
* Otherwise, just print out the return code
*/
@@ -1118,7 +1126,7 @@ fs_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " error %s", tok2str(afs_fs_errors, "#%d", errcode)));
} else {
- ND_PRINT((ndo, " strange fs reply of type %u", rxh->type));
+ ND_PRINT((ndo, " strange fs reply of type %u", type));
}
return;
@@ -1300,6 +1308,7 @@ cb_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
if (length <= sizeof(struct rx_header))
return;
@@ -1313,13 +1322,14 @@ cb_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " cb reply %s", tok2str(cb_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response.
*/
- if (rxh->type == RX_PACKET_TYPE_DATA)
+ if (type == RX_PACKET_TYPE_DATA)
switch (opcode) {
case 213: /* InitCallBackState3 */
AFSUUIDOUT();
@@ -1491,6 +1501,7 @@ prot_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
uint32_t i;
if (length < sizeof(struct rx_header))
@@ -1513,13 +1524,14 @@ prot_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " reply %s", tok2str(pt_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response
*/
- if (rxh->type == RX_PACKET_TYPE_DATA)
+ if (type == RX_PACKET_TYPE_DATA)
switch (opcode) {
case 504: /* Name to ID */
{
@@ -1695,6 +1707,7 @@ vldb_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
uint32_t i;
if (length < sizeof(struct rx_header))
@@ -1717,13 +1730,14 @@ vldb_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " reply %s", tok2str(vldb_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response
*/
- if (rxh->type == RX_PACKET_TYPE_DATA)
+ if (type == RX_PACKET_TYPE_DATA)
switch (opcode) {
case 510: /* List entry */
ND_PRINT((ndo, " count"));
@@ -1974,6 +1988,7 @@ kauth_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
if (length <= sizeof(struct rx_header))
return;
@@ -1994,13 +2009,14 @@ kauth_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " reply %s", tok2str(kauth_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response.
*/
- if (rxh->type == RX_PACKET_TYPE_DATA)
+ if (type == RX_PACKET_TYPE_DATA)
/* Well, no, not really. Leave this for later */
;
else {
@@ -2225,6 +2241,7 @@ vol_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
if (length <= sizeof(struct rx_header))
return;
@@ -2238,13 +2255,14 @@ vol_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " vol reply %s", tok2str(vol_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response.
*/
- if (rxh->type == RX_PACKET_TYPE_DATA) {
+ if (type == RX_PACKET_TYPE_DATA) {
switch (opcode) {
case 100: /* Create volume */
ND_PRINT((ndo, " volid"));
@@ -2449,6 +2467,7 @@ bos_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
if (length <= sizeof(struct rx_header))
return;
@@ -2462,13 +2481,14 @@ bos_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " bos reply %s", tok2str(bos_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, interpret the response.
*/
- if (rxh->type == RX_PACKET_TYPE_DATA)
+ if (type == RX_PACKET_TYPE_DATA)
/* Well, no, not really. Leave this for later */
;
else {
@@ -2623,6 +2643,7 @@ ubik_reply_print(netdissect_options *ndo,
register const u_char *bp, u_int length, uint32_t opcode)
{
const struct rx_header *rxh;
+ uint8_t type;
if (length < sizeof(struct rx_header))
return;
@@ -2636,13 +2657,14 @@ ubik_reply_print(netdissect_options *ndo,
ND_PRINT((ndo, " ubik reply %s", tok2str(ubik_req, "op#%u", opcode)));
+ type = EXTRACT_U_1(rxh->type);
bp += sizeof(struct rx_header);
/*
* If it was a data packet, print out the arguments to the Ubik calls
*/
- if (rxh->type == RX_PACKET_TYPE_DATA)
+ if (type == RX_PACKET_TYPE_DATA)
switch (opcode) {
case 10000: /* Beacon */
ND_PRINT((ndo, " vote no"));
@@ -2687,6 +2709,7 @@ rx_ack_print(netdissect_options *ndo,
register const u_char *bp, u_int length)
{
const struct rx_ackPacket *rxa;
+ uint8_t nAcks;
int i, start, last;
uint32_t firstPacket;
@@ -2695,18 +2718,10 @@ rx_ack_print(netdissect_options *ndo,
bp += sizeof(struct rx_header);
- /*
- * This may seem a little odd .... the rx_ackPacket structure
- * contains an array of individual packet acknowledgements
- * (used for selective ack/nack), but since it's variable in size,
- * we don't want to truncate based on the size of the whole
- * rx_ackPacket structure.
- */
-
- ND_TCHECK2(bp[0], sizeof(struct rx_ackPacket) - RX_MAXACKS);
+ ND_TCHECK2(bp[0], sizeof(struct rx_ackPacket));
rxa = (const struct rx_ackPacket *) bp;
- bp += (sizeof(struct rx_ackPacket) - RX_MAXACKS);
+ bp += sizeof(struct rx_ackPacket);
/*
* Print out a few useful things from the ack packet structure
@@ -2714,13 +2729,13 @@ rx_ack_print(netdissect_options *ndo,
if (ndo->ndo_vflag > 2)
ND_PRINT((ndo, " bufspace %u maxskew %d",
- EXTRACT_BE_U_2(&rxa->bufferSpace),
- EXTRACT_BE_U_2(&rxa->maxSkew)));
+ EXTRACT_BE_U_2(rxa->bufferSpace),
+ EXTRACT_BE_U_2(rxa->maxSkew)));
- firstPacket = EXTRACT_BE_U_4(&rxa->firstPacket);
+ firstPacket = EXTRACT_BE_U_4(rxa->firstPacket);
ND_PRINT((ndo, " first %u serial %u reason %s",
- firstPacket, EXTRACT_BE_U_4(&rxa->serial),
- tok2str(rx_ack_reasons, "#%u", rxa->reason)));
+ firstPacket, EXTRACT_BE_U_4(rxa->serial),
+ tok2str(rx_ack_reasons, "#%u", EXTRACT_U_1(rxa->reason))));
/*
* Okay, now we print out the ack array. The way _this_ works
@@ -2741,17 +2756,18 @@ rx_ack_print(netdissect_options *ndo,
* to bp after this, so bp ends up at the right spot. Go figure.
*/
- if (rxa->nAcks != 0) {
+ nAcks = EXTRACT_U_1(rxa->nAcks);
+ if (nAcks != 0) {
- ND_TCHECK2(bp[0], rxa->nAcks);
+ ND_TCHECK2(bp[0], nAcks);
/*
* Sigh, this is gross, but it seems to work to collapse
* ranges correctly.
*/
- for (i = 0, start = last = -2; i < rxa->nAcks; i++)
- if (rxa->acks[i] == RX_ACK_TYPE_ACK) {
+ for (i = 0, start = last = -2; i < nAcks; i++)
+ if (EXTRACT_U_1(bp + i) == RX_ACK_TYPE_ACK) {
/*
* I figured this deserved _some_ explanation.
@@ -2821,8 +2837,8 @@ rx_ack_print(netdissect_options *ndo,
* Same as above, just without comments
*/
- for (i = 0, start = last = -2; i < rxa->nAcks; i++)
- if (rxa->acks[i] == RX_ACK_TYPE_NACK) {
+ for (i = 0, start = last = -2; i < nAcks; i++)
+ if (EXTRACT_U_1(bp + i) == RX_ACK_TYPE_NACK) {
if (last == -2) {
ND_PRINT((ndo, " nacked %u", firstPacket + i));
start = i;
@@ -2837,9 +2853,11 @@ rx_ack_print(netdissect_options *ndo,
if (last == i - 1 && start != last)
ND_PRINT((ndo, "-%u", firstPacket + i - 1));
- bp += rxa->nAcks;
+ bp += nAcks;
}
+ /* Padding. */
+ bp += 3;
/*
* These are optional fields; depending on your version of AFS,
@@ -2851,19 +2869,19 @@ rx_ack_print(netdissect_options *ndo,
if (ndo->ndo_vflag > 1) {
TRUNCRET(4);
ND_PRINT((ndo, " ifmtu"));
- INTOUT();
+ UINTOUT();
TRUNCRET(4);
ND_PRINT((ndo, " maxmtu"));
- INTOUT();
+ UINTOUT();
TRUNCRET(4);
ND_PRINT((ndo, " rwind"));
- INTOUT();
+ UINTOUT();
TRUNCRET(4);
ND_PRINT((ndo, " maxpackets"));
- INTOUT();
+ UINTOUT();
}
return;