Hello Debian forum,

This is Sathya and am presently using debian etch platform as my
development.

I am using program which creates a netlink sockets and registers for a IPv4
address notifications on a interface.

--------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <net/if.h>


int main()
{
    struct sockaddr_nl addr;
    int nls,len,rtl;
    char buffer[4096];
    struct nlmsghdr *nlh;
    struct ifaddrmsg *ifa;
    struct rtattr *rth;

    if ((nls = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1)   perror
("socket failure\n");

    memset (&addr,0,sizeof(addr));
    addr.nl_family = AF_NETLINK;
    addr.nl_groups = RTMGRP_IPV4_IFADDR;

    if (bind(nls, (struct sockaddr *)&addr, sizeof(addr)) == -1)    perror
("bind failure\n");

    nlh = (struct nlmsghdr *)buffer;
    while ((len = recv (nls,nlh,4096,0)) > 0)
    {
        for (;(NLMSG_OK (nlh, len)) && (nlh->nlmsg_type != NLMSG_DONE); nlh
=
NLMSG_NEXT(nlh, len))
        {
            if (nlh->nlmsg_type != RTM_NEWADDR) continue; /* some other kind
of
announcement */

            ifa = (struct ifaddrmsg *) NLMSG_DATA (nlh);

            rth = IFA_RTA (ifa);
            rtl = IFA_PAYLOAD (nlh);
            for (;rtl && RTA_OK (rth, rtl); rth = RTA_NEXT (rth,rtl))
            {
                char name[IFNAMSIZ];
                uint32_t ipaddr;

                if (rth->rta_type != IFA_LOCAL) continue;

                ipaddr = * ((uint32_t *)RTA_DATA(rth));
                ipaddr = htonl(ipaddr);

                fprintf (stdout,"%s is now %X
rta_type:%d\n",if_indextoname(ifa->ifa_index,name),ipaddr, rth->rta_type);
            }
        }
    }
}
-----------------------------------------------------------------

But, *when I reconfigure my network interface with the below ifconfig
command, I am shocked that the above netlink program is giving me two
notifications with RTM_NEWADDR (new address being added to an interface)*

I am not sure why the second ifconfig command gives me the two RTM_NEWADDR
netlink notifications?

ifconfig eth0 inet 0
ifconfig eth0 inet 10.208.34.114 netmask 255.255.255.0

To analyse further on this, I then changed the second ifconfig to as in
below(removed the netmask part),

ifconfig eth0 inet 10.208.34.114

Now I am getting only one RTM_NEWADDR netlink notification from the
kernel.(although the netmask and broadcast address as been assigned to the
default address by the kernel).

Could you please help me out by answering why with my prior netlink command
the debian kernel was triggering  two RTM_NEWADDR notifications.

Could you please let me know if this is a problem with debian's netlink
socket implementation.

Please let me know if you have any concerns.

Thanks and regards,
Sathya


(P.S: As I am a newbie to this, I was not sure to which forum would be
appropriate for this. So, posted to all these relavent forum Sorry for
bothering.)

Reply via email to