]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
initial sun
authorRoy Marples <roy@marples.name>
Tue, 1 Apr 2025 13:39:31 +0000 (14:39 +0100)
committerRoy Marples <roy@marples.name>
Tue, 1 Apr 2025 13:39:31 +0000 (14:39 +0100)
src/if-sun.c

index 01a109d385efc8477b1d5a042f52bb6612f537f9..5e6cb208c6f4165dfc7d8bca47852714fe988a77 100644 (file)
@@ -1059,7 +1059,7 @@ if_ifinfo(struct dhcpcd_ctx *ctx, const struct if_msghdr *ifm)
                state = LINK_UP;
                flags |= IFF_UP;
        }
-       ifp->mtu = if_mtu(ifp);
+       ifp->mtu = if_getmtu(ifp);
        dhcpcd_handlecarrier(ifp, state, flags);
        return 0;
 }
@@ -1374,10 +1374,10 @@ if_plumb(int cmd, const struct dhcpcd_ctx *ctx, int af, const char *ifname)
 
 #ifdef INET
 static int
-if_walkrt(struct dhcpcd_ctx *ctx, rb_tree_t *routes, char *data, size_t len)
+if_walkrt(struct dhcpcd_ctx *ctx, char *data, size_t len)
 {
        mib2_ipRouteEntry_t *re, *e;
-       struct rt rt, *rtn;
+       struct rt *rt;
        char ifname[IF_NAMESIZE];
        struct in_addr in;
 
@@ -1401,30 +1401,27 @@ if_walkrt(struct dhcpcd_ctx *ctx, rb_tree_t *routes, char *data, size_t len)
                        break;
                }
 
-               memset(&rt, 0, sizeof(rt));
+               rt = rt_new0(ctx);
+               if (rt == NULL)
+                       return -1;
                in.s_addr = re->ipRouteDest;
-               sa_in_init(&rt.rt_dest, &in);
+               sa_in_init(&rt->rt_dest, &in);
                in.s_addr = re->ipRouteMask;
-               sa_in_init(&rt.rt_netmask, &in);
+               sa_in_init(&rt->rt_netmask, &in);
                in.s_addr = re->ipRouteNextHop;
-               sa_in_init(&rt.rt_gateway, &in);
-               rt.rt_flags = re->ipRouteInfo.re_flags;
+               sa_in_init(&rt->rt_gateway, &in);
+               rt->rt_flags = re->ipRouteInfo.re_flags;
                in.s_addr = re->ipRouteInfo.re_src_addr;
-               sa_in_init(&rt.rt_ifa, &in);
-               rt.rt_mtu = re->ipRouteInfo.re_max_frag;
+               sa_in_init(&rt->rt_ifa, &in);
+               rt->rt_mtu = re->ipRouteInfo.re_max_frag;
                if_octetstr(ifname, &re->ipRouteIfIndex, sizeof(ifname));
-               rt.rt_ifp = if_find(ctx->ifaces, ifname);
-               if (if_finishrt(ctx, &rt) == -1) {
+               rt->rt_ifp = if_find(ctx->ifaces, ifname);
+               if (if_finishrt(ctx, rt) == -1) {
                        logerr(__func__);
                        continue;
                }
-               if ((rtn = rt_new(rt.rt_ifp)) == NULL) {
-                       logerr(__func__);
-                       break;
-               }
-               memcpy(rtn, &rt, sizeof(*rtn));
-               if (rb_tree_insert_node(routes, rtn) != rtn)
-                       rt_free(rtn);
+               if (rb_tree_insert_node(&ctx->kroutes, rt) != rt)
+                       rt_free(rt);
        } while (++re < e);
        return 0;
 }
@@ -1432,10 +1429,10 @@ if_walkrt(struct dhcpcd_ctx *ctx, rb_tree_t *routes, char *data, size_t len)
 
 #ifdef INET6
 static int
-if_walkrt6(struct dhcpcd_ctx *ctx, rb_tree_t *routes, char *data, size_t len)
+if_walkrt6(struct dhcpcd_ctx *ctx, char *data, size_t len)
 {
        mib2_ipv6RouteEntry_t *re, *e;
-       struct rt rt, *rtn;
+       struct rt *rt;
        char ifname[IF_NAMESIZE];
        struct in6_addr in6;
 
@@ -1460,35 +1457,32 @@ if_walkrt6(struct dhcpcd_ctx *ctx, rb_tree_t *routes, char *data, size_t len)
                        break;
                }
 
