[radvd-devel-l] RADVD Excessive Reloading of Configuration File
Reuben Hawkins
reubenhwk at gmail.com
Mon Aug 26 15:51:13 EDT 2013
Thanks Nathan,
I'll look at this in the next couple weeks. I have one other commit ready
to be tested so I'll put together an alpha for the next release soon with
these changes.
Thanks,
Reuben
On Fri, Aug 23, 2013 at 12:57 AM, Nathan Hintz <nlhintz at hotmail.com> wrote:
>
> Hi Reuben:
>
> When running 'top', I sometimes see RADVD consuming a lot of CPU (some
> times close to 50%). I put some debug statements into RADVD, and have
> found that RADVD listens to a netlink socket, and basically reloads the
> configuration file for every netlink message it receives, regardless of
> content. I have seen more than 60 reloads in a single second, which
> are generally triggered for Wireless Extension events for one of the
> wireless interfaces. There currently is a patch
> (
> https://dev.openwrt.org/browser/packages/ipv6/radvd/patches/100-silent-netlink-config-reload.patch
> )
> that attempts to silence the logging of the reloads, but this is really
> just masking the problem, and poorly at that. It seems like RADVD
> should be filtering the netlink messages down to what it cares about,
> and only then triggering the reload.
>
> I've attached a patch that seems to fix the problem; but it needs a good
> review. (See http://patchwork.openwrt.org/patch/3101/)
>
> Thanks,
>
> Nathan Hintz
>
> --- a/netlink.c
> +++ b/netlink.c
> @@ -41,7 +41,10 @@
> struct msghdr msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0
> };
> struct nlmsghdr *nh;
> struct ifinfomsg * ifinfo;
> + struct rtattr *rta;
> + int rta_len;
> char ifname[IF_NAMESIZE] = {""};
> + int reloaded = 0;
>
> len = recvmsg (sock, &msg, 0);
> if (len == -1) {
> @@ -59,15 +62,26 @@
> }
>
> /* Continue with parsing payload. */
> - ifinfo = NLMSG_DATA(nh);
> - if_indextoname(ifinfo->ifi_index, ifname);
> - if (ifinfo->ifi_flags & IFF_RUNNING) {
> - dlog(LOG_DEBUG, 3, "%s, ifindex %d, flags is
> running", ifname, ifinfo->ifi_index);
> + if (nh->nlmsg_type == RTM_NEWLINK || nh->nlmsg_type ==
> RTM_DELLINK || nh->nlmsg_type == RTM_SETLINK) {
> + ifinfo = (struct ifinfomsg *)NLMSG_DATA(nh);
> + if_indextoname(ifinfo->ifi_index, ifname);
> + rta = IFLA_RTA(NLMSG_DATA(nh));
> + rta_len = nh->nlmsg_len -
> NLMSG_LENGTH(sizeof(struct ifinfomsg));
> + for (; RTA_OK(rta, rta_len); rta = RTA_NEXT(rta,
> rta_len)) {
> + if (rta->rta_type == IFLA_OPERSTATE ||
> rta->rta_type == IFLA_LINKMODE) {
> + if (ifinfo->ifi_flags &
> IFF_RUNNING) {
> + dlog(LOG_DEBUG, 3, "%s,
> ifindex %d, flags is running", ifname, ifinfo->ifi_index);
> + }
> + else {
> + dlog(LOG_DEBUG, 3, "%s,
> ifindex %d, flags is *NOT* running", ifname, ifinfo->ifi_index);
> + }
> + if (!reloaded) {
> + reload_config(LOG_DEBUG);
> + reloaded = 1;
> + }
> + }
> + }
> }
> - else {
> - dlog(LOG_DEBUG, 3, "%s, ifindex %d, flags is *NOT*
> running", ifname, ifinfo->ifi_index);
> - }
> - reload_config(LOG_DEBUG);
> }
> }
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.litech.org/pipermail/radvd-devel-l/attachments/20130826/3d60d0f4/attachment.html>
More information about the radvd-devel-l
mailing list