Re: Registering a socket for neighbour updates callback

From: Bharati Bhole
Date: Fri Jun 13 2008 - 04:32:07 EST


Thanks for your reply Varun.

What I want is that, if the kernel neighbour discovery table is
changed by somebody then I want to register a socket from my own
driver to get callback for this change.

Thanks,
Bharati.

On 6/13/08, Varun Chandramohan <varunc@xxxxxxxxxxxxxxxxxx> wrote:
> Bharati Bhole wrote:
>
> > Could anyone please tell me, how to register a socket to get neighbour
> > table update call back.
> >
> > For example, one can get route table update, by creating a netlink
> > socket and registering it in "nl_groups" and then setting function
> > pointer "sk_data_ready" from sk.
> > This invoks the function pointer by "sk_data_ready" whenever route
> > table is modified.
> >
> > Could somebody please tell the procedure to get the neighbour table
> callbacks .
> >
> >
> >
> You mean neighbour discovery table? (radvd)?
> Iam not sure if this is what ur looking for, but you can do something like
>
> int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
>
>
> memset(&localaddrinfo, 0, sizeof(struct sockaddr_nl));
> memset(&in6pAddr, '\0', sizeof(in6pAddr));
>
> groups |= RTMGRP_IPV6_IFADDR;
> groups |= RTMGRP_IPV6_PREFIX;
> localaddrinfo.nl_family = AF_NETLINK;
> localaddrinfo.nl_groups = groups;
>
> if (bind(fd, (struct sockaddr*)&localaddrinfo, sizeof(localaddrinfo)) <
> 0) {
> snmp_log(LOG_ERR,"Bind failed. Exiting thread\n");
> exit(0);
> }
>
> memset(&req, 0, sizeof(req));
> req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
> req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
> req.n.nlmsg_type = RTM_GETLINK;
> req.r.ifi_family = AF_INET6;
> rta = (struct rtattr *)(((char *)&req) + NLMSG_ALIGN(req.n.nlmsg_len));
> rta->rta_len = RTA_LENGTH(16);
>
> status = send(fd, &req, req.n.nlmsg_len, 0);
> if (status < 0) {
> snmp_log(LOG_ERR,"Send failed. Exiting thread\n");
> exit(0);
> }
>
> Regards,
> Varun
>
> > Regards,
> > Bharati.
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-net" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at
> http://vger.kernel.org/majordomo-info.html
> >
> >
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html