-               memset(&rt, 0, sizeof(rt));
-               sa_in6_init(&rt.rt_dest, &re->ipv6RouteDest);
+               rt = rt_new0(ctx);
+               if (rt == NULL)
+                       return -1;
+               sa_in6_init(&rt->rt_dest, &re->ipv6RouteDest);
                ipv6_mask(&in6, re->ipv6RoutePfxLength);
-               sa_in6_init(&rt.rt_netmask, &in6);
-               sa_in6_init(&rt.rt_gateway, &re->ipv6RouteNextHop);
-               sa_in6_init(&rt.rt_ifa, &re->ipv6RouteInfo.re_src_addr);
-               rt.rt_mtu = re->ipv6RouteInfo.re_max_frag;
+               sa_in6_init(&rt->rt_netmask, &in6);
+               sa_in6_init(&rt->rt_gateway, &re->ipv6RouteNextHop);
+               sa_in6_init(&rt->rt_ifa, &re->ipv6RouteInfo.re_src_addr);
+               rt->rt_mtu = re->ipv6RouteInfo.re_max_frag;
                if_octetstr(ifname, &re->ipv6RouteIfIndex, sizeof(ifname));
-               rt.rt_ifp = if_find(ctx->ifaces, ifname);
-               if (if_finishrt(ctx, &rt) == -1) {
+               rt->rt_ifp = if_find(ctx->ifaces, ifname);
+               if (if_finishrt(ctx, rt) == -1) {
                        logerr(__func__);
                        continue;
                }
-               if ((rtn = rt_new(rt.rt_ifp)) == NULL) {
-                       logerr(__func__);
-                       break;
-               }
-               memcpy(rtn, &rt, sizeof(*rtn));
-               if (rb_tree_insert_node(routes, rtn) != rtn)
-                       rt_free(rtn);
+               if (rb_tree_insert_node(&ctx->kroutes, rt) != rt)
+                       rt_free(rt);
        } while (++re < e);
        return 0;
 }
 #endif
 
 static int
-if_parsert(struct dhcpcd_ctx *ctx, rb_tree_t *routes,
+if_parsert(struct dhcpcd_ctx *ctx,
     unsigned int level, unsigned int name,
-    int (*walkrt)(struct dhcpcd_ctx *, rb_tree_t *, char *, size_t))
+    int (*walkrt)(struct dhcpcd_ctx *, char *, size_t))
 {
        int                     s, retval, code, flags;
        uintptr_t               buf[512 / sizeof(uintptr_t)];
@@ -1573,7 +1567,7 @@ if_parsert(struct dhcpcd_ctx *ctx, rb_tree_t *routes,
                 * the next item, so don't move this test higher up
                 * to avoid the buffer allocation and getmsg calls. */
                if (req->level == level && req->name == name) {
-                       if (walkrt(ctx, routes, databuf.buf, req->len) == -1)
+                       if (walkrt(ctx, databuf.buf, req->len) == -1)
                                break;
                }
        }
@@ -1586,17 +1580,17 @@ out:
 
 
 int
-if_initrt(struct dhcpcd_ctx *ctx, rb_tree_t *routes, int af)
+if_initrt(struct dhcpcd_ctx *ctx, int af)
 {
 
 #ifdef INET
        if ((af == AF_UNSPEC || af == AF_INET) &&
-           if_parsert(ctx, routes, MIB2_IP,MIB2_IP_ROUTE, if_walkrt) == -1)
+           if_parsert(ctx, MIB2_IP,MIB2_IP_ROUTE, if_walkrt) == -1)
                return -1;
 #endif
 #ifdef INET6
        if ((af == AF_UNSPEC || af == AF_INET6) &&
-           if_parsert(ctx, routes, MIB2_IP6, MIB2_IP6_ROUTE, if_walkrt6) == -1)
+           if_parsert(ctx, MIB2_IP6, MIB2_IP6_ROUTE, if_walkrt6) == -1)
                return -1;
 #endif
        return 0;