pfkey_dump.c

来自「eCos操作系统源码」· C语言 代码 · 共 658 行 · 第 1/2 页

C
658
字号
		printf("\tcreated: %s",			str_time(m_lftc->sadb_lifetime_addtime));		printf("\tcurrent: %s\n", str_time(tmp_time));		printf("\tdiff: %lu(s)",			(u_long)(m_lftc->sadb_lifetime_addtime == 0 ?			0 : (tmp_time - m_lftc->sadb_lifetime_addtime)));		printf("\thard: %lu(s)",			(u_long)(m_lfth == NULL ?			0 : m_lfth->sadb_lifetime_addtime));		printf("\tsoft: %lu(s)\n",			(u_long)(m_lfts == NULL ?			0 : m_lfts->sadb_lifetime_addtime));		printf("\tlast: %s",			str_time(m_lftc->sadb_lifetime_usetime));		printf("\thard: %lu(s)",			(u_long)(m_lfth == NULL ?			0 : m_lfth->sadb_lifetime_usetime));		printf("\tsoft: %lu(s)\n",			(u_long)(m_lfts == NULL ?			0 : m_lfts->sadb_lifetime_usetime));		str_lifetime_byte(m_lftc, "current");		str_lifetime_byte(m_lfth, "hard");		str_lifetime_byte(m_lfts, "soft");		printf("\n");		printf("\tallocated: %lu",			(unsigned long)m_lftc->sadb_lifetime_allocations);		printf("\thard: %lu",			(u_long)(m_lfth == NULL ?			0 : m_lfth->sadb_lifetime_allocations));		printf("\tsoft: %lu\n",			(u_long)(m_lfts == NULL ?			0 : m_lfts->sadb_lifetime_allocations));	}	printf("\tsadb_seq=%lu pid=%lu ",		(u_long)m->sadb_msg_seq,		(u_long)m->sadb_msg_pid);	/* XXX DEBUG */	printf("refcnt=%u\n", m->sadb_msg_reserved);	return;}voidpfkey_spdump(m)	struct sadb_msg *m;{	char pbuf[NI_MAXSERV];	caddr_t mhp[SADB_EXT_MAX + 1];	struct sadb_address *m_saddr, *m_daddr;#ifdef SADB_X_EXT_TAG	struct sadb_x_tag *m_tag;#endif	struct sadb_x_policy *m_xpl;	struct sadb_lifetime *m_lftc = NULL, *m_lfth = NULL;	struct sockaddr *sa;	u_int16_t sport = 0, dport = 0;	/* check pfkey message. */	if (pfkey_align(m, mhp)) {		printf("%s\n", ipsec_strerror());		return;	}	if (pfkey_check(mhp)) {		printf("%s\n", ipsec_strerror());		return;	}	m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];	m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];#ifdef SADB_X_EXT_TAG	m_tag = (struct sadb_x_tag *)mhp[SADB_X_EXT_TAG];#endif	m_xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];	m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT];	m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];	if (m_saddr && m_daddr) {		/* source address */		sa = (struct sockaddr *)(m_saddr + 1);		switch (sa->sa_family) {		case AF_INET:		case AF_INET6:			if (getnameinfo(sa, sa->sa_len, NULL, 0,			    pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0)				sport = 0;	/*XXX*/			else				sport = atoi(pbuf);			printf("%s%s ", str_ipaddr(sa),				str_prefport(sa->sa_family,				    m_saddr->sadb_address_prefixlen, sport,				    m_saddr->sadb_address_proto));			break;		default:			printf("unknown-af ");			break;		}		/* destination address */		sa = (struct sockaddr *)(m_daddr + 1);		switch (sa->sa_family) {		case AF_INET:		case AF_INET6:			if (getnameinfo(sa, sa->sa_len, NULL, 0,			    pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0)				dport = 0;	/*XXX*/			else				dport = atoi(pbuf);			printf("%s%s ", str_ipaddr(sa),				str_prefport(sa->sa_family,				    m_daddr->sadb_address_prefixlen, dport,				    m_saddr->sadb_address_proto));			break;		default:			printf("unknown-af ");			break;		}		/* upper layer protocol */		if (m_saddr->sadb_address_proto !=		    m_daddr->sadb_address_proto) {			printf("upper layer protocol mismatched.\n");			return;		}		str_upperspec(m_saddr->sadb_address_proto, sport, dport);	}#ifdef SADB_X_EXT_TAG	else if (m_tag)		printf("tagged \"%s\" ", m_tag->sadb_x_tag_name);#endif	else		printf("(no selector, probably per-socket policy) ");	/* policy */    {	char *d_xpl;	if (m_xpl == NULL) {		printf("no X_POLICY extension.\n");		return;	}	d_xpl = ipsec_dump_policy((char *)m_xpl, "\n\t");	/* dump SPD */	printf("\n\t%s\n", d_xpl);	free(d_xpl);    }	/* lifetime */	if (m_lftc) {		printf("\tcreated: %s  ",			str_time(m_lftc->sadb_lifetime_addtime));		printf("lastused: %s\n",			str_time(m_lftc->sadb_lifetime_usetime));	}	if (m_lfth) {		printf("\tlifetime: %lu(s) ",			(u_long)m_lfth->sadb_lifetime_addtime);		printf("validtime: %lu(s)\n",			(u_long)m_lfth->sadb_lifetime_usetime);	}	printf("\tspid=%ld seq=%ld pid=%ld\n",		(u_long)m_xpl->sadb_x_policy_id,		(u_long)m->sadb_msg_seq,		(u_long)m->sadb_msg_pid);	/* XXX TEST */	printf("\trefcnt=%u\n", m->sadb_msg_reserved);	return;}/* * set "ipaddress" to buffer. */static char *str_ipaddr(sa)	struct sockaddr *sa;{	static char buf[NI_MAXHOST];	const int niflag = NI_NUMERICHOST;	if (sa == NULL)		return "";	if (getnameinfo(sa, sa->sa_len, buf, sizeof(buf), NULL, 0, niflag) == 0)		return buf;	return NULL;}/* * set "/prefix[port number]" to buffer. */static char *str_prefport(family, pref, port, ulp)	u_int family, pref, port, ulp;{	static char buf[128];	char prefbuf[128];	char portbuf[128];	int plen;	switch (family) {	case AF_INET:		plen = sizeof(struct in_addr) << 3;		break;	case AF_INET6:		plen = sizeof(struct in6_addr) << 3;		break;	default:		return "?";	}	if (pref == plen)		prefbuf[0] = '\0';	else		snprintf(prefbuf, sizeof(prefbuf), "/%u", pref);	if (ulp == IPPROTO_ICMPV6)		memset(portbuf, 0, sizeof(portbuf));	else {		if (port == IPSEC_PORT_ANY)			snprintf(portbuf, sizeof(portbuf), "[%s]", "any");		else			snprintf(portbuf, sizeof(portbuf), "[%u]", port);	}	snprintf(buf, sizeof(buf), "%s%s", prefbuf, portbuf);	return buf;}static voidstr_upperspec(ulp, p1, p2)	u_int ulp, p1, p2;{	if (ulp == IPSEC_ULPROTO_ANY)		printf("any");	else if (ulp == IPPROTO_ICMPV6) {		printf("icmp6");		if (!(p1 == IPSEC_PORT_ANY && p2 == IPSEC_PORT_ANY))			printf(" %u,%u", p1, p2);	} else {		struct protoent *ent;		switch (ulp) {		case IPPROTO_IPV4:			printf("ip4");			break;		default:			ent = getprotobynumber(ulp);			if (ent)				printf("%s", ent->p_name);			else				printf("%u", ulp);			endprotoent();			break;		}	}}/* * set "Mon Day Time Year" to buffer */static char *str_time(t)	time_t t;{	static char buf[128];	if (t == 0) {		int i = 0;		for (;i < 20;) buf[i++] = ' ';	} else {		char *t0;		t0 = ctime(&t);		memcpy(buf, t0 + 4, 20);	}	buf[20] = '\0';	return(buf);}static voidstr_lifetime_byte(x, str)	struct sadb_lifetime *x;	char *str;{	double y;	char *unit;	int w;	if (x == NULL) {		printf("\t%s: 0(bytes)", str);		return;	}#if 0	if ((x->sadb_lifetime_bytes) / 1024 / 1024) {		y = (x->sadb_lifetime_bytes) * 1.0 / 1024 / 1024;		unit = "M";		w = 1;	} else if ((x->sadb_lifetime_bytes) / 1024) {		y = (x->sadb_lifetime_bytes) * 1.0 / 1024;		unit = "K";		w = 1;	} else {		y = (x->sadb_lifetime_bytes) * 1.0;		unit = "";		w = 0;	}#else	y = (x->sadb_lifetime_bytes) * 1.0;	unit = "";	w = 0;#endif	printf("\t%s: %.*f(%sbytes)", str, w, y, unit);}

⌨️ 快捷键说明

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