2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
18 Permission is hereby granted, free of charge, to any person obtaining
19 a copy of this software and associated documentation files (the
20 "Software"), to deal in the Software without restriction, including
21 without limitation the rights to use, copy, modify, merge, publish,
22 distribute, sublicense, and/or sell copies of the Software, and to
23 permit persons to whom the Software is furnished to do so, subject to
24 the following conditions:
26 The above copyright notice and this permission notice shall be
27 included in all copies or substantial portions of the Software.
29 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41 # include <linux/unistd.h>
42 # include <linux/signal.h>
45 #else /* ! __KERNEL__ */
51 #define _GNU_SOURCE /* to get REG_* in ucontext.h */
60 #include <sys/socket.h>
64 #include <vppinfra/time.h>
66 #include <vppinfra/linux/syscall.h>
69 #include <linux/types.h>
70 #include <linux/netlink.h>
74 #endif /* ! __KERNEL__ */
78 # include <linux/socket.h>
79 # include <linux/in.h>
80 # include <linux/ip.h>
81 # include <linux/tcp.h>
82 # include <linux/udp.h>
83 # include <linux/icmp.h>
84 # include <linux/if_ether.h>
85 # include <linux/if_arp.h>
87 # include <net/if.h> /* struct ifnet may live here */
88 # include <netinet/in.h>
89 # include <netinet/ip.h>
90 # include <netinet/tcp.h>
91 # include <netinet/udp.h>
92 # include <netinet/ip_icmp.h>
93 # include <netinet/if_ether.h>
94 #endif /* __KERNEL__ */
96 #include <vppinfra/bitops.h> /* foreach_set_bit */
97 #include <vppinfra/format.h>
98 #include <vppinfra/error.h>
100 /* Format unix network address family (e.g. AF_INET). */
101 u8 * format_address_family (u8 * s, va_list * va)
103 uword family = va_arg (*va, uword);
104 u8 * t = (u8 *) "UNKNOWN";
107 #define _(x) case PF_##x: t = (u8 *) #x; break
109 _ (UNIX); /* Unix domain sockets */
110 _ (INET); /* Internet IP Protocol */
112 _ (AX25); /* Amateur Radio AX.25 */
115 _ (IPX); /* Novell IPX */
118 _ (APPLETALK); /* AppleTalk DDP */
121 _ (NETROM); /* Amateur Radio NET/ROM */
124 _ (BRIDGE); /* Multiprotocol bridge */
127 _ (ATMPVC); /* ATM PVCs */
130 _ (X25); /* Reserved for X.25 project */
133 _ (INET6); /* IP version 6 */
136 _ (ROSE); /* Amateur Radio X.25 PLP */
139 _ (DECnet); /* Reserved for DECnet project */
142 _ (NETBEUI); /* Reserved for 802.2LLC project*/
145 _ (SECURITY); /* Security callback pseudo AF */
148 _ (KEY); /* PF_KEY key management API */
154 _ (PACKET); /* Packet family */
160 _ (ECONET); /* Acorn Econet */
163 _ (ATMSVC); /* ATM SVCs */
166 _ (SNA); /* Linux SNA Project */
169 _ (IRDA); /* IRDA sockets */
173 vec_add (s, t, strlen ((char *) t));
177 u8 * format_network_protocol (u8 * s, va_list * args)
179 uword family = va_arg (*args, uword);
180 uword protocol = va_arg (*args, uword);
183 struct protoent * p = getprotobynumber (protocol);
185 ASSERT (family == AF_INET);
187 return format (s, "%s", p->p_name);
189 return format (s, "%d", protocol);
191 return format (s, "%d/%d", family, protocol);
195 u8 * format_network_port (u8 * s, va_list * args)
197 uword proto = va_arg (*args, uword);
198 uword port = va_arg (*args, uword);
201 struct servent * p = getservbyport (port, proto == IPPROTO_UDP ? "udp" : "tcp");
204 return format (s, "%s", p->s_name);
206 return format (s, "%d", port);
208 return format (s, "%s/%d", proto == IPPROTO_UDP ? "udp" : "tcp", port);
212 /* Format generic network address: takes two arguments family and address.
213 Assumes network byte order. */
214 u8 * format_network_address (u8 * s, va_list * args)
216 uword family = va_arg (*args, uword);
217 u8 * addr = va_arg (*args, u8 *);
222 s = format (s, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
226 /* We use AF_UNSPEC for ethernet addresses. */
227 s = format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
228 addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
232 clib_error ("unsupported address family %d", family);
238 u8 * format_sockaddr (u8 * s, va_list * args)
240 void * v = va_arg (*args, void *);
241 struct sockaddr * sa = v;
242 static u32 local_counter;
244 switch (sa->sa_family)
248 struct sockaddr_in * i = v;
249 s = format (s, "%U:%U",
250 format_network_address, AF_INET, &i->sin_addr.s_addr,
251 format_network_port, IPPROTO_TCP, ntohs (i->sin_port));
258 * There isn't anything useful to print.
259 * The unix cli world uses the output to make a node name,
260 * so we need to return a unique name.
262 s = format (s, "local:%u", local_counter++);
270 struct sockaddr_nl * n = v;
271 s = format (s, "KERNEL-NETLINK");
273 s = format (s, " (groups 0x%x)", n->nl_groups);
280 s = format (s, "sockaddr family %d", sa->sa_family);
288 u8 * format_tcp4_packet (u8 * s, va_list * args)
290 u8 * p = va_arg (*args, u8 *);
291 struct iphdr * ip = (void *) p;
292 struct tcphdr * tcp = (void *) (ip + 1);
294 s = format (s, "tcp %U:%U -> %U:%U",
295 format_network_address, AF_INET, &ip->saddr,
296 format_network_port, IPPROTO_TCP, ntohs (tcp->source),
297 format_network_address, AF_INET, &ip->daddr,
298 format_network_port, IPPROTO_TCP, ntohs (tcp->dest));
300 s = format (s, ", seq 0x%08x -> 0x%08x", tcp->seq, tcp->ack_seq);
301 #define _(f) if (tcp->f) s = format (s, ", " #f);
302 _ (syn); _ (ack); _ (fin); _ (rst); _ (psh); _ (urg);
306 s = format (s, ", window 0x%04x", tcp->window);
308 s = format (s, ", urg 0x%04x", tcp->urg_ptr);
313 u8 * format_udp4_packet (u8 * s, va_list * args)
315 u8 * p = va_arg (*args, u8 *);
316 struct iphdr * ip = (void *) p;
317 struct udphdr * udp = (void *) (ip + 1);
319 s = format (s, "udp %U:%U -> %U:%U", format_network_address, AF_INET,
320 &ip->saddr, format_network_port, IPPROTO_UDP,
321 ntohs (udp->source), format_network_address, AF_INET, &ip->daddr,
322 format_network_port, IPPROTO_UDP, ntohs (udp->dest));
327 u8 * format_icmp4_type_and_code (u8 * s, va_list * args)
329 uword icmp_type = va_arg (*args, uword);
330 uword icmp_code = va_arg (*args, uword);
334 #define _(f,str) case ICMP_##f: s = format (s, str); break;
335 _ (ECHOREPLY, "echo reply");
336 _ (DEST_UNREACH, "unreachable");
337 _ (SOURCE_QUENCH, "source quench");
338 _ (REDIRECT, "redirect");
339 _ (ECHO, "echo request");
340 _ (TIME_EXCEEDED, "time exceeded");
341 _ (PARAMETERPROB, "parameter problem");
342 _ (TIMESTAMP, "timestamp request");
343 _ (TIMESTAMPREPLY, "timestamp reply");
344 _ (INFO_REQUEST, "information request");
345 _ (INFO_REPLY, "information reply");
346 _ (ADDRESS, "address mask request");
347 _ (ADDRESSREPLY, "address mask reply");
350 s = format (s, "unknown type 0x%x", icmp_type);
353 if (icmp_type == ICMP_DEST_UNREACH)
357 #define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
358 _ (NET_UNREACH, "network");
359 _ (HOST_UNREACH, "host");
360 _ (PROT_UNREACH, "protocol");
361 _ (PORT_UNREACH, "port");
362 _ (FRAG_NEEDED, ": fragmentation needed/DF set");
363 _ (SR_FAILED, "source route failed");
364 _ (NET_UNKNOWN, "network unknown");
365 _ (HOST_UNKNOWN, "host unknown");
366 _ (HOST_ISOLATED, "host isolated");
367 _ (NET_ANO, "network: admin. prohibited");
368 _ (HOST_ANO, "host: admin. prohibited");
369 _ (NET_UNR_TOS, "network for type-of-service");
370 _ (HOST_UNR_TOS, "host for type-of-service");
371 _ (PKT_FILTERED, ": packet filtered");
372 _ (PREC_VIOLATION, "precedence violation");
373 _ (PREC_CUTOFF, "precedence cut off");
376 s = format (s, "unknown code 0x%x", icmp_code);
379 else if (icmp_type == ICMP_REDIRECT)
383 #define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
384 _ (REDIR_NET, "network");
385 _ (REDIR_HOST, "host");
386 _ (REDIR_NETTOS, "network for type-of-service");
387 _ (REDIR_HOSTTOS, "host for type-of-service");
390 s = format (s, "unknown code 0x%x", icmp_code);
393 else if (icmp_type == ICMP_TIME_EXCEEDED)
397 #define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
398 _ (EXC_TTL, "time-to-live zero in transit");
399 _ (EXC_FRAGTIME, "time-to-live zero during reassembly");
402 s = format (s, "unknown code 0x%x", icmp_code);
415 u8 * format_icmp4_packet (u8 * s, va_list * args)
417 u8 * p = va_arg (*args, u8 *);
418 struct iphdr * ip = (void *) p;
419 icmp4_t * icmp = (void *) (ip + 1);
420 s = format (s, "icmp %U %U -> %U",
421 format_icmp4_type_and_code, icmp->type, icmp->code,
422 format_network_address, AF_INET, &ip->saddr,
423 format_network_address, AF_INET, &ip->daddr);
428 u8 * format_ip4_tos_byte (u8 * s, va_list * args)
430 uword tos = va_arg (*args, uword);
432 if (tos & IPTOS_LOWDELAY)
433 s = format (s, "minimize-delay, ");
434 if (tos & IPTOS_MINCOST)
435 s = format (s, "minimize-cost, ");
436 if (tos & IPTOS_THROUGHPUT)
437 s = format (s, "maximize-throughput, ");
438 if (tos & IPTOS_RELIABILITY)
439 s = format (s, "maximize-reliability, ");
441 switch (IPTOS_PREC (tos))
443 #define _(x,y) case IPTOS_PREC_##x: s = format (s, y); break
444 _ (NETCONTROL, "network");
445 _ (INTERNETCONTROL, "internet");
446 _ (CRITIC_ECP, "critical");
448 _ (FLASHOVERRIDE, "flash-override");
449 _ (IMMEDIATE, "immediate");
450 _ (PRIORITY, "priority");
451 _ (ROUTINE, "routine");
458 u8 * format_ip4_packet (u8 * s, va_list * args)
460 u8 * p = va_arg (*args, u8 *);
461 struct iphdr * ip = (void *) p;
463 static format_function_t * f[256];
465 if (! f[IPPROTO_TCP])
467 f[IPPROTO_TCP] = format_tcp4_packet;
468 f[IPPROTO_UDP] = format_udp4_packet;
469 f[IPPROTO_ICMP] = format_icmp4_packet;
473 return format (s, "%U", f[ip->protocol], p);
475 s = format (s, "%U: %U -> %U",
476 format_network_protocol, AF_INET, ip->protocol,
477 format_network_address, AF_INET, &ip->saddr,
478 format_network_address, AF_INET, &ip->daddr);
483 #define foreach_unix_arphrd_type \
533 _ (IEEE802_TR, 800) \
535 _ (IEEE80211_PRISM, 802) \
536 _ (IEEE80211_RADIOTAP, 803) \
540 u8 * format_unix_arphrd (u8 * s, va_list * args)
542 #ifndef __COVERITY__ /* doesn't understand this at all... */
543 u32 x = va_arg (*args, u32);
547 #define _(f,n) case ARPHRD_##f: t = #f; break;
548 foreach_unix_arphrd_type
556 s = format (s, "%s", t);
558 s = format (s, "unknown 0x%x", x);
563 #define foreach_unix_interface_flag \
584 static char * unix_interface_flag_names[] = {
586 foreach_unix_interface_flag
590 u8 * format_unix_interface_flags (u8 * s, va_list * args)
592 u32 x = va_arg (*args, u32);
596 s = format (s, "none");
597 else foreach_set_bit (i, x, ({
598 if (i < ARRAY_LEN (unix_interface_flag_names))
599 s = format (s, "%s", unix_interface_flag_names[i]);
601 s = format (s, "unknown %d", i);
603 s = format (s, ", ");
609 u16 ar_hrd; /* format of hardware address */
610 u16 ar_pro; /* format of protocol address */
611 u8 ar_hln; /* length of hardware address */
612 u8 ar_pln; /* length of protocol address */
613 u16 ar_op; /* ARP opcode (command) */
614 u8 ar_sha[6]; /* sender hardware address */
615 u8 ar_spa[4]; /* sender IP address */
616 u8 ar_tha[6]; /* target hardware address */
617 u8 ar_tpa[4]; /* target IP address */
620 u8 * format_arp_packet (u8 * s, va_list * args)
622 arp_ether_ip4_t * a = va_arg (*args, arp_ether_ip4_t *);
623 char * op = "unknown";
625 if (a->ar_pro != ETH_P_IP ||
626 a->ar_hrd != ARPHRD_ETHER)
631 #define _(f) case ARPOP_##f: op = #f; break;
639 s = format (s, "%s %U %U -> %U %U",
641 format_network_address, AF_INET, a->ar_spa,
642 format_network_address, AF_UNSPEC, a->ar_sha,
643 format_network_address, AF_INET, a->ar_tpa,
644 format_network_address, AF_UNSPEC, a->ar_tha);
648 u8 * format_ethernet_proto (u8 * s, va_list * args)
650 uword type = va_arg (*args, uword);
655 case 0: t = "BPDU"; break;
656 #define _(f) case ETH_P_##f: t = #f; break;
683 #ifdef ETH_P_PPP_DISC
712 vec_add (s, t, strlen (t));
714 s = format (s, "ether-type 0x%x", type);
718 u8 * format_ethernet_packet (u8 * s, va_list * args)
720 struct ethhdr * h = va_arg (*args, struct ethhdr *);
721 uword proto = h->h_proto;
722 u8 * payload = (void *) (h + 1);
725 /* Check for 802.2/802.3 encapsulation. */
726 if (proto < ETH_DATA_LEN)
729 u8 dsap, ssap, control;
733 ethhdr_802_t * h1 = (void *) (h + 1);
735 payload = (void *) (h1 + 1);
738 indent = format_get_indent (s);
740 s = format (s, "%U: %U -> %U",
741 format_ethernet_proto, proto,
742 format_network_address, AF_UNSPEC, h->h_source,
743 format_network_address, AF_UNSPEC, h->h_dest);
748 s = format (s, "\n%U%U",
749 format_white_space, indent,
750 format_arp_packet, payload);
758 u8 * format_hostname (u8 * s, va_list * args)
762 if (gethostname (b, sizeof (buffer)) < 0)
764 return format (s, "%s", b);
769 u8 * format_timeval (u8 * s, va_list * args)
771 char * fmt = va_arg (*args, char *);
772 struct timeval * tv = va_arg (*args, struct timeval *);
778 fmt = "y/m/d H:M:S:F";
782 static struct timeval now;
783 gettimeofday (&now, 0);
787 msec = flt_round_nearest (1e-3 * tv->tv_usec);
789 { msec = 0; tv->tv_sec++; }
792 time_t t = tv->tv_sec;
796 for (f = fmt; *f; f++)
799 char * what_fmt = "%d";
808 what = 1900 + tm->tm_year;
812 what = tm->tm_mon + 1;
837 s = format (s, what_fmt, what);
844 u8 * format_time_float (u8 * s, va_list * args)
846 u8 * fmt = va_arg (*args, u8 *);
847 f64 t = va_arg (*args, f64);
850 t = unix_time_now ();
852 tv.tv_usec = 1e6*(t - tv.tv_sec);
853 return format (s, "%U", format_timeval, fmt, &tv);
856 u8 * format_signal (u8 * s, va_list * args)
858 uword signum = va_arg (*args, uword);
862 #define _(x) case x: t = #x; break;
900 return format (s, "unknown %d", signum);
903 vec_add (s, t, strlen (t));
907 u8 * format_ucontext_pc (u8 * s, va_list * args)
909 ucontext_t * uc __attribute__((unused));
910 unsigned long * regs = 0;
913 uc = va_arg (*args, ucontext_t *);
915 #if defined (powerpc)
916 regs = &uc->uc_mcontext.uc_regs->gregs[0];
917 #elif defined (powerpc64)
918 regs = &uc->uc_mcontext.uc_regs->gp_regs[0];
919 #elif defined (i386) || defined (__x86_64__)
920 regs = (void *) &uc->uc_mcontext.gregs[0];
923 #if defined (powerpc) || defined (powerpc64)
927 #elif defined (__x86_64__)
935 return format (s, "unsupported");
937 return format (s, "%p", regs[reg_no]);
941 unformat_unix_gid (unformat_input_t * input, va_list * args)
943 gid_t *gid = va_arg (*args, gid_t *);
944 struct group *grp = 0;
948 if (unformat (input, "%d", &r))
952 else if (unformat (input, "%s", &s))
954 grp = getgrnam ((char *) s);
965 #endif /* __KERNEL__ */