mirror of
https://github.com/the-tcpdump-group/tcpdump.git
synced 2024-11-23 10:04:05 +08:00
refine tok2str() buffer use
Switch RRCP and BGP functions from tok2strbuf() to tok2str() to avoid unnecessary local buffer management. The latter function does it in a way to allow up to 4 calls to itself from printf(). After that tok2strbuf() remains used by tok2str() only and can be refined later. Remove a duplicate macro and place the remaining definition into the right file.
This commit is contained in:
parent
035c9fc0a9
commit
0938876cd1
@ -76,7 +76,6 @@ struct tok {
|
||||
const char *s; /* string */
|
||||
};
|
||||
|
||||
#define TOKBUFSIZE 128
|
||||
extern const char *tok2strbuf(const struct tok *, const char *, u_int,
|
||||
char *buf, size_t bufsize);
|
||||
|
||||
|
141
print-bgp.c
141
print-bgp.c
@ -462,7 +462,6 @@ static const struct tok bgp_extd_comm_ospf_rtype_values[] = {
|
||||
{ 0, NULL },
|
||||
};
|
||||
|
||||
#define TOKBUFSIZE 128
|
||||
static char astostr[20];
|
||||
|
||||
/*
|
||||
@ -1323,7 +1322,6 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
u_int tlen;
|
||||
const u_char *tptr;
|
||||
char buf[MAXHOSTNAMELEN + 100];
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
int as_size;
|
||||
|
||||
tptr = pptr;
|
||||
@ -1335,10 +1333,9 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
ND_PRINT((ndo, "invalid len"));
|
||||
else {
|
||||
ND_TCHECK(*tptr);
|
||||
ND_PRINT((ndo, "%s", tok2strbuf(bgp_origin_values,
|
||||
ND_PRINT((ndo, "%s", tok2str(bgp_origin_values,
|
||||
"Unknown Origin Typecode",
|
||||
tptr[0],
|
||||
tokbuf, sizeof(tokbuf))));
|
||||
tptr[0])));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1369,9 +1366,8 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
|
||||
while (tptr < pptr + len) {
|
||||
ND_TCHECK(tptr[0]);
|
||||
ND_PRINT((ndo, "%s", tok2strbuf(bgp_as_path_segment_open_values,
|
||||
"?", tptr[0],
|
||||
tokbuf, sizeof(tokbuf))));
|
||||
ND_PRINT((ndo, "%s", tok2str(bgp_as_path_segment_open_values,
|
||||
"?", tptr[0])));
|
||||
for (i = 0; i < tptr[1] * as_size; i += as_size) {
|
||||
ND_TCHECK2(tptr[2 + i], as_size);
|
||||
ND_PRINT((ndo, "%s ",
|
||||
@ -1381,9 +1377,8 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
EXTRACT_32BITS(&tptr[2 + i]))));
|
||||
}
|
||||
ND_TCHECK(tptr[0]);
|
||||
ND_PRINT((ndo, "%s", tok2strbuf(bgp_as_path_segment_close_values,
|
||||
"?", tptr[0],
|
||||
tokbuf, sizeof(tokbuf))));
|
||||
ND_PRINT((ndo, "%s", tok2str(bgp_as_path_segment_close_values,
|
||||
"?", tptr[0])));
|
||||
ND_TCHECK(tptr[1]);
|
||||
tptr += 2 + tptr[1] * as_size;
|
||||
}
|
||||
@ -1498,12 +1493,10 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
safi = tptr[2];
|
||||
|
||||
ND_PRINT((ndo, "\n\t AFI: %s (%u), %sSAFI: %s (%u)",
|
||||
tok2strbuf(af_values, "Unknown AFI", af,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(af_values, "Unknown AFI", af),
|
||||
af,
|
||||
(safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */
|
||||
tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_safi_values, "Unknown SAFI", safi),
|
||||
safi));
|
||||
|
||||
switch(af<<8 | safi) {
|
||||
@ -1859,12 +1852,10 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
safi = tptr[2];
|
||||
|
||||
ND_PRINT((ndo, "\n\t AFI: %s (%u), %sSAFI: %s (%u)",
|
||||
tok2strbuf(af_values, "Unknown AFI", af,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(af_values, "Unknown AFI", af),
|
||||
af,
|
||||
(safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */
|
||||
tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_safi_values, "Unknown SAFI", safi),
|
||||
safi));
|
||||
|
||||
if (len == BGP_MP_NLRI_MINSIZE)
|
||||
@ -2025,9 +2016,9 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
extd_comm=EXTRACT_16BITS(tptr);
|
||||
|
||||
ND_PRINT((ndo, "\n\t %s (0x%04x), Flags [%s]",
|
||||
tok2strbuf(bgp_extd_comm_subtype_values,
|
||||
tok2str(bgp_extd_comm_subtype_values,
|
||||
"unknown extd community typecode",
|
||||
extd_comm, tokbuf, sizeof(tokbuf)),
|
||||
extd_comm),
|
||||
extd_comm,
|
||||
bittok2str(bgp_extd_comm_flag_values, "none", extd_comm)));
|
||||
|
||||
@ -2072,19 +2063,17 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
case BGP_EXT_COM_OSPF_RTYPE2:
|
||||
ND_PRINT((ndo, ": area:%s, router-type:%s, metric-type:%s%s",
|
||||
getname(ndo, tptr+2),
|
||||
tok2strbuf(bgp_extd_comm_ospf_rtype_values,
|
||||
tok2str(bgp_extd_comm_ospf_rtype_values,
|
||||
"unknown (0x%02x)",
|
||||
*(tptr+6),
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
*(tptr+6)),
|
||||
(*(tptr+7) & BGP_OSPF_RTYPE_METRIC_TYPE) ? "E2" : "",
|
||||
((*(tptr+6) == BGP_OSPF_RTYPE_EXT) || (*(tptr+6) == BGP_OSPF_RTYPE_NSSA)) ? "E1" : ""));
|
||||
break;
|
||||
case BGP_EXT_COM_L2INFO:
|
||||
ND_PRINT((ndo, ": %s Control Flags [0x%02x]:MTU %u",
|
||||
tok2strbuf(l2vpn_encaps_values,
|
||||
tok2str(l2vpn_encaps_values,
|
||||
"unknown encaps",
|
||||
*(tptr+2),
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
*(tptr+2)),
|
||||
*(tptr+3),
|
||||
EXTRACT_16BITS(tptr+4)));
|
||||
break;
|
||||
@ -2229,9 +2218,8 @@ bgp_attr_print(netdissect_options *ndo,
|
||||
len -= alenlen;
|
||||
|
||||
ND_PRINT((ndo, "\n\t %s (%u), length: %u",
|
||||
tok2strbuf(bgp_attr_values,
|
||||
"Unknown Attribute", atype,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_attr_values,
|
||||
"Unknown Attribute", atype),
|
||||
atype,
|
||||
alen));
|
||||
|
||||
@ -2275,8 +2263,6 @@ static void
|
||||
bgp_capabilities_print(netdissect_options *ndo,
|
||||
const u_char *opt, int caps_len)
|
||||
{
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
char tokbuf2[TOKBUFSIZE];
|
||||
int cap_type, cap_len, tcap_len, cap_offset;
|
||||
int i = 0;
|
||||
|
||||
@ -2286,21 +2272,19 @@ bgp_capabilities_print(netdissect_options *ndo,
|
||||
cap_len=opt[i+1];
|
||||
tcap_len=cap_len;
|
||||
ND_PRINT((ndo, "\n\t %s (%u), length: %u",
|
||||
tok2strbuf(bgp_capcode_values, "Unknown",
|
||||
cap_type, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_capcode_values, "Unknown",
|
||||
cap_type),
|
||||
cap_type,
|
||||
cap_len));
|
||||
ND_TCHECK2(opt[i+2], cap_len);
|
||||
switch (cap_type) {
|
||||
case BGP_CAPCODE_MP:
|
||||
ND_PRINT((ndo, "\n\t\tAFI %s (%u), SAFI %s (%u)",
|
||||
tok2strbuf(af_values, "Unknown",
|
||||
EXTRACT_16BITS(opt+i+2),
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(af_values, "Unknown",
|
||||
EXTRACT_16BITS(opt+i+2)),
|
||||
EXTRACT_16BITS(opt+i+2),
|
||||
tok2strbuf(bgp_safi_values, "Unknown",
|
||||
opt[i+5],
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_safi_values, "Unknown",
|
||||
opt[i+5]),
|
||||
opt[i+5]));
|
||||
break;
|
||||
case BGP_CAPCODE_RESTART:
|
||||
@ -2311,13 +2295,11 @@ bgp_capabilities_print(netdissect_options *ndo,
|
||||
cap_offset=4;
|
||||
while(tcap_len>=4) {
|
||||
ND_PRINT((ndo, "\n\t\t AFI %s (%u), SAFI %s (%u), Forwarding state preserved: %s",
|
||||
tok2strbuf(af_values,"Unknown",
|
||||
EXTRACT_16BITS(opt+i+cap_offset),
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(af_values,"Unknown",
|
||||
EXTRACT_16BITS(opt+i+cap_offset)),
|
||||
EXTRACT_16BITS(opt+i+cap_offset),
|
||||
tok2strbuf(bgp_safi_values,"Unknown",
|
||||
opt[i+cap_offset+2],
|
||||
tokbuf2, sizeof(tokbuf2)),
|
||||
tok2str(bgp_safi_values,"Unknown",
|
||||
opt[i+cap_offset+2]),
|
||||
opt[i+cap_offset+2],
|
||||
((opt[i+cap_offset+3])&0x80) ? "yes" : "no" ));
|
||||
tcap_len-=4;
|
||||
@ -2364,7 +2346,6 @@ bgp_open_print(netdissect_options *ndo,
|
||||
struct bgp_opt bgpopt;
|
||||
const u_char *opt;
|
||||
int i;
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
|
||||
ND_TCHECK2(dat[0], BGP_OPEN_SIZE);
|
||||
memcpy(&bgpo, dat, BGP_OPEN_SIZE);
|
||||
@ -2394,9 +2375,8 @@ bgp_open_print(netdissect_options *ndo,
|
||||
}
|
||||
|
||||
ND_PRINT((ndo, "\n\t Option %s (%u), length: %u",
|
||||
tok2strbuf(bgp_opt_values,"Unknown",
|
||||
bgpopt.bgpopt_type,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_opt_values,"Unknown",
|
||||
bgpopt.bgpopt_type),
|
||||
bgpopt.bgpopt_type,
|
||||
bgpopt.bgpopt_len));
|
||||
|
||||
@ -2430,7 +2410,6 @@ bgp_update_print(netdissect_options *ndo,
|
||||
int withdrawn_routes_len;
|
||||
int len;
|
||||
int i;
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
#ifndef INET6
|
||||
char buf[MAXHOSTNAMELEN + 100];
|
||||
int wpfx;
|
||||
@ -2531,9 +2510,8 @@ bgp_update_print(netdissect_options *ndo,
|
||||
length -= alenlen;
|
||||
|
||||
ND_PRINT((ndo, "\n\t %s (%u), length: %u",
|
||||
tok2strbuf(bgp_attr_values, "Unknown Attribute",
|
||||
atype,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_attr_values, "Unknown Attribute",
|
||||
atype),
|
||||
atype,
|
||||
alen));
|
||||
|
||||
@ -2597,8 +2575,6 @@ bgp_notification_print(netdissect_options *ndo,
|
||||
{
|
||||
struct bgp_notification bgpn;
|
||||
const u_char *tptr;
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
char tokbuf2[TOKBUFSIZE];
|
||||
|
||||
ND_TCHECK2(dat[0], BGP_NOTIFICATION_SIZE);
|
||||
memcpy(&bgpn, dat, BGP_NOTIFICATION_SIZE);
|
||||
@ -2608,39 +2584,39 @@ bgp_notification_print(netdissect_options *ndo,
|
||||
return;
|
||||
|
||||
ND_PRINT((ndo, ", %s (%u)",
|
||||
tok2strbuf(bgp_notify_major_values, "Unknown Error",
|
||||
bgpn.bgpn_major, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_notify_major_values, "Unknown Error",
|
||||
bgpn.bgpn_major),
|
||||
bgpn.bgpn_major));
|
||||
|
||||
switch (bgpn.bgpn_major) {
|
||||
|
||||
case BGP_NOTIFY_MAJOR_MSG:
|
||||
ND_PRINT((ndo, ", subcode %s (%u)",
|
||||
tok2strbuf(bgp_notify_minor_msg_values, "Unknown",
|
||||
bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_notify_minor_msg_values, "Unknown",
|
||||
bgpn.bgpn_minor),
|
||||
bgpn.bgpn_minor));
|
||||
break;
|
||||
case BGP_NOTIFY_MAJOR_OPEN:
|
||||
ND_PRINT((ndo, ", subcode %s (%u)",
|
||||
tok2strbuf(bgp_notify_minor_open_values, "Unknown",
|
||||
bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_notify_minor_open_values, "Unknown",
|
||||
bgpn.bgpn_minor),
|
||||
bgpn.bgpn_minor));
|
||||
break;
|
||||
case BGP_NOTIFY_MAJOR_UPDATE:
|
||||
ND_PRINT((ndo, ", subcode %s (%u)",
|
||||
tok2strbuf(bgp_notify_minor_update_values, "Unknown",
|
||||
bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_notify_minor_update_values, "Unknown",
|
||||
bgpn.bgpn_minor),
|
||||
bgpn.bgpn_minor));
|
||||
break;
|
||||
case BGP_NOTIFY_MAJOR_CAP:
|
||||
ND_PRINT((ndo, " subcode %s (%u)",
|
||||
tok2strbuf(bgp_notify_minor_cap_values, "Unknown",
|
||||
bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_notify_minor_cap_values, "Unknown",
|
||||
bgpn.bgpn_minor),
|
||||
bgpn.bgpn_minor));
|
||||
case BGP_NOTIFY_MAJOR_CEASE:
|
||||
ND_PRINT((ndo, ", subcode %s (%u)",
|
||||
tok2strbuf(bgp_notify_minor_cease_values, "Unknown",
|
||||
bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_notify_minor_cease_values, "Unknown",
|
||||
bgpn.bgpn_minor),
|
||||
bgpn.bgpn_minor));
|
||||
|
||||
/* draft-ietf-idr-cease-subcode-02 mentions optionally 7 bytes
|
||||
@ -2650,11 +2626,10 @@ bgp_notification_print(netdissect_options *ndo,
|
||||
tptr = dat + BGP_NOTIFICATION_SIZE;
|
||||
ND_TCHECK2(*tptr, 7);
|
||||
ND_PRINT((ndo, ", AFI %s (%u), SAFI %s (%u), Max Prefixes: %u",
|
||||
tok2strbuf(af_values, "Unknown",
|
||||
EXTRACT_16BITS(tptr), tokbuf, sizeof(tokbuf)),
|
||||
tok2str(af_values, "Unknown",
|
||||
EXTRACT_16BITS(tptr)),
|
||||
EXTRACT_16BITS(tptr),
|
||||
tok2strbuf(bgp_safi_values, "Unknown", *(tptr+2),
|
||||
tokbuf2, sizeof(tokbuf)),
|
||||
tok2str(bgp_safi_values, "Unknown", *(tptr+2)),
|
||||
*(tptr+2),
|
||||
EXTRACT_32BITS(tptr+3)));
|
||||
}
|
||||
@ -2673,8 +2648,6 @@ bgp_route_refresh_print(netdissect_options *ndo,
|
||||
const u_char *pptr, int len)
|
||||
{
|
||||
const struct bgp_route_refresh *bgp_route_refresh_header;
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
char tokbuf2[TOKBUFSIZE];
|
||||
|
||||
ND_TCHECK2(pptr[0], BGP_ROUTE_REFRESH_SIZE);
|
||||
|
||||
@ -2685,15 +2658,13 @@ bgp_route_refresh_print(netdissect_options *ndo,
|
||||
bgp_route_refresh_header = (const struct bgp_route_refresh *)pptr;
|
||||
|
||||
ND_PRINT((ndo, "\n\t AFI %s (%u), SAFI %s (%u)",
|
||||
tok2strbuf(af_values,"Unknown",
|
||||
tok2str(af_values,"Unknown",
|
||||
/* this stinks but the compiler pads the structure
|
||||
* weird */
|
||||
EXTRACT_16BITS(&bgp_route_refresh_header->afi),
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
EXTRACT_16BITS(&bgp_route_refresh_header->afi)),
|
||||
EXTRACT_16BITS(&bgp_route_refresh_header->afi),
|
||||
tok2strbuf(bgp_safi_values,"Unknown",
|
||||
bgp_route_refresh_header->safi,
|
||||
tokbuf2, sizeof(tokbuf2)),
|
||||
tok2str(bgp_safi_values,"Unknown",
|
||||
bgp_route_refresh_header->safi),
|
||||
bgp_route_refresh_header->safi));
|
||||
|
||||
if (ndo->ndo_vflag > 1) {
|
||||
@ -2711,13 +2682,11 @@ bgp_header_print(netdissect_options *ndo,
|
||||
const u_char *dat, int length)
|
||||
{
|
||||
struct bgp bgp;
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
|
||||
ND_TCHECK2(dat[0], BGP_SIZE);
|
||||
memcpy(&bgp, dat, BGP_SIZE);
|
||||
ND_PRINT((ndo, "\n\t%s Message (%u), length: %u",
|
||||
tok2strbuf(bgp_msg_values, "Unknown", bgp.bgp_type,
|
||||
tokbuf, sizeof(tokbuf)),
|
||||
tok2str(bgp_msg_values, "Unknown", bgp.bgp_type),
|
||||
bgp.bgp_type,
|
||||
length));
|
||||
|
||||
@ -2762,7 +2731,6 @@ bgp_print(netdissect_options *ndo,
|
||||
};
|
||||
struct bgp bgp;
|
||||
uint16_t hlen;
|
||||
char tokbuf[TOKBUFSIZE];
|
||||
|
||||
ep = dat + length;
|
||||
if (ndo->ndo_snapend < dat + length)
|
||||
@ -2811,10 +2779,9 @@ bgp_print(netdissect_options *ndo,
|
||||
start = p;
|
||||
} else {
|
||||
ND_PRINT((ndo, "\n[|BGP %s]",
|
||||
tok2strbuf(bgp_msg_values,
|
||||
tok2str(bgp_msg_values,
|
||||
"Unknown Message Type",
|
||||
bgp.bgp_type,
|
||||
tokbuf, sizeof(tokbuf))));
|
||||
bgp.bgp_type)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -77,8 +77,6 @@ rrcp_print(netdissect_options *ndo,
|
||||
uint8_t rrcp_proto;
|
||||
uint8_t rrcp_opcode;
|
||||
register const struct ether_header *ep;
|
||||
char proto_str[16];
|
||||
char opcode_str[32];
|
||||
|
||||
ep = (const struct ether_header *)cp;
|
||||
rrcp = cp + ETHER_HDRLEN;
|
||||
@ -90,11 +88,11 @@ rrcp_print(netdissect_options *ndo,
|
||||
ND_PRINT((ndo, "%s > %s, %s %s",
|
||||
etheraddr_string(ndo, ESRC(ep)),
|
||||
etheraddr_string(ndo, EDST(ep)),
|
||||
tok2strbuf(proto_values,"RRCP-0x%02x",rrcp_proto,proto_str,sizeof(proto_str)),
|
||||
tok2str(proto_values,"RRCP-0x%02x",rrcp_proto),
|
||||
((*(rrcp + RRCP_OPCODE_ISREPLY_OFFSET)) & RRCP_ISREPLY) ? "reply" : "query"));
|
||||
if (rrcp_proto==1){
|
||||
ND_PRINT((ndo, ": %s",
|
||||
tok2strbuf(opcode_values,"unknown opcode (0x%02x)",rrcp_opcode,opcode_str,sizeof(opcode_str))));
|
||||
tok2str(opcode_values,"unknown opcode (0x%02x)",rrcp_opcode)));
|
||||
}
|
||||
if (rrcp_opcode==1 || rrcp_opcode==2){
|
||||
ND_TCHECK2(*(rrcp + RRCP_REG_ADDR_OFFSET), 6);
|
||||
|
@ -62,6 +62,8 @@ int32_t thiszone; /* seconds offset from gmt to local time */
|
||||
*/
|
||||
#define TS_BUF_SIZE sizeof("0000000000.000000000")
|
||||
|
||||
#define TOKBUFSIZE 128
|
||||
|
||||
/*
|
||||
* Print out a null-terminated filename (or other ascii string).
|
||||
* If ep is NULL, assume no truncation check is needed.
|
||||
@ -383,7 +385,7 @@ const char *
|
||||
tok2str(register const struct tok *lp, register const char *fmt,
|
||||
register u_int v)
|
||||
{
|
||||
static char buf[4][128];
|
||||
static char buf[4][TOKBUFSIZE];
|
||||
static int idx = 0;
|
||||
char *ret;
|
||||
|
||||
@ -465,7 +467,7 @@ const char *
|
||||
tok2strary_internal(register const char **lp, int n, register const char *fmt,
|
||||
register int v)
|
||||
{
|
||||
static char buf[128];
|
||||
static char buf[TOKBUFSIZE];
|
||||
|
||||
if (v >= 0 && v < n && lp[v] != NULL)
|
||||
return lp[v];
|
||||
|
Loading…
Reference in New Issue
Block a user