Esempio n. 1
0
int test(char *policy, int family)
{
	int so, proto, optname;
	int len;
	char getbuf[1024];

	switch (family) {
	case PF_INET:
		proto = IPPROTO_IP;
		optname = IP_IPSEC_POLICY;
		break;
	case PF_INET6:
		proto = IPPROTO_IPV6;
		optname = IPV6_IPSEC_POLICY;
		break;
	}

	if ((so = socket(family, SOCK_DGRAM, 0)) < 0)
		perror("socket");

	if (setsockopt(so, proto, optname, policy, PFKEY_EXTLEN(policy)) < 0)
		perror("setsockopt");

	len = sizeof(getbuf);
	memset(getbuf, 0, sizeof(getbuf));
	if (getsockopt(so, proto, optname, getbuf, &len) < 0)
		perror("getsockopt");

    {
	char *buf = NULL;

	printf("\tgetlen:%d\n", len);

	if ((buf = ipsec_dump_policy(getbuf, NULL)) == NULL)
		ipsec_strerror();
	else
		printf("\t[%s]\n", buf);

	free(buf);
    }

	close (so);
}
Esempio n. 2
0
void
pfkey_spdump(struct sadb_msg *m)
{
	char pbuf[NI_MAXSERV];
	caddr_t mhp[SADB_EXT_MAX + 1];
	struct sadb_address *m_saddr, *m_daddr;
	struct sadb_x_policy *m_xpl;
	struct sadb_lifetime *m_lft = NULL;
	struct sockaddr *sa;
	u_int16_t port;

	/* 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];
	m_xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
	m_lft = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];

	/* source address */
	if (m_saddr == NULL) {
		printf("no ADDRESS_SRC extension.\n");
		return;
	}
	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)
			port = 0;	/*XXX*/
		else
			port = atoi(pbuf);
		printf("%s%s ", str_ipaddr(sa),
			str_prefport(sa->sa_family,
			    m_saddr->sadb_address_prefixlen, port));
		break;
	default:
		printf("unknown-af ");
		break;
	}

	/* destination address */
	if (m_daddr == NULL) {
		printf("no ADDRESS_DST extension.\n");
		return;
	}
	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)
			port = 0;	/*XXX*/
		else
			port = atoi(pbuf);
		printf("%s%s ", str_ipaddr(sa),
			str_prefport(sa->sa_family,
			    m_daddr->sadb_address_prefixlen, port));
		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;
	}
	if (m_saddr->sadb_address_proto == IPSEC_ULPROTO_ANY)
		printf("any");
	else
		GETMSGSTR(str_upper, m_saddr->sadb_address_proto);

	/* 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_lft) {
		printf("\tlifetime:%lu validtime:%lu\n",
			(u_long)m_lft->sadb_lifetime_addtime,
			(u_long)m_lft->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;
}