Пример #1
0
static int udp6_open(struct transport *t, char *name, struct fdarray *fda,
		    enum timestamp_type ts_type)
{
	struct udp6 *udp6 = container_of(t, struct udp6, t);
	int efd, gfd;

	udp6->mac_len = 0;
	if (sk_interface_macaddr(name, udp6->mac, MAC_LEN) == 0)
		udp6->mac_len = MAC_LEN;

	udp6->ip_len = sk_interface_addr(name, AF_INET6, udp6->ip, sizeof(udp6->ip));
	if (udp6->ip_len == -1)
		udp6->ip_len = 0;

	if (1 != inet_pton(AF_INET6, PTP_PRIMARY_MCAST_IP6ADDR, &mc6_addr[MC_PRIMARY]))
		return -1;

	mc6_addr[MC_PRIMARY].s6_addr[1] = udp6_scope;

	if (1 != inet_pton(AF_INET6, PTP_PDELAY_MCAST_IP6ADDR, &mc6_addr[MC_PDELAY]))
		return -1;

	efd = open_socket_ipv6(name, mc6_addr, EVENT_PORT, &udp6->index);
	if (efd < 0)
		goto no_event;

	gfd = open_socket_ipv6(name, mc6_addr, GENERAL_PORT, &udp6->index);
	if (gfd < 0)
		goto no_general;

	if (sk_timestamping_init(efd, name, ts_type, TRANS_UDP_IPV6))
		goto no_timestamping;

	fda->fd[FD_EVENT] = efd;
	fda->fd[FD_GENERAL] = gfd;
	return 0;

no_timestamping:
	close(gfd);
no_general:
	close(efd);
no_event:
	return -1;
}
Пример #2
0
static int raw_open(struct transport *t, const char *name,
		    struct fdarray *fda, enum timestamp_type ts_type)
{
	struct raw *raw = container_of(t, struct raw, t);
	int efd, gfd;

	mac_to_addr(&raw->ptp_addr, ptp_dst_mac);
	mac_to_addr(&raw->p2p_addr, p2p_dst_mac);

	if (sk_interface_macaddr(name, &raw->src_addr))
		goto no_mac;

	efd = open_socket(name, 1);
	if (efd < 0)
		goto no_event;

	gfd = open_socket(name, 0);
	if (gfd < 0)
		goto no_general;

	if (sk_timestamping_init(efd, name, ts_type, TRANS_IEEE_802_3))
		goto no_timestamping;

	if (sk_general_init(gfd))
		goto no_timestamping;

	fda->fd[FD_EVENT] = efd;
	fda->fd[FD_GENERAL] = gfd;
	return 0;

no_timestamping:
	close(gfd);
no_general:
	close(efd);
no_event:
no_mac:
	return -1;
}