ifdata.ifr_data = (caddr_t)&ecmd;
/* use ioctl to get IP address of an interface */
- frr_elevate_privs(&zserv_privs) {
+ frr_with_privs(&zserv_privs) {
sd = vrf_socket(PF_INET, SOCK_DGRAM, IPPROTO_IP,
interface->vrf_id,
NULL);
p = dplane_ctx_get_intf_dest(ctx);
addattr_l(&req.n, sizeof(req), IFA_ADDRESS,
&p->u.prefix, bytelen);
- } else if (cmd == RTM_NEWADDR &&
- dplane_ctx_intf_has_dest(ctx)) {
- p = dplane_ctx_get_intf_dest(ctx);
+ } else if (cmd == RTM_NEWADDR) {
+ struct in_addr broad = {
+ .s_addr = ipv4_broadcast_addr(p->u.prefix4.s_addr,
+ p->prefixlen)
+ };
addattr_l(&req.n, sizeof(req), IFA_BROADCAST,
- &p->u.prefix, bytelen);
+ &broad, bytelen);
}
}
else
connected_delete_ipv4(
ifp, flags, (struct in_addr *)addr,
- ifa->ifa_prefixlen, (struct in_addr *)broad);
+ ifa->ifa_prefixlen, NULL);
}
if (ifa->ifa_family == AF_INET6) {
if (ifa->ifa_prefixlen > IPV6_MAX_BITLEN) {
metric);
} else
connected_delete_ipv6(ifp, (struct in6_addr *)addr,
- (struct in6_addr *)broad,
- ifa->ifa_prefixlen);
+ NULL, ifa->ifa_prefixlen);
}
return 0;
req.ifa.ifi_index = ifp->ifindex;
- addattr_l(&req.n, sizeof(req), IFLA_PROTO_DOWN, &down, 4);
+ addattr_l(&req.n, sizeof(req), IFLA_PROTO_DOWN, &down, sizeof(down));
addattr_l(&req.n, sizeof(req), IFLA_LINK, &ifp->ifindex, 4);
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,