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.
40 # include <linux/unistd.h>
41 # include <linux/signal.h>
43 #else /* ! __KERNEL__ */
45 #define _GNU_SOURCE /* to get REG_* in ucontext.h */
55 #include <sys/socket.h>
59 #include <vppinfra/time.h>
62 #include <linux/types.h>
63 #include <linux/netlink.h>
66 #endif /* ! __KERNEL__ */
70 # include <linux/socket.h>
71 # include <linux/in.h>
72 # include <linux/ip.h>
73 # include <linux/tcp.h>
74 # include <linux/udp.h>
75 # include <linux/icmp.h>
76 # include <linux/if_ether.h>
77 # include <linux/if_arp.h>
79 # include <net/if.h> /* struct ifnet may live here */
80 # include <netinet/in.h>
81 # include <netinet/ip.h>
82 # include <netinet/tcp.h>
83 # include <netinet/udp.h>
84 # include <netinet/ip_icmp.h>
85 # include <netinet/if_ether.h>
86 #endif /* __KERNEL__ */
88 #include <vppinfra/bitops.h> /* foreach_set_bit */
89 #include <vppinfra/format.h>
90 #include <vppinfra/error.h>
92 /* Format unix network address family (e.g. AF_INET). */
93 u8 * format_address_family (u8 * s, va_list * va)
95 uword family = va_arg (*va, uword);
96 u8 * t = (u8 *) "UNKNOWN";
99 #define _(x) case PF_##x: t = (u8 *) #x; break
101 _ (UNIX); /* Unix domain sockets */
102 _ (INET); /* Internet IP Protocol */
104 _ (AX25); /* Amateur Radio AX.25 */
107 _ (IPX); /* Novell IPX */
110 _ (APPLETALK); /* AppleTalk DDP */
113 _ (NETROM); /* Amateur Radio NET/ROM */
116 _ (BRIDGE); /* Multiprotocol bridge */
119 _ (ATMPVC); /* ATM PVCs */
122 _ (X25); /* Reserved for X.25 project */
125 _ (INET6); /* IP version 6 */
128 _ (ROSE); /* Amateur Radio X.25 PLP */
131 _ (DECnet); /* Reserved for DECnet project */
134 _ (NETBEUI); /* Reserved for 802.2LLC project*/
137 _ (SECURITY); /* Security callback pseudo AF */
140 _ (KEY); /* PF_KEY key management API */
146 _ (PACKET); /* Packet family */
152 _ (ECONET); /* Acorn Econet */
155 _ (ATMSVC); /* ATM SVCs */
158 _ (SNA); /* Linux SNA Project */
161 _ (IRDA); /* IRDA sockets */
165 vec_add (s, t, strlen ((char *) t));
169 u8 * format_network_protocol (u8 * s, va_list * args)
171 uword family = va_arg (*args, uword);
172 uword protocol = va_arg (*args, uword);
175 struct protoent * p = getprotobynumber (protocol);
177 ASSERT (family == AF_INET);
179 return format (s, "%s", p->p_name);
181 return format (s, "%d", protocol);
183 return format (s, "%d/%d", family, protocol);
187 u8 * format_network_port (u8 * s, va_list * args)
189 uword proto = va_arg (*args, uword);
190 uword port = va_arg (*args, uword);
193 struct servent * p = getservbyport (port, proto == IPPROTO_UDP ? "udp" : "tcp");
196 return format (s, "%s", p->s_name);
198 return format (s, "%d", port);
200 return format (s, "%s/%d", proto == IPPROTO_UDP ? "udp" : "tcp", port);
204 /* Format generic network address: takes two arguments family and address.
205 Assumes network byte order. */
206 u8 * format_network_address (u8 * s, va_list * args)
208 uword family = va_arg (*args, uword);
209 u8 * addr = va_arg (*args, u8 *);
214 s = format (s, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
218 /* We use AF_UNSPEC for ethernet addresses. */
219 s = format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
220 addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
224 clib_error ("unsupported address family %d", family);
230 u8 * format_sockaddr (u8 * s, va_list * args)
232 void * v = va_arg (*args, void *);
233 struct sockaddr * sa = v;
234 static u32 local_counter;
236 switch (sa->sa_family)
240 struct sockaddr_in * i = v;
241 s = format (s, "%U:%U",
242 format_network_address, AF_INET, &i->sin_addr.s_addr,
243 format_network_port, IPPROTO_TCP, ntohs (i->sin_port));
250 * There isn't anything useful to print.
251 * The unix cli world uses the output to make a node name,
252 * so we need to return a unique name.
254 s = format (s, "local:%u", local_counter++);
262 struct sockaddr_nl * n = v;
263 s = format (s, "KERNEL-NETLINK");
265 s = format (s, " (groups 0x%x)", n->nl_groups);
272 s = format (s, "sockaddr family %d", sa->sa_family);
279 u8 * format_tcp4_packet (u8 * s, va_list * args)
281 u8 * p = va_arg (*args, u8 *);
282 struct iphdr * ip = (void *) p;
283 struct tcphdr * tcp = (void *) (ip + 1);
285 s = format (s, "tcp %U:%U -> %U:%U",
286 format_network_address, AF_INET, &ip->saddr,
287 format_network_port, IPPROTO_TCP, ntohs (tcp->source),
288 format_network_address, AF_INET, &ip->daddr,
289 format_network_port, IPPROTO_TCP, ntohs (tcp->dest));
291 s = format (s, ", seq 0x%08x -> 0x%08x", tcp->seq, tcp->ack_seq);
292 #define _(f) if (tcp->f) s = format (s, ", " #f);
293 _ (syn); _ (ack); _ (fin); _ (rst); _ (psh); _ (urg);
297 s = format (s, ", window 0x%04x", tcp->window);
299 s = format (s, ", urg 0x%04x", tcp->urg_ptr);
304 u8 * format_udp4_packet (u8 * s, va_list * args)
306 u8 * p = va_arg (*args, u8 *);
307 struct iphdr * ip = (void *) p;
308 struct udphdr * udp = (void *) (ip + 1);
310 s = format (s, "udp %U:%U -> %U:%U",
311 format_network_address, AF_INET, &ip->saddr,
312 format_network_port, IPPROTO_UDP, ntohs (udp->source),
313 format_network_address, AF_INET, &ip->daddr,
314 format_network_port, IPPROTO_UDP, ntohs (udp->dest));
319 u8 * format_icmp4_type_and_code (u8 * s, va_list * args)
321 uword icmp_type = va_arg (*args, uword);
322 uword icmp_code = va_arg (*args, uword);
326 #define _(f,str) case ICMP_##f: s = format (s, str); break;
327 _ (ECHOREPLY, "echo reply");
328 _ (DEST_UNREACH, "unreachable");
329 _ (SOURCE_QUENCH, "source quench");
330 _ (REDIRECT, "redirect");
331 _ (ECHO, "echo request");
332 _ (TIME_EXCEEDED, "time exceeded");
333 _ (PARAMETERPROB, "parameter problem");
334 _ (TIMESTAMP, "timestamp request");
335 _ (TIMESTAMPREPLY, "timestamp reply");
336 _ (INFO_REQUEST, "information request");
337 _ (INFO_REPLY, "information reply");
338 _ (ADDRESS, "address mask request");
339 _ (ADDRESSREPLY, "address mask reply");
342 s = format (s, "unknown type 0x%x", icmp_type);
345 if (icmp_type == ICMP_DEST_UNREACH)
349 #define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
350 _ (NET_UNREACH, "network");
351 _ (HOST_UNREACH, "host");
352 _ (PROT_UNREACH, "protocol");
353 _ (PORT_UNREACH, "port");
354 _ (FRAG_NEEDED, ": fragmentation needed/DF set");
355 _ (SR_FAILED, "source route failed");
356 _ (NET_UNKNOWN, "network unknown");
357 _ (HOST_UNKNOWN, "host unknown");
358 _ (HOST_ISOLATED, "host isolated");
359 _ (NET_ANO, "network: admin. prohibited");
360 _ (HOST_ANO, "host: admin. prohibited");
361 _ (NET_UNR_TOS, "network for type-of-service");
362 _ (HOST_UNR_TOS, "host for type-of-service");
363 _ (PKT_FILTERED, ": packet filtered");
364 _ (PREC_VIOLATION, "precedence violation");
365 _ (PREC_CUTOFF, "precedence cut off");
368 s = format (s, "unknown code 0x%x", icmp_code);
371 else if (icmp_type == ICMP_REDIRECT)
375 #define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
376 _ (REDIR_NET, "network");
377 _ (REDIR_HOST, "host");
378 _ (REDIR_NETTOS, "network for type-of-service");
379 _ (REDIR_HOSTTOS, "host for type-of-service");
382 s = format (s, "unknown code 0x%x", icmp_code);
385 else if (icmp_type == ICMP_TIME_EXCEEDED)
389 #define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
390 _ (EXC_TTL, "time-to-live zero in transit");
391 _ (EXC_FRAGTIME, "time-to-live zero during reassembly");
394 s = format (s, "unknown code 0x%x", icmp_code);
407 u8 * format_icmp4_packet (u8 * s, va_list * args)
409 u8 * p = va_arg (*args, u8 *);
410 struct iphdr * ip = (void *) p;
411 icmp4_t * icmp = (void *) (ip + 1);
412 s = format (s, "icmp %U %U -> %U",
413 format_icmp4_type_and_code, icmp->type, icmp->code,
414 format_network_address, AF_INET, &ip->saddr,
415 format_network_address, AF_INET, &ip->daddr);
420 u8 * format_ip4_tos_byte (u8 * s, va_list * args)
422 uword tos = va_arg (*args, uword);
424 if (tos & IPTOS_LOWDELAY)
425 s = format (s, "minimize-delay, ");
426 if (tos & IPTOS_MINCOST)
427 s = format (s, "minimize-cost, ");
428 if (tos & IPTOS_THROUGHPUT)
429 s = format (s, "maximize-throughput, ");
430 if (tos & IPTOS_RELIABILITY)
431 s = format (s, "maximize-reliability, ");
433 switch (IPTOS_PREC (tos))
435 #define _(x,y) case IPTOS_PREC_##x: s = format (s, y); break
436 _ (NETCONTROL, "network");
437 _ (INTERNETCONTROL, "internet");
438 _ (CRITIC_ECP, "critical");
440 _ (FLASHOVERRIDE, "flash-override");
441 _ (IMMEDIATE, "immediate");
442 _ (PRIORITY, "priority");
443 _ (ROUTINE, "routine");
450 u8 * format_ip4_packet (u8 * s, va_list * args)
452 u8 * p = va_arg (*args, u8 *);
453 struct iphdr * ip = (void *) p;
455 static format_function_t * f[256];
457 if (! f[IPPROTO_TCP])
459 f[IPPROTO_TCP] = format_tcp4_packet;
460 f[IPPROTO_UDP] = format_udp4_packet;
461 f[IPPROTO_ICMP] = format_icmp4_packet;
465 return format (s, "%U", f[ip->protocol], p);
467 s = format (s, "%U: %U -> %U",
468 format_network_protocol, AF_INET, ip->protocol,
469 format_network_address, AF_INET, &ip->saddr,
470 format_network_address, AF_INET, &ip->daddr);
475 #define foreach_unix_arphrd_type \
525 _ (IEEE802_TR, 800) \
527 _ (IEEE80211_PRISM, 802) \
528 _ (IEEE80211_RADIOTAP, 803) \
532 u8 * format_unix_arphrd (u8 * s, va_list * args)
534 #ifndef __COVERITY__ /* doesn't understand this at all... */
535 u32 x = va_arg (*args, u32);
539 #define _(f,n) case ARPHRD_##f: t = #f; break;
540 foreach_unix_arphrd_type
548 s = format (s, "%s", t);
550 s = format (s, "unknown 0x%x", x);
555 #define foreach_unix_interface_flag \
576 static char * unix_interface_flag_names[] = {
578 foreach_unix_interface_flag
582 u8 * format_unix_interface_flags (u8 * s, va_list * args)
584 u32 x = va_arg (*args, u32);
588 s = format (s, "none");
589 else foreach_set_bit (i, x, ({
590 if (i < ARRAY_LEN (unix_interface_flag_names))
591 s = format (s, "%s", unix_interface_flag_names[i]);
593 s = format (s, "unknown %d", i);
595 s = format (s, ", ");
601 u16 ar_hrd; /* format of hardware address */
602 u16 ar_pro; /* format of protocol address */
603 u8 ar_hln; /* length of hardware address */
604 u8 ar_pln; /* length of protocol address */
605 u16 ar_op; /* ARP opcode (command) */
606 u8 ar_sha[6]; /* sender hardware address */
607 u8 ar_spa[4]; /* sender IP address */
608 u8 ar_tha[6]; /* target hardware address */
609 u8 ar_tpa[4]; /* target IP address */
612 u8 * format_arp_packet (u8 * s, va_list * args)
614 arp_ether_ip4_t * a = va_arg (*args, arp_ether_ip4_t *);
615 char * op = "unknown";
617 if (a->ar_pro != ETH_P_IP ||
618 a->ar_hrd != ARPHRD_ETHER)
623 #define _(f) case ARPOP_##f: op = #f; break;
631 s = format (s, "%s %U %U -> %U %U",
633 format_network_address, AF_INET, a->ar_spa,
634 format_network_address, AF_UNSPEC, a->ar_sha,
635 format_network_address, AF_INET, a->ar_tpa,
636 format_network_address, AF_UNSPEC, a->ar_tha);
640 u8 * format_ethernet_proto (u8 * s, va_list * args)
642 uword type = va_arg (*args, uword);
647 case 0: t = "BPDU"; break;
648 #define _(f) case ETH_P_##f: t = #f; break;
675 #ifdef ETH_P_PPP_DISC
704 vec_add (s, t, strlen (t));
706 s = format (s, "ether-type 0x%x", type);
710 u8 * format_ethernet_packet (u8 * s, va_list * args)
712 struct ethhdr * h = va_arg (*args, struct ethhdr *);
713 uword proto = h->h_proto;
714 u8 * payload = (void *) (h + 1);
717 /* Check for 802.2/802.3 encapsulation. */
718 if (proto < ETH_DATA_LEN)
721 u8 dsap, ssap, control;
725 ethhdr_802_t * h1 = (void *) (h + 1);
727 payload = (void *) (h1 + 1);
730 indent = format_get_indent (s);
732 s = format (s, "%U: %U -> %U",
733 format_ethernet_proto, proto,
734 format_network_address, AF_UNSPEC, h->h_source,
735 format_network_address, AF_UNSPEC, h->h_dest);
740 s = format (s, "\n%U%U",
741 format_white_space, indent,
742 format_arp_packet, payload);
750 u8 * format_hostname (u8 * s, va_list * args)
754 if (gethostname (b, sizeof (buffer)) < 0)
756 return format (s, "%s", b);
761 u8 * format_timeval (u8 * s, va_list * args)
763 char * fmt = va_arg (*args, char *);
764 struct timeval * tv = va_arg (*args, struct timeval *);
770 fmt = "y/m/d H:M:S:F";
774 static struct timeval now;
775 gettimeofday (&now, 0);
779 msec = flt_round_nearest (1e-3 * tv->tv_usec);
781 { msec = 0; tv->tv_sec++; }
784 time_t t = tv->tv_sec;
788 for (f = fmt; *f; f++)
791 char * what_fmt = "%d";
800 what = 1900 + tm->tm_year;
804 what = tm->tm_mon + 1;
829 s = format (s, what_fmt, what);
835 u8 * format_time_float (u8 * s, va_list * args)
837 u8 * fmt = va_arg (*args, u8 *);
838 f64 t = va_arg (*args, f64);
841 t = unix_time_now ();
843 tv.tv_usec = 1e6*(t - tv.tv_sec);
844 return format (s, "%U", format_timeval, fmt, &tv);
847 u8 * format_signal (u8 * s, va_list * args)
849 uword signum = va_arg (*args, uword);
853 #define _(x) case x: t = #x; break;
891 return format (s, "unknown %d", signum);
894 vec_add (s, t, strlen (t));
898 u8 * format_ucontext_pc (u8 * s, va_list * args)
900 ucontext_t * uc __attribute__((unused));
901 unsigned long * regs = 0;
904 uc = va_arg (*args, ucontext_t *);
906 #if defined (powerpc)
907 regs = &uc->uc_mcontext.uc_regs->gregs[0];
908 #elif defined (powerpc64)
909 regs = &uc->uc_mcontext.uc_regs->gp_regs[0];
910 #elif defined (i386) || defined (__x86_64__)
911 regs = (void *) &uc->uc_mcontext.gregs[0];
914 #if defined (powerpc) || defined (powerpc64)
918 #elif defined (__x86_64__)
926 return format (s, "unsupported");
928 return format (s, "%p", regs[reg_no]);
932 unformat_unix_gid (unformat_input_t * input, va_list * args)
934 gid_t *gid = va_arg (*args, gid_t *);
935 struct group *grp = 0;
939 if (unformat (input, "%d", &r))
943 else if (unformat (input, "%s", &s))
945 grp = getgrnam ((char *) s);
956 #endif /* __KERNEL__ */