]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/ra.c
Revert "Fix parsing of Router Advertisement messsages"
[odhcp6c.git] / src / ra.c
index 971a1723e84a4a05b9c966d1e406df1cae12492e..de21710fbb8b55971c22ea89fbb8cf9b3fb2e9a4 100644 (file)
--- a/src/ra.c
+++ b/src/ra.c
@@ -59,13 +59,23 @@ int ra_init(const char *ifname, const struct in6_addr *ifid)
 {
        const pid_t ourpid = getpid();
        sock = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
+       if (sock < 0)
+               return -1;
+
        if_index = if_nametoindex(ifname);
+       if (!if_index)
+               return -1;
+
        strncpy(if_name, ifname, sizeof(if_name) - 1);
        lladdr = *ifid;
 
        rtnl = socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_ROUTE);
+       if (rtnl < 0)
+               return -1;
+
        struct sockaddr_nl rtnl_kernel = { .nl_family = AF_NETLINK };
-       connect(rtnl, (const struct sockaddr*)&rtnl_kernel, sizeof(rtnl_kernel));
+       if (connect(rtnl, (const struct sockaddr*)&rtnl_kernel, sizeof(rtnl_kernel)) < 0)
+               return -1;
 
        int val = RTNLGRP_LINK;
        setsockopt(rtnl, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &val, sizeof(val));
@@ -150,6 +160,7 @@ static void update_proc(const char *sect, const char *opt, uint32_t value)
 
 bool ra_link_up(void)
 {
+       static bool firstcall = true;
        struct {
                struct nlmsghdr hdr;
                struct ifinfomsg msg;
@@ -167,14 +178,16 @@ bool ra_link_up(void)
                        continue;
 
                bool hascarrier = resp.msg.ifi_flags & IFF_LOWER_UP;
-               if (nocarrier && hascarrier)
+               if (!firstcall && nocarrier != !hascarrier)
                        ret = true;
 
                nocarrier = !hascarrier;
+               firstcall = false;
        } while (read > 0);
 
        if (ret) {
-               syslog(LOG_NOTICE, "carrier up event on %s", if_name);
+               syslog(LOG_NOTICE, "carrier => %i event on %s", (int)!nocarrier, if_name);
+
                rs_attempt = 0;
                ra_send_rs(SIGALRM);
        }
@@ -251,6 +264,10 @@ bool ra_process(void)
                entry.preferred = entry.valid;
                changed |= odhcp6c_update_entry(STATE_RA_ROUTE, &entry);
 
+               // Parse hoplimit
+               if (adv->nd_ra_curhoplimit)
+                       update_proc("conf", "hop_limit", adv->nd_ra_curhoplimit);
+
                // Parse ND parameters
                if (ntohl(adv->nd_ra_reachable) <= 3600000)
                        update_proc("neigh", "base_reachable_time_ms", ntohl(adv->nd_ra_reachable));