40 # include <linux/unistd.h> 41 # include <linux/signal.h> 55 #include <sys/socket.h> 62 #include <linux/types.h> 63 #include <linux/netlink.h> 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> 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> 96 u8 * t = (
u8 *)
"UNKNOWN";
99 #define _(x) case PF_##x: t = (u8 *) #x; break 165 vec_add (s, t, strlen ((
char *) t));
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);
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);
214 s =
format (s,
"%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
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);
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;
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);
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",
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);
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",
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);
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",
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");
452 u8 * p = va_arg (*args,
u8 *);
453 struct iphdr * ip = (
void *) p;
457 if (! f[IPPROTO_TCP])
465 return format (s,
"%U", f[ip->protocol], p);
467 s =
format (s,
"%U: %U -> %U",
475 #define foreach_unix_arphrd_type \ 525 _ (IEEE802_TR, 800) \ 527 _ (IEEE80211_PRISM, 802) \ 528 _ (IEEE80211_RADIOTAP, 803) \ 535 u32 x = va_arg (*args,
u32);
539 #define _(f,n) case ARPHRD_##f: t = #f; break; 550 s =
format (s,
"unknown 0x%x", x);
555 #define foreach_unix_interface_flag \ 584 u32 x = va_arg (*args,
u32);
593 s =
format (s,
"unknown %d", i);
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",
647 case 0: t =
"BPDU";
break;
648 #define _(f) case ETH_P_##f: t = #f; break; 675 #ifdef ETH_P_PPP_DISC 706 s =
format (s,
"ether-type 0x%x", type);
712 struct ethhdr *
h = va_arg (*args,
struct ethhdr *);
713 uword proto = h->h_proto;
714 u8 * payload = (
void *) (h + 1);
718 if (proto < ETH_DATA_LEN)
721 u8 dsap, ssap, control;
725 ethhdr_802_t * h1 = (
void *) (h + 1);
727 payload = (
void *) (h1 + 1);
732 s =
format (s,
"%U: %U -> %U",
754 if (gethostname (b,
sizeof (buffer)) < 0)
756 return format (s,
"%s", b);
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);
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);
837 u8 * fmt = va_arg (*args,
u8 *);
838 f64 t = va_arg (*args,
f64);
843 tv.tv_usec = 1e6*(t - tv.tv_sec);
853 #define _(x) case x: t = #x; break; 891 return format (s,
"unknown %d", signum);
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]);
934 gid_t *gid = va_arg (*args, gid_t *);
935 struct group *grp = 0;
943 else if (
unformat (input,
"%s", &s))
945 grp = getgrnam ((
char *) s);
#define clib_error(format, args...)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define foreach_set_bit(var, mask, body)
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
static f64 unix_time_now(void)
#define vec_free(V)
Free vector's memory (no header).
static word flt_round_nearest(f64 x)