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; }
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; }