⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtems_showroute.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* *  $Id: rtems_showroute.c,v 1.6.6.1 2005/05/20 19:19:17 joel Exp $ */#include <sys/param.h>#include <sys/queue.h>#include <sys/systm.h>#include <sys/kernel.h>#include <sys/sysctl.h>#include <sys/proc.h>#include <sys/mbuf.h>#include <sys/socket.h>#include <sys/socketvar.h>#include <sys/domain.h>#include <net/if.h>#include <net/if_dl.h>#include <net/route.h>#include <netinet/in.h>#include <arpa/inet.h>/* * We'll use the application versions of realloc and free. */#undef free#undef malloc#include <stdlib.h>/* * Information per route */struct rinfo {	struct sockaddr	dst;	union {		struct sockaddr		sa;		struct sockaddr_in	sin;		struct sockaddr_dl	sdl;	} un;	unsigned long	pksent;	unsigned long	expire;	int		flags;	char		ifname[16];	short		ifunit;	short		refcnt;};/* * Information per display */struct dinfo {	int		capacity;	int		count;	struct rinfo	*routes;};/* * Copy address */static voidcopyAddress (void *to, void *from, int tolen){	int ncopy;	struct sockaddr dummy;	if (from == NULL) {		/*		 * Create a fake address of unspecified type		 */		from = &dummy;		dummy.sa_len = 4;		dummy.sa_family = AF_UNSPEC;	}	ncopy = ((struct sockaddr *)from)->sa_len;	if (ncopy > tolen)		ncopy = tolen;	memcpy (to, from, ncopy);}/* * Package everything up before printing it. * We don't want to block all network operations till * the printing completes! */static intshow_inet_route (rn, vw)	struct radix_node *rn;	void *vw;{	struct rtentry *rt = (struct rtentry *)rn;	struct ifnet *ifp;	struct dinfo *dp = (struct dinfo *)vw;	struct rinfo *r;	/*	 * Get a pointer to a new route info structure	 */	if (dp->count >= dp->capacity) {		r = realloc (dp->routes, (sizeof *r) * (dp->capacity + 20));		if (r == 0)			return ENOMEM;		dp->capacity += 20;		dp->routes = r;	}	r = dp->routes + dp->count++;	/*	 * Fill in the route info structure	 */	copyAddress (&r->dst, rt_key(rt), sizeof r->dst);	if (rt->rt_flags & (RTF_GATEWAY | RTF_HOST)) {		copyAddress (&r->un, rt->rt_gateway, sizeof r->un);	}	else {		/*		 * Create a fake address to hold the mask		 */		struct sockaddr_in dummy;		dummy.sin_family = AF_INET;		dummy.sin_len = sizeof dummy;		dummy.sin_addr = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;		copyAddress (&r->un, &dummy, sizeof r->un);	}	r->flags = rt->rt_flags;	r->refcnt = rt->rt_refcnt;	r->pksent = rt->rt_rmx.rmx_pksent;	r->expire = rt->rt_rmx.rmx_expire;	ifp = rt->rt_ifp;	strncpy (r->ifname, (ifp->if_name ? ifp->if_name : ""), sizeof r->ifname);	r->ifunit = ifp->if_unit;	return 0;}/* * Convert link address to ASCII */static char *link_ascii (struct sockaddr_dl *sdl, char *buf, int bufsize){	char *cp;	int i;	int first = 1;	int nleft = sdl->sdl_alen;	unsigned char *ap = LLADDR (sdl);	static const char hextab[16] = "0123456789ABCDEF";	cp = buf;	while (nleft && (bufsize > 4)) {		if (first) {			first = 0;		}		else {			*cp++ = ':';			bufsize--;		}		i = *ap++;		*cp++ = hextab[(i >> 4) & 0xf];		*cp++ = hextab[i & 0xf];		nleft--;		bufsize -= 2;	}	*cp = '\0';	return buf;}		voidrtems_bsdnet_show_inet_routes (void){	struct radix_node_head *rnh;	struct dinfo d;	struct rinfo *r;	int i, error;	/*	 * For now we'll handle only AF_INET	 */	rnh = rt_tables[AF_INET];	if (!rnh)		return;	d.count = d.capacity = 0;	d.routes = NULL;	rtems_bsdnet_semaphore_obtain ();	error = rnh->rnh_walktree(rnh, show_inet_route, &d);	rtems_bsdnet_semaphore_release ();	if (error) {		printf ("Can't get route info: %s\n", strerror (error));		return;	}	if (d.count == 0) {		printf ("No routes!\n");		return;	}	printf ("Destination     Gateway/Mask/Hw    Flags     Refs     Use Expire Interface\n");	for (i = 0, r = d.routes ; i < d.count ; i++, r++) {		char buf[30];		char *cp, *fc, flagbuf[10];		const char *addr;		unsigned long flagbit;		struct sockaddr_in *sin;		sin = (struct sockaddr_in *)&r->dst;		if (sin->sin_addr.s_addr == INADDR_ANY)			addr = "default";		else			addr = inet_ntop (AF_INET, &sin->sin_addr, buf, sizeof buf);		printf ("%-16s", addr);		switch (r->un.sa.sa_family) {		case AF_INET:			addr = inet_ntop (AF_INET, &r->un.sin.sin_addr, buf, sizeof buf);			break;		case AF_LINK:			addr = link_ascii (&r->un.sdl, buf, sizeof buf);			break;		default:			addr = "";			break;		}		printf ("%-19s", addr);		fc = "UGHRDM   XLS";		for (flagbit = 0x1, cp = flagbuf ; *fc ; flagbit <<= 1, fc++) {			if ((r->flags & flagbit) && (*fc != ' '))				*cp++ = *fc;		}		*cp = '\0';		printf ("%-10s%3d%9ld%7ld %.*s%d\n", flagbuf,					r->refcnt, r->pksent,					r->expire,					(int)sizeof r->ifname, r->ifname,					r->ifunit);	}	free (d.routes);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -