2 * Routines for utilities to convert addresses to strings.
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 #ifdef HAVE_SYS_TYPES_H
31 # include <sys/types.h> /* needed for <netinet/in.h> */
34 #ifdef HAVE_NETINET_IN_H
35 # include <netinet/in.h> /* needed for <arpa/inet.h> on some platforms */
38 #ifdef HAVE_ARPA_INET_H
39 #include <arpa/inet.h>
42 #ifdef HAVE_SYS_SOCKET_H
43 #include <sys/socket.h> /* needed to define AF_ values on UNIX */
46 #ifdef HAVE_WINSOCK2_H
47 #include <winsock2.h> /* needed to define AF_ values on Windows */
50 #ifdef NEED_INET_V6DEFS_H
51 # include "wsutil/inet_v6defs.h"
54 #include "to_str-int.h"
56 #include "value_string.h"
57 #include "addr_resolv.h"
58 #include "wsutil/pint.h"
59 #include "atalk-utils.h"
60 #include "sna-utils.h"
61 #include "osi-utils.h"
62 #include <epan/dissectors/packet-mtp3.h>
67 * If a user _does_ pass in a too-small buffer, this is probably
68 * going to be too long to fit. However, even a partial string
69 * starting with "[Buf" should provide enough of a clue to be
72 #define BUF_TOO_SMALL_ERR "[Buffer too small]"
74 /* Wrapper for the most common case of asking
75 * for a string using a colon as the hex-digit separator.
78 remove this one later when every call has been converted to ep_address_to_str()
81 ether_to_str(const guint8
*ad
)
83 return bytestring_to_str(ad
, 6, ':');
87 tvb_ether_to_str(tvbuff_t
*tvb
, const gint offset
)
89 return bytestring_to_str(tvb_get_ptr(tvb
, offset
, 6), 6, ':');
93 This function is very fast and this function is called a lot.
94 XXX update the ep_address_to_str stuff to use this function.
97 ip_to_str(const guint8
*ad
) {
100 buf
=(gchar
*)ep_alloc(MAX_IP_STR_LEN
);
101 ip_to_str_buf(ad
, buf
, MAX_IP_STR_LEN
);
105 #define IPV4_LENGTH 4
107 tvb_ip_to_str(tvbuff_t
*tvb
, const gint offset
)
111 buf
=(gchar
*)ep_alloc(MAX_IP_STR_LEN
);
112 ip_to_str_buf(tvb_get_ptr(tvb
, offset
, IPV4_LENGTH
), buf
, MAX_IP_STR_LEN
);
117 remove this one later when every call has been converted to ep_address_to_str()
120 ip6_to_str(const struct e_in6_addr
*ad
) {
123 str
=(gchar
*)ep_alloc(MAX_IP6_STR_LEN
);
124 ip6_to_str_buf(ad
, str
);
128 #define IPV6_LENGTH 16
130 tvb_ip6_to_str(tvbuff_t
*tvb
, const gint offset
)
134 buf
=(gchar
*)ep_alloc(MAX_IP6_STR_LEN
);
135 ip6_to_str_buf((const struct e_in6_addr
*)tvb_get_ptr(tvb
, offset
, IPV6_LENGTH
), buf
);
140 * inet_ntop6(src, dst, size)
141 * convert IPv6 binary address into presentation (printable) format
146 ip6_to_str_buf_len(const guchar
* src
, char *buf
, size_t buf_len
)
148 struct { int base
, len
; } best
, cur
;
152 if (buf_len
< MAX_IP6_STR_LEN
) { /* buf_len < 40 */
153 g_strlcpy(buf
, BUF_TOO_SMALL_ERR
, buf_len
); /* Let the unexpected value alert user */
159 * Copy the input (bytewise) array into a wordwise array.
160 * Find the longest run of 0x00's in src[] for :: shorthanding.
162 for (i
= 0; i
< 16; i
+= 2) {
163 words
[i
/ 2] = (src
[i
+1] << 0);
164 words
[i
/ 2] |= (src
[i
] << 8);
166 best
.base
= -1; best
.len
= 0;
167 cur
.base
= -1; cur
.len
= 0;
168 for (i
= 0; i
< 8; i
++) {
170 if (cur
.base
== -1) {
176 if (cur
.base
!= -1) {
177 if (best
.base
== -1 || cur
.len
> best
.len
)
183 if (cur
.base
!= -1) {
184 if (best
.base
== -1 || cur
.len
> best
.len
)
187 if (best
.base
!= -1 && best
.len
< 2)
190 /* Is this address an encapsulated IPv4? */
192 * Orginal code dated 1996 uses ::/96 as a valid IPv4-compatible addresses
193 * but since Feb 2006 ::/96 is deprecated one.
194 * Quoting wikipedia [0]:
195 * > The 96-bit zero-value prefix ::/96, originally known as IPv4-compatible
196 * > addresses, was mentioned in 1995[35] but first described in 1998.[41]
197 * > This class of addresses was used to represent IPv4 addresses within
198 * > an IPv6 transition technology. Such an IPv6 address has its first
199 * > (most significant) 96 bits set to zero, while its last 32 bits are the
200 * > IPv4 address that is represented.
201 * > In February 2006 the Internet Engineering Task Force (IETF) has deprecated
202 * > the use of IPv4-compatible addresses.[1] The only remaining use of this address
203 * > format is to represent an IPv4 address in a table or database with fixed size
204 * > members that must also be able to store an IPv6 address.
206 * If needed it can be fixed by changing next line:
207 * if (best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
209 * if (best.base == 0 && best.len == 5 && words[5] == 0xffff)
211 * [0] http://en.wikipedia.org/wiki/IPv6_address#Historical_notes
214 if (best
.base
== 0 && (best
.len
== 6 || (best
.len
== 5 && words
[5] == 0xffff)))
216 /* best.len == 6 -> ::IPv4; 5 -> ::ffff:IPv4 */
217 buf
= g_stpcpy(buf
, "::");
219 buf
= g_stpcpy(buf
, "ffff:");
220 ip_to_str_buf(src
+ 12, buf
, MAX_IP_STR_LEN
);
221 /* max: 2 + 5 + 16 == 23 bytes */
228 for (i
= 0; i
< 8; i
++) {
229 /* Are we inside the best run of 0x00's? */
230 if (i
== best
.base
) {
234 /* Was it a trailing run of 0x00's? */
240 /* Are we following an initial run of 0x00s or any real hex? */
244 buf
= word_to_hex_npad(buf
, words
[i
]); /* max: 4B */
245 /* max: 8 * 4 + 7 == 39 bytes */
247 *buf
= '\0'; /* 40 byte */
251 ip6_to_str_buf(const struct e_in6_addr
*ad
, gchar
*buf
)
253 ip6_to_str_buf_len((const guchar
*)ad
, buf
, MAX_IP6_STR_LEN
);
257 ipx_addr_to_str(const guint32 net
, const guint8
*ad
)
262 name
= get_ether_name_if_known(ad
);
265 buf
= ep_strdup_printf("%s.%s", get_ipxnet_name(net
), name
);
268 buf
= ep_strdup_printf("%s.%s", get_ipxnet_name(net
),
269 bytestring_to_str(ad
, 6, '\0'));
275 ipxnet_to_string(const guint8
*ad
)
277 guint32 addr
= pntohl(ad
);
278 return ipxnet_to_str_punct(addr
, ' ');
282 ipxnet_to_str_punct(const guint32 ad
, const char punct
)
284 gchar
*buf
= (gchar
*)ep_alloc(12);
286 *dword_to_hex_punct(buf
, ad
, punct
) = '\0';
291 vines_addr_to_str_buf(const guint8
*addrp
, gchar
*buf
, int buf_len
)
294 g_strlcpy(buf
, BUF_TOO_SMALL_ERR
, buf_len
); /* Let the unexpected value alert user */
298 buf
= dword_to_hex(buf
, pntohl(&addrp
[0])); /* 8 bytes */
299 *buf
++ = '.'; /* 1 byte */
300 buf
= word_to_hex(buf
, pntohs(&addrp
[4])); /* 4 bytes */
301 *buf
= '\0'; /* 1 byte */
305 tvb_vines_addr_to_str(tvbuff_t
*tvb
, const gint offset
)
309 buf
=(gchar
*)ep_alloc(214); /* XXX, 14 here? */
311 vines_addr_to_str_buf(tvb_get_ptr(tvb
, offset
, VINES_ADDR_LEN
), buf
, 214);
316 This function is very fast and this function is called a lot.
317 XXX update the ep_address_to_str stuff to use this function.
320 eui64_to_str(const guint64 ad
) {
324 p_eui64
= (guint8
*)ep_alloc(8);
325 buf
=(gchar
*)ep_alloc(EUI64_STR_LEN
);
327 /* Copy and convert the address to network byte order. */
328 *(guint64
*)(void *)(p_eui64
) = pntoh64(&(ad
));
330 g_snprintf(buf
, EUI64_STR_LEN
, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
331 p_eui64
[0], p_eui64
[1], p_eui64
[2], p_eui64
[3],
332 p_eui64
[4], p_eui64
[5], p_eui64
[6], p_eui64
[7] );
336 tvb_eui64_to_str(tvbuff_t
*tvb
, const gint offset
, const guint encoding
)
340 return eui64_to_str(tvb_get_letoh64(tvb
, offset
));
342 return eui64_to_str(tvb_get_ntoh64(tvb
, offset
));
347 usb_addr_to_str_buf(const guint8
*addrp
, gchar
*buf
, int buf_len
)
349 if(pletohl(&addrp
[0])==0xffffffff){
350 g_snprintf(buf
, buf_len
, "host");
352 g_snprintf(buf
, buf_len
, "%d.%d", pletohl(&addrp
[0]), pletohl(&addrp
[4]));
357 tipc_addr_to_str_buf( const guint8
*data
, gchar
*buf
, int buf_len
){
361 guint32 tipc_address
;
363 tipc_address
= data
[0];
364 tipc_address
= (tipc_address
<< 8) ^ data
[1];
365 tipc_address
= (tipc_address
<< 8) ^ data
[2];
366 tipc_address
= (tipc_address
<< 8) ^ data
[3];
368 processor
= tipc_address
& 0x0fff;
370 tipc_address
= tipc_address
>> 12;
371 subnetwork
= tipc_address
& 0x0fff;
373 tipc_address
= tipc_address
>> 12;
374 zone
= tipc_address
& 0xff;
376 g_snprintf(buf
,buf_len
,"%u.%u.%u",zone
,subnetwork
,processor
);
380 ib_addr_to_str_buf( const address
*addr
, gchar
*buf
, int buf_len
){
381 if (addr
->len
>= 16) { /* GID is 128bits */
382 #define PREAMBLE_STR_LEN ((int)(sizeof("GID: ") - 1))
383 g_snprintf(buf
,buf_len
,"GID: ");
384 if (buf_len
< PREAMBLE_STR_LEN
||
385 inet_ntop(AF_INET6
, addr
->data
, buf
+ PREAMBLE_STR_LEN
,
386 buf_len
- PREAMBLE_STR_LEN
) == NULL
) /* Returns NULL if no space and does not touch buf */
387 g_snprintf ( buf
, buf_len
, BUF_TOO_SMALL_ERR
); /* Let the unexpected value alert user */
388 } else { /* this is a LID (16 bits) */
391 memcpy((void *)&lid_number
, addr
->data
, sizeof lid_number
);
392 g_snprintf(buf
,buf_len
,"LID: %u",lid_number
);
397 remove this one later when every call has been converted to ep_address_to_str()
400 fc_to_str(const guint8
*ad
)
402 return bytestring_to_str (ad
, 3, '.');
406 tvb_fc_to_str(tvbuff_t
*tvb
, const gint offset
)
408 return bytestring_to_str (tvb_get_ptr(tvb
, offset
, 3), 3, '.');
411 /* FC Network Header Network Address Authority Identifiers */
413 #define FC_NH_NAA_IEEE 1 /* IEEE 802.1a */
414 #define FC_NH_NAA_IEEE_E 2 /* IEEE Exteneded */
415 #define FC_NH_NAA_LOCAL 3
416 #define FC_NH_NAA_IP 4 /* 32-bit IP address */
417 #define FC_NH_NAA_IEEE_R 5 /* IEEE Registered */
418 #define FC_NH_NAA_IEEE_R_E 6 /* IEEE Registered Exteneded */
419 /* according to FC-PH 3 draft these are now reclaimed and reserved */
420 #define FC_NH_NAA_CCITT_INDV 12 /* CCITT 60 bit individual address */
421 #define FC_NH_NAA_CCITT_GRP 14 /* CCITT 60 bit group address */
424 fcwwn_to_str (const guint8
*ad
)
431 if (ad
== NULL
) return NULL
;
433 ethstr
=(gchar
*)ep_alloc(512);
434 ethptr
= bytes_to_hexstr_punct(ethstr
, ad
, 8, ':'); /* 23 bytes */
436 fmt
= (ad
[0] & 0xF0) >> 4;
441 case FC_NH_NAA_IEEE_E
:
442 memcpy (oui
, &ad
[2], 6);
444 g_snprintf (ethptr
, 512-23, " (%s)", get_manuf_name (oui
));
447 case FC_NH_NAA_IEEE_R
:
448 oui
[0] = ((ad
[0] & 0x0F) << 4) | ((ad
[1] & 0xF0) >> 4);
449 oui
[1] = ((ad
[1] & 0x0F) << 4) | ((ad
[2] & 0xF0) >> 4);
450 oui
[2] = ((ad
[2] & 0x0F) << 4) | ((ad
[3] & 0xF0) >> 4);
451 oui
[3] = ((ad
[3] & 0x0F) << 4) | ((ad
[4] & 0xF0) >> 4);
452 oui
[4] = ((ad
[4] & 0x0F) << 4) | ((ad
[5] & 0xF0) >> 4);
453 oui
[5] = ((ad
[5] & 0x0F) << 4) | ((ad
[6] & 0xF0) >> 4);
455 g_snprintf (ethptr
, 512-23, " (%s)", get_manuf_name (oui
));
466 tvb_fcwwn_to_str(tvbuff_t
*tvb
, const gint offset
)
468 return fcwwn_to_str (tvb_get_ptr(tvb
, offset
, 8));
472 remove this one later when every call has been converted to address_to_str()
475 ax25_to_str(const guint8
*ad
)
477 return bytestring_to_str(ad
, 7, ':');
481 remove this one later when every call has been converted to address_to_str()
484 get_ax25_name(const guint8
*ad
)
492 return address_to_str( &addr
);
495 /*XXX FIXME the code below may be called very very frequently in the future.
496 optimize it for speed and get rid of the slow sprintfs */
497 /* XXX - perhaps we should have individual address types register
498 a table of routines to do operations such as address-to-name translation,
499 address-to-string translation, and the like, and have this call them,
500 and also have an address-to-string-with-a-name routine */
501 /* XXX - use this, and that future address-to-string-with-a-name routine,
502 in "col_set_addr()"; it might also be useful to have address types
503 export the names of the source and destination address fields, so
504 that "col_set_addr()" need know nothing whatsoever about particular
506 /* convert an address struct into a printable string */
509 ep_address_to_str(const address
*addr
)
513 str
=(gchar
*)ep_alloc(MAX_ADDR_STR_LEN
);
514 address_to_str_buf(addr
, str
, MAX_ADDR_STR_LEN
);
518 /* The called routines use se_alloc'ed memory */
520 se_address_to_str(const address
*addr
)
524 str
=(gchar
*)se_alloc(MAX_ADDR_STR_LEN
);
525 address_to_str_buf(addr
, str
, MAX_ADDR_STR_LEN
);
530 address_to_str_buf(const address
*addr
, gchar
*buf
, int buf_len
)
532 const guint8
*addrdata
;
533 struct atalk_ddp_addr ddp_addr
;
534 guint16 ieee_802_15_4_short_addr
;
537 char *tempptr
= temp
;
539 if (!buf
|| !buf_len
)
546 case AT_ETHER
: /* 18 bytes */
547 tempptr
= bytes_to_hexstr_punct(tempptr
, (const guint8
*)addr
->data
, 6, ':'); /* 17 bytes */
550 ip_to_str_buf((const guint8
*)addr
->data
, buf
, buf_len
);
553 ip6_to_str_buf_len((const guchar
*)addr
->data
, buf
, buf_len
);
555 case AT_IPX
: /* 22 bytes */
556 addrdata
= (const guint8
*)addr
->data
;
557 tempptr
= bytes_to_hexstr(tempptr
, &addrdata
[0], 4); /* 8 bytes */
558 *tempptr
++ = '.'; /*1 byte */
559 tempptr
= bytes_to_hexstr(tempptr
, &addrdata
[4], 6); /* 12 bytes */
562 sna_fid_to_str_buf(addr
, buf
, buf_len
);
565 memcpy(&ddp_addr
, addr
->data
, sizeof ddp_addr
);
566 atalk_addr_to_str_buf(&ddp_addr
, buf
, buf_len
);
569 vines_addr_to_str_buf((const guint8
*)addr
->data
, buf
, buf_len
);
572 usb_addr_to_str_buf((const guint8
*)addr
->data
, buf
, buf_len
);
575 print_nsap_net_buf((const guint8
*)addr
->data
, addr
->len
, buf
, buf_len
);
577 case AT_ARCNET
: /* 5 bytes */
578 tempptr
= g_stpcpy(tempptr
, "0x"); /* 2 bytes */
579 tempptr
= bytes_to_hexstr(tempptr
, (const guint8
*)addr
->data
, 1); /* 2 bytes */
581 case AT_FC
: /* 9 bytes */
582 tempptr
= bytes_to_hexstr_punct(tempptr
, (const guint8
*)addr
->data
, 3, '.'); /* 8 bytes */
585 mtp3_addr_to_str_buf((const mtp3_addr_pc_t
*)addr
->data
, buf
, buf_len
);
588 g_strlcpy(buf
, (const gchar
*)addr
->data
, buf_len
);
590 case AT_EUI64
: /* 24 bytes */
591 tempptr
= bytes_to_hexstr_punct(tempptr
, (const guint8
*)addr
->data
, 8, ':'); /* 23 bytes */
594 int copy_len
= addr
->len
< (buf_len
- 1) ? addr
->len
: (buf_len
- 1);
595 memcpy(buf
, addr
->data
, copy_len
);
596 buf
[copy_len
] = '\0';
600 tipc_addr_to_str_buf((const guint8
*)addr
->data
, buf
, buf_len
);
603 ib_addr_to_str_buf(addr
, buf
, buf_len
);
606 addrdata
= (const guint8
*)addr
->data
;
607 g_snprintf(buf
, buf_len
, "%c%c%c%c%c%c-%02d",
608 (addrdata
[0] >> 1) & 0x7f, (addrdata
[1] >> 1) & 0x7f, (addrdata
[2] >> 1) & 0x7f,
609 (addrdata
[3] >> 1) & 0x7f, (addrdata
[4] >> 1) & 0x7f, (addrdata
[5] >> 1) & 0x7f,
610 (addrdata
[6] >> 1) & 0x0f );
612 case AT_IEEE_802_15_4_SHORT
:
613 ieee_802_15_4_short_addr
= pletohs(addr
->data
);
614 if (ieee_802_15_4_short_addr
== 0xffff)
615 g_snprintf(buf
, buf_len
, "Broadcast");
617 g_snprintf(buf
, buf_len
, "0x%04x", ieee_802_15_4_short_addr
);
620 g_assert_not_reached();
623 /* copy to output buffer */
624 if (tempptr
!= temp
) {
625 size_t temp_len
= (size_t) (tempptr
- temp
);
627 if (temp_len
< (size_t) buf_len
) {
628 memcpy(buf
, temp
, temp_len
);
629 buf
[temp_len
] = '\0';
631 g_strlcpy(buf
, BUF_TOO_SMALL_ERR
, buf_len
);/* Let the unexpected value alert user */
636 * Editor modelines - http://www.wireshark.org/tools/modelines.html
641 * indent-tabs-mode: nil
644 * vi: set shiftwidth=4 tabstop=8 expandtab:
645 * :indentSize=4:tabSize=8:noTabs=true: