From: Roy Marples Date: Tue, 1 Apr 2025 13:39:31 +0000 (+0100) Subject: initial sun X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=078fb026d1aa77731439e28071d0fa6eeb71cb9c;p=thirdparty%2Fdhcpcd.git initial sun --- diff --git a/src/if-sun.c b/src/if-sun.c index 01a109d3..5e6cb208 100644 --- a/src/if-sun.c +++ b/src/if-sun.c @@ -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;