Diff below merge two slightly different versions of our kernel's inet_ntoa(). I picked 8 rooms for ip4buf to be consistent with what ip6_sprintf() does.
ok? Index: netinet/ip_input.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v retrieving revision 1.208 diff -u -p -r1.208 ip_input.c --- netinet/ip_input.c 10 Apr 2013 08:50:59 -0000 1.208 +++ netinet/ip_input.c 15 Apr 2013 12:03:46 -0000 @@ -134,16 +134,26 @@ struct ipstat ipstat; int in_ouraddr(struct in_addr, struct mbuf *); + +/* Allow 8 sucessive calls of inet_ntoa() before trashing the value. */ +static int ip4round = 0; +static char ip4buf[8][16]; + +/* + * Return a printable string for the IPv4 address. + */ char * -inet_ntoa(ina) - struct in_addr ina; +inet_ntoa(struct in_addr ina) { - static char buf[4*sizeof "123"]; unsigned char *ucp = (unsigned char *)&ina; + char *buf; + + ip4round = (ip4round + 1) & 7; + buf = ip4buf[ip4round]; + + snprintf(buf, sizeof(ip4buf[0]), "%d.%d.%d.%d", + ucp[0] & 0xff, ucp[1] & 0xff, ucp[2] & 0xff, ucp[3] & 0xff); - snprintf(buf, sizeof buf, "%d.%d.%d.%d", - ucp[0] & 0xff, ucp[1] & 0xff, - ucp[2] & 0xff, ucp[3] & 0xff); return (buf); } Index: netinet/ip_ipsp.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_ipsp.c,v retrieving revision 1.189 diff -u -p -r1.189 ip_ipsp.c --- netinet/ip_ipsp.c 11 Apr 2013 12:06:25 -0000 1.189 +++ netinet/ip_ipsp.c 15 Apr 2013 12:03:46 -0000 @@ -981,21 +981,6 @@ tdb_add_inp(struct tdb *tdb, struct inpc } } -/* Return a printable string for the IPv4 address. */ -char * -inet_ntoa4(struct in_addr ina) -{ - static char buf[4][4 * sizeof "123" + 4]; - unsigned char *ucp = (unsigned char *) &ina; - static int i = 3; - - i = (i + 1) % 4; - snprintf(buf[i], sizeof buf[0], "%d.%d.%d.%d", - ucp[0] & 0xff, ucp[1] & 0xff, - ucp[2] & 0xff, ucp[3] & 0xff); - return (buf[i]); -} - /* Return a printable string for the address. */ char * ipsp_address(union sockaddr_union sa) @@ -1003,7 +988,7 @@ ipsp_address(union sockaddr_union sa) switch (sa.sa.sa_family) { #ifdef INET case AF_INET: - return inet_ntoa4(sa.sin.sin_addr); + return inet_ntoa(sa.sin.sin_addr); #endif /* INET */ #ifdef INET6 Index: netinet/ip_ipsp.h =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_ipsp.h,v retrieving revision 1.154 diff -u -p -r1.154 ip_ipsp.h --- netinet/ip_ipsp.h 11 Apr 2013 12:06:25 -0000 1.154 +++ netinet/ip_ipsp.h 15 Apr 2013 12:03:46 -0000 @@ -502,7 +502,6 @@ do { \ /* Misc. */ uint8_t get_sa_require(struct inpcb *); -char *inet_ntoa4(struct in_addr); char *ipsp_address(union sockaddr_union); /* TDB management routines */ Index: netinet/ipsec_input.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ipsec_input.c,v retrieving revision 1.113 diff -u -p -r1.113 ipsec_input.c --- netinet/ipsec_input.c 11 Apr 2013 12:06:25 -0000 1.113 +++ netinet/ipsec_input.c 15 Apr 2013 12:03:46 -0000 @@ -407,7 +407,7 @@ ipsec_common_input_cb(struct mbuf *m, st DPRINTF(("ipsec_common_input_cb(): inner " "source address %s doesn't correspond to " "expected proxy source %s, SA %s/%08x\n", - inet_ntoa4(ipn.ip_src), + inet_ntoa(ipn.ip_src), ipsp_address(tdbp->tdb_proxy), ipsp_address(tdbp->tdb_dst), ntohl(tdbp->tdb_spi))); @@ -514,7 +514,7 @@ ipsec_common_input_cb(struct mbuf *m, st DPRINTF(("ipsec_common_input_cb(): inner " "source address %s doesn't correspond to " "expected proxy source %s, SA %s/%08x\n", - inet_ntoa4(ipn.ip_src), + inet_ntoa(ipn.ip_src), ipsp_address(tdbp->tdb_proxy), ipsp_address(tdbp->tdb_dst), ntohl(tdbp->tdb_spi)));