+ if (sock < 0)
+ goto failure;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
+ if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)
+ goto failure;
+
+ ptp_link = !!(ifr.ifr_flags & IFF_POINTOPOINT);
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
+ if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0)
+ goto failure;
+
+ if_index = ifr.ifr_ifindex;
+ lladdr = *ifid;
+
+ rtnl = socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_ROUTE);
+ if (rtnl < 0)
+ goto failure;
+
+ struct sockaddr_nl rtnl_kernel = { .nl_family = AF_NETLINK };
+ if (connect(rtnl, (const struct sockaddr*)&rtnl_kernel, sizeof(rtnl_kernel)) < 0)
+ goto failure;
+
+ int val = RTNLGRP_LINK;
+ if (setsockopt(rtnl, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &val, sizeof(val)) < 0)
+ goto failure;
+
+ if (fcntl(rtnl, F_SETOWN, ourpid) < 0)
+ goto failure;
+
+ if (fcntl(rtnl, F_SETFL, fcntl(sock, F_GETFL) | O_ASYNC) < 0)
+ goto failure;
+
+ struct {
+ struct nlmsghdr hdr;
+ struct ifinfomsg ifi;
+ } req = {
+ .hdr = {sizeof(req), RTM_GETLINK, NLM_F_REQUEST, 1, 0},
+ .ifi = {.ifi_index = if_index}
+ };
+ if (send(rtnl, &req, sizeof(req), 0) < 0)
+ goto failure;
+
+ ra_link_up();