1
/* Kernel routing table updates using netlink over GNU/Linux system.
2
* Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
4
* This file is part of GNU Zebra.
6
* GNU Zebra is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation; either version 2, or (at your option) any
11
* GNU Zebra is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with GNU Zebra; see the file COPYING. If not, write to the Free
18
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24
/* Hack for GNU libc version 2. */
26
#define MSG_TRUNC 0x20
27
#endif /* MSG_TRUNC */
33
#include "connected.h"
39
#include "zebra/zserv.h"
40
#include "zebra/redistribute.h"
41
#include "zebra/interface.h"
42
#include "zebra/debug.h"
44
/* Socket interface to kernel */
49
struct sockaddr_nl snl;
51
} netlink = { -1, 0, {0}, "netlink-listen"}, /* kernel messages */
52
netlink_cmd = { -1, 0, {0}, "netlink-cmd"}, /* command channel */
53
netlink_addr = { -1, 0, {0}, "netlink-addr"}; /* address channel */
55
struct message nlmsg_str[] = {
56
{RTM_NEWROUTE, "RTM_NEWROUTE"},
57
{RTM_DELROUTE, "RTM_DELROUTE"},
58
{RTM_GETROUTE, "RTM_GETROUTE"},
59
{RTM_NEWLINK, "RTM_NEWLINK"},
60
{RTM_DELLINK, "RTM_DELLINK"},
61
{RTM_GETLINK, "RTM_GETLINK"},
62
{RTM_NEWADDR, "RTM_NEWADDR"},
63
{RTM_DELADDR, "RTM_DELADDR"},
64
{RTM_GETADDR, "RTM_GETADDR"},
68
char *nexthop_types_desc[] =
74
"IPv4 nexthop with ifindex",
75
"IPv4 nexthop with ifname",
77
"IPv6 nexthop with ifindex",
78
"IPv6 nexthop with ifname",
83
extern struct zebra_t zebrad;
85
extern struct zebra_privs_t zserv_privs;
87
/* Make socket for Linux netlink interface. */
89
netlink_socket (struct nlsock *nl, unsigned long groups)
92
struct sockaddr_nl snl;
96
sock = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
99
zlog (NULL, LOG_ERR, "Can't open %s socket: %s", nl->name,
104
ret = fcntl (sock, F_SETFL, O_NONBLOCK);
107
zlog (NULL, LOG_ERR, "Can't set %s socket flags: %s", nl->name,
113
memset (&snl, 0, sizeof snl);
114
snl.nl_family = AF_NETLINK;
115
snl.nl_groups = groups;
117
/* Bind the socket to the netlink structure for anything. */
118
if (zserv_privs.change (ZPRIVS_RAISE))
120
zlog (NULL, LOG_ERR, "Can't raise privileges");
124
ret = bind (sock, (struct sockaddr *) &snl, sizeof snl);
127
if (zserv_privs.change (ZPRIVS_LOWER))
128
zlog (NULL, LOG_ERR, "Can't lower privileges");
129
zlog (NULL, LOG_ERR, "Can't bind %s socket to group 0x%x: %s",
130
nl->name, snl.nl_groups, strerror (errno));
135
if (zserv_privs.change (ZPRIVS_LOWER))
136
zlog (NULL, LOG_ERR, "Can't lower privileges");
138
/* multiple netlink sockets will have different nl_pid */
139
namelen = sizeof snl;
140
ret = getsockname (sock, (struct sockaddr *) &snl, &namelen);
141
if (ret < 0 || namelen != sizeof snl)
143
zlog (NULL, LOG_ERR, "Can't get %s socket name: %s", nl->name,
155
set_netlink_blocking (struct nlsock *nl, int *flags)
158
/* Change socket flags for blocking I/O. */
159
if ((*flags = fcntl (nl->sock, F_GETFL, 0)) < 0)
161
zlog (NULL, LOG_ERR, "%s:%i F_GETFL error: %s",
162
__FUNCTION__, __LINE__, strerror (errno));
165
*flags &= ~O_NONBLOCK;
166
if (fcntl (nl->sock, F_SETFL, *flags) < 0)
168
zlog (NULL, LOG_ERR, "%s:%i F_SETFL error: %s",
169
__FUNCTION__, __LINE__, strerror (errno));
176
set_netlink_nonblocking (struct nlsock *nl, int *flags)
178
/* Restore socket flags for nonblocking I/O */
179
*flags |= O_NONBLOCK;
180
if (fcntl (nl->sock, F_SETFL, *flags) < 0)
182
zlog (NULL, LOG_ERR, "%s:%i F_SETFL error: %s",
183
__FUNCTION__, __LINE__, strerror (errno));
189
/* Get type specified information from netlink. */
191
netlink_request (int family, int type, struct nlsock *nl)
194
struct sockaddr_nl snl;
203
/* Check netlink socket. */
206
zlog (NULL, LOG_ERR, "%s socket isn't active.", nl->name);
210
memset (&snl, 0, sizeof snl);
211
snl.nl_family = AF_NETLINK;
213
req.nlh.nlmsg_len = sizeof req;
214
req.nlh.nlmsg_type = type;
215
req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
216
req.nlh.nlmsg_pid = 0;
217
req.nlh.nlmsg_seq = ++nl->seq;
218
req.g.rtgen_family = family;
220
/* linux appears to check capabilities on every message
221
* have to raise caps for every message sent
223
if (zserv_privs.change (ZPRIVS_RAISE))
225
zlog (NULL, LOG_ERR, "Can't raise privileges");
229
ret = sendto (nl->sock, (void *) &req, sizeof req, 0,
230
(struct sockaddr *) &snl, sizeof snl);
232
if (zserv_privs.change (ZPRIVS_LOWER))
233
zlog (NULL, LOG_ERR, "Can't lower privileges");
237
zlog (NULL, LOG_ERR, "%s sendto failed: %s", nl->name,
245
/* Receive message from netlink interface and pass those information
246
to the given function. */
248
netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *),
258
struct iovec iov = { buf, sizeof buf };
259
struct sockaddr_nl snl;
260
struct msghdr msg = { (void *) &snl, sizeof snl, &iov, 1, NULL, 0, 0 };
263
if (zserv_privs.change (ZPRIVS_RAISE))
264
zlog (NULL, LOG_ERR, "Can't raise privileges");
266
status = recvmsg (nl->sock, &msg, 0);
268
if (zserv_privs.change (ZPRIVS_LOWER))
269
zlog (NULL, LOG_ERR, "Can't lower privileges");
275
if (errno == EWOULDBLOCK || errno == EAGAIN)
277
zlog (NULL, LOG_ERR, "%s recvmsg overrun", nl->name);
283
zlog (NULL, LOG_ERR, "%s EOF", nl->name);
287
if (msg.msg_namelen != sizeof snl)
289
zlog (NULL, LOG_ERR, "%s sender address length error: length %d",
290
nl->name, msg.msg_namelen);
294
/* JF: Ignore messages that aren't from the kernel */
295
if ( snl.nl_pid != 0 )
297
zlog ( NULL, LOG_ERR, "Ignoring message from pid %u", snl.nl_pid );
301
for (h = (struct nlmsghdr *) buf; NLMSG_OK (h, status);
302
h = NLMSG_NEXT (h, status))
304
/* Finish of reading. */
305
if (h->nlmsg_type == NLMSG_DONE)
308
/* Error handling. */
309
if (h->nlmsg_type == NLMSG_ERROR)
311
struct nlmsgerr *err = (struct nlmsgerr *) NLMSG_DATA (h);
313
/* If the error field is zero, then this is an ACK */
316
if (IS_ZEBRA_DEBUG_KERNEL)
318
zlog_info ("%s: %s ACK: type=%s(%u), seq=%u, pid=%d",
319
__FUNCTION__, nl->name,
320
lookup (nlmsg_str, err->msg.nlmsg_type),
321
err->msg.nlmsg_type, err->msg.nlmsg_seq,
325
/* return if not a multipart message, otherwise continue */
326
if (!(h->nlmsg_flags & NLM_F_MULTI))
333
if (h->nlmsg_len < NLMSG_LENGTH (sizeof (struct nlmsgerr)))
335
zlog (NULL, LOG_ERR, "%s error: message truncated",
340
/* Deal with Error Noise - MAG */
342
int loglvl = LOG_ERR;
343
int errnum = err->error;
344
int msg_type = err->msg.nlmsg_type;
346
if (nl == &netlink_cmd
347
&& (-errnum == ENODEV || -errnum == ESRCH)
348
&& (msg_type == RTM_NEWROUTE || msg_type == RTM_DELROUTE))
351
zlog (NULL, loglvl, "%s error: %s, type=%s(%u), "
353
nl->name, strerror (-errnum),
354
lookup (nlmsg_str, msg_type),
355
msg_type, err->msg.nlmsg_seq, err->msg.nlmsg_pid);
364
/* OK we got netlink message. */
365
if (IS_ZEBRA_DEBUG_KERNEL)
366
zlog_info ("netlink_parse_info: %s type %s(%u), seq=%u, pid=%d",
368
lookup (nlmsg_str, h->nlmsg_type), h->nlmsg_type,
369
h->nlmsg_seq, h->nlmsg_pid);
371
/* skip unsolicited messages originating from command socket */
372
if (nl != &netlink_cmd && h->nlmsg_pid == netlink_cmd.snl.nl_pid)
374
if (IS_ZEBRA_DEBUG_KERNEL)
375
zlog_info ("netlink_parse_info: %s packet comes from %s",
376
nl->name, netlink_cmd.name);
380
error = (*filter) (&snl, h);
383
zlog (NULL, LOG_ERR, "%s filter function error", nl->name);
388
/* After error care. */
389
if (msg.msg_flags & MSG_TRUNC)
391
zlog (NULL, LOG_ERR, "%s error: message truncated", nl->name);
396
zlog (NULL, LOG_ERR, "%s error: data remnant size %d", nl->name,
404
/* Utility function for parse rtattr. */
406
netlink_parse_rtattr (struct rtattr **tb, int max, struct rtattr *rta,
409
while (RTA_OK (rta, len))
411
if (rta->rta_type <= max)
412
tb[rta->rta_type] = rta;
413
rta = RTA_NEXT (rta, len);
417
/* Called from interface_lookup_netlink(). This function is only used
420
netlink_interface (struct sockaddr_nl *snl, struct nlmsghdr *h)
423
struct ifinfomsg *ifi;
424
struct rtattr *tb[IFLA_MAX + 1];
425
struct interface *ifp;
429
ifi = NLMSG_DATA (h);
431
if (h->nlmsg_type != RTM_NEWLINK)
434
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifinfomsg));
438
/* Looking up interface name. */
439
memset (tb, 0, sizeof tb);
440
netlink_parse_rtattr (tb, IFLA_MAX, IFLA_RTA (ifi), len);
441
if (tb[IFLA_IFNAME] == NULL)
443
name = (char *) RTA_DATA (tb[IFLA_IFNAME]);
446
ifp = if_get_by_name (name);
448
ifp->ifindex = ifi->ifi_index;
449
ifp->flags = ifi->ifi_flags & 0x0000fffff;
450
ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]);
453
/* Hardware type and address. */
454
ifp->hw_type = ifi->ifi_type;
456
if (tb[IFLA_ADDRESS])
460
hw_addr_len = RTA_PAYLOAD (tb[IFLA_ADDRESS]);
462
if (hw_addr_len > INTERFACE_HWADDR_MAX)
463
zlog_warn ("Hardware address is too large: %d", hw_addr_len);
466
ifp->hw_addr_len = hw_addr_len;
467
memcpy (ifp->hw_addr, RTA_DATA (tb[IFLA_ADDRESS]), hw_addr_len);
469
for (i = 0; i < hw_addr_len; i++)
470
if (ifp->hw_addr[i] != 0)
473
if (i == hw_addr_len)
474
ifp->hw_addr_len = 0;
476
ifp->hw_addr_len = hw_addr_len;
485
/* Lookup interface IPv4/IPv6 address. */
487
netlink_interface_addr (struct sockaddr_nl *snl, struct nlmsghdr *h)
490
struct ifaddrmsg *ifa;
491
struct rtattr *tb[IFA_MAX + 1];
492
struct interface *ifp;
498
ifa = NLMSG_DATA (h);
500
if (ifa->ifa_family != AF_INET
502
&& ifa->ifa_family != AF_INET6
503
#endif /* HAVE_IPV6 */
507
if (h->nlmsg_type != RTM_NEWADDR && h->nlmsg_type != RTM_DELADDR)
510
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifaddrmsg));
514
memset (tb, 0, sizeof tb);
515
netlink_parse_rtattr (tb, IFA_MAX, IFA_RTA (ifa), len);
517
ifp = if_lookup_by_index (ifa->ifa_index);
520
zlog_err ("netlink_interface_addr can't find interface by index %d",
525
if (IS_ZEBRA_DEBUG_KERNEL) /* remove this line to see initial ifcfg */
528
zlog_info ("netlink_interface_addr %s %s/%d:",
529
lookup (nlmsg_str, h->nlmsg_type),
530
ifp->name, ifa->ifa_prefixlen);
532
zlog_info (" IFA_LOCAL %s", inet_ntop (ifa->ifa_family,
533
RTA_DATA (tb[IFA_LOCAL]),
536
zlog_info (" IFA_ADDRESS %s", inet_ntop (ifa->ifa_family,
540
if (tb[IFA_BROADCAST])
541
zlog_info (" IFA_BROADCAST %s", inet_ntop (ifa->ifa_family,
545
if (tb[IFA_LABEL] && strcmp (ifp->name, RTA_DATA (tb[IFA_LABEL])))
546
zlog_info (" IFA_LABEL %s", (char *)RTA_DATA (tb[IFA_LABEL]));
549
if (tb[IFA_ADDRESS] == NULL)
550
tb[IFA_ADDRESS] = tb[IFA_LOCAL];
552
if (ifp->flags & IFF_POINTOPOINT)
556
addr = RTA_DATA (tb[IFA_LOCAL]);
558
broad = RTA_DATA (tb[IFA_ADDRESS]);
565
addr = RTA_DATA (tb[IFA_ADDRESS]);
573
addr = RTA_DATA (tb[IFA_ADDRESS]);
577
if (tb[IFA_BROADCAST])
578
broad = RTA_DATA(tb[IFA_BROADCAST]);
584
if (ifa->ifa_flags & IFA_F_SECONDARY)
585
SET_FLAG (flags, ZEBRA_IFA_SECONDARY);
589
label = (char *) RTA_DATA (tb[IFA_LABEL]);
591
if (ifp && label && strcmp (ifp->name, label) == 0)
594
/* Register interface address to the interface. */
595
if (ifa->ifa_family == AF_INET)
597
if (h->nlmsg_type == RTM_NEWADDR)
598
connected_add_ipv4 (ifp, flags,
599
(struct in_addr *) addr, ifa->ifa_prefixlen,
600
(struct in_addr *) broad, label);
602
connected_delete_ipv4 (ifp, flags,
603
(struct in_addr *) addr, ifa->ifa_prefixlen,
604
(struct in_addr *) broad, label);
607
if (ifa->ifa_family == AF_INET6)
609
if (h->nlmsg_type == RTM_NEWADDR)
610
connected_add_ipv6 (ifp,
611
(struct in6_addr *) addr, ifa->ifa_prefixlen,
612
(struct in6_addr *) broad);
614
connected_delete_ipv6 (ifp,
615
(struct in6_addr *) addr, ifa->ifa_prefixlen,
616
(struct in6_addr *) broad);
618
#endif /* HAVE_IPV6 */
623
/* Looking up routing table by netlink interface. */
625
netlink_routing_table (struct sockaddr_nl *snl, struct nlmsghdr *h)
629
struct rtattr *tb[RTA_MAX + 1];
632
char anyaddr[16] = { 0 };
641
rtm = NLMSG_DATA (h);
643
if (h->nlmsg_type != RTM_NEWROUTE)
645
if (rtm->rtm_type != RTN_UNICAST)
648
table = rtm->rtm_table;
649
#if 0 /* we weed them out later in rib_weed_tables () */
650
if (table != RT_TABLE_MAIN && table != zebrad.rtm_table_default)
654
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct rtmsg));
658
memset (tb, 0, sizeof tb);
659
netlink_parse_rtattr (tb, RTA_MAX, RTM_RTA (rtm), len);
661
if (rtm->rtm_flags & RTM_F_CLONED)
663
if (rtm->rtm_protocol == RTPROT_REDIRECT)
665
if (rtm->rtm_protocol == RTPROT_KERNEL)
668
if (rtm->rtm_src_len != 0)
671
/* Route which inserted by Zebra. */
672
if (rtm->rtm_protocol == RTPROT_ZEBRA)
673
flags |= ZEBRA_FLAG_SELFROUTE;
681
index = *(int *) RTA_DATA (tb[RTA_OIF]);
684
dest = RTA_DATA (tb[RTA_DST]);
688
/* Multipath treatment is needed. */
690
gate = RTA_DATA (tb[RTA_GATEWAY]);
692
if (tb[RTA_PRIORITY])
693
metric = *(int *) RTA_DATA(tb[RTA_PRIORITY]);
695
if (rtm->rtm_family == AF_INET)
697
struct prefix_ipv4 p;
699
memcpy (&p.prefix, dest, 4);
700
p.prefixlen = rtm->rtm_dst_len;
702
rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, index, table, metric, 0);
705
if (rtm->rtm_family == AF_INET6)
707
struct prefix_ipv6 p;
709
memcpy (&p.prefix, dest, 16);
710
p.prefixlen = rtm->rtm_dst_len;
712
rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, index, table);
714
#endif /* HAVE_IPV6 */
719
struct message rtproto_str[] = {
720
{RTPROT_REDIRECT, "redirect"},
721
{RTPROT_KERNEL, "kernel"},
722
{RTPROT_BOOT, "boot"},
723
{RTPROT_STATIC, "static"},
724
{RTPROT_GATED, "GateD"},
725
{RTPROT_RA, "router advertisement"},
727
{RTPROT_ZEBRA, "Zebra"},
729
{RTPROT_BIRD, "BIRD"},
730
#endif /* RTPROT_BIRD */
734
/* Routing information change from the kernel. */
736
netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
740
struct rtattr *tb[RTA_MAX + 1];
742
char anyaddr[16] = { 0 };
749
rtm = NLMSG_DATA (h);
751
if (!(h->nlmsg_type == RTM_NEWROUTE || h->nlmsg_type == RTM_DELROUTE))
753
/* If this is not route add/delete message print warning. */
754
zlog_warn ("Kernel message: %d\n", h->nlmsg_type);
758
/* Connected route. */
759
if (IS_ZEBRA_DEBUG_KERNEL)
760
zlog_info ("%s %s %s proto %s",
762
RTM_NEWROUTE ? "RTM_NEWROUTE" : "RTM_DELROUTE",
763
rtm->rtm_family == AF_INET ? "ipv4" : "ipv6",
764
rtm->rtm_type == RTN_UNICAST ? "unicast" : "multicast",
765
lookup (rtproto_str, rtm->rtm_protocol));
767
if (rtm->rtm_type != RTN_UNICAST)
772
table = rtm->rtm_table;
773
if (table != RT_TABLE_MAIN && table != zebrad.rtm_table_default)
778
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct rtmsg));
782
memset (tb, 0, sizeof tb);
783
netlink_parse_rtattr (tb, RTA_MAX, RTM_RTA (rtm), len);
785
if (rtm->rtm_flags & RTM_F_CLONED)
787
if (rtm->rtm_protocol == RTPROT_REDIRECT)
789
if (rtm->rtm_protocol == RTPROT_KERNEL)
792
if (rtm->rtm_protocol == RTPROT_ZEBRA && h->nlmsg_type == RTM_NEWROUTE)
795
if (rtm->rtm_src_len != 0)
797
zlog_warn ("netlink_route_change(): no src len");
806
index = *(int *) RTA_DATA (tb[RTA_OIF]);
809
dest = RTA_DATA (tb[RTA_DST]);
814
gate = RTA_DATA (tb[RTA_GATEWAY]);
816
if (rtm->rtm_family == AF_INET)
818
struct prefix_ipv4 p;
820
memcpy (&p.prefix, dest, 4);
821
p.prefixlen = rtm->rtm_dst_len;
823
if (IS_ZEBRA_DEBUG_KERNEL)
825
if (h->nlmsg_type == RTM_NEWROUTE)
826
zlog_info ("RTM_NEWROUTE %s/%d",
827
inet_ntoa (p.prefix), p.prefixlen);
829
zlog_info ("RTM_DELROUTE %s/%d",
830
inet_ntoa (p.prefix), p.prefixlen);
833
if (h->nlmsg_type == RTM_NEWROUTE)
834
rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, table, 0, 0);
836
rib_delete_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, table);
840
if (rtm->rtm_family == AF_INET6)
842
struct prefix_ipv6 p;
846
memcpy (&p.prefix, dest, 16);
847
p.prefixlen = rtm->rtm_dst_len;
849
if (IS_ZEBRA_DEBUG_KERNEL)
851
if (h->nlmsg_type == RTM_NEWROUTE)
852
zlog_info ("RTM_NEWROUTE %s/%d",
853
inet_ntop (AF_INET6, &p.prefix, buf, BUFSIZ),
856
zlog_info ("RTM_DELROUTE %s/%d",
857
inet_ntop (AF_INET6, &p.prefix, buf, BUFSIZ),
861
if (h->nlmsg_type == RTM_NEWROUTE)
862
rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0);
864
rib_delete_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0);
866
#endif /* HAVE_IPV6 */
872
netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
875
struct ifinfomsg *ifi;
876
struct rtattr *tb[IFLA_MAX + 1];
877
struct interface *ifp;
880
ifi = NLMSG_DATA (h);
882
if (!(h->nlmsg_type == RTM_NEWLINK || h->nlmsg_type == RTM_DELLINK))
884
/* If this is not link add/delete message so print warning. */
885
zlog_warn ("netlink_link_change: wrong kernel message %d\n",
890
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifinfomsg));
894
/* Looking up interface name. */
895
memset (tb, 0, sizeof tb);
896
netlink_parse_rtattr (tb, IFLA_MAX, IFLA_RTA (ifi), len);
897
if (tb[IFLA_IFNAME] == NULL)
899
name = (char *) RTA_DATA (tb[IFLA_IFNAME]);
902
if (h->nlmsg_type == RTM_NEWLINK)
904
ifp = if_lookup_by_name (name);
906
if (ifp == NULL || !CHECK_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE))
909
ifp = if_get_by_name (name);
911
ifp->ifindex = ifi->ifi_index;
912
ifp->flags = ifi->ifi_flags & 0x0000fffff;
913
ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]);
916
/* If new link is added. */
921
/* Interface status change. */
922
ifp->ifindex = ifi->ifi_index;
923
ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]);
926
if (if_is_operative (ifp))
928
ifp->flags = ifi->ifi_flags & 0x0000fffff;
929
if (!if_is_operative (ifp))
934
ifp->flags = ifi->ifi_flags & 0x0000fffff;
935
if (if_is_operative (ifp))
943
ifp = if_lookup_by_name (name);
947
zlog (NULL, LOG_WARNING, "interface %s is deleted but can't find",
952
if_delete_update (ifp);
959
netlink_information_fetch (struct sockaddr_nl *snl, struct nlmsghdr *h)
961
switch (h->nlmsg_type)
964
return netlink_route_change (snl, h);
967
return netlink_route_change (snl, h);
970
return netlink_link_change (snl, h);
973
return netlink_link_change (snl, h);
976
return netlink_interface_addr (snl, h);
979
return netlink_interface_addr (snl, h);
982
zlog_warn ("Unknown netlink nlmsg_type %d\n", h->nlmsg_type);
988
/* Interface lookup by netlink socket. */
990
interface_lookup_netlink ()
997
* Change netlink socket flags to blocking to ensure we get
998
* a reply via nelink_parse_info
1000
snb_ret = set_netlink_blocking (&netlink_cmd, &flags);
1002
zlog (NULL, LOG_WARNING,
1003
"%s:%i Warning: Could not set netlink socket to blocking.",
1004
__FUNCTION__, __LINE__);
1006
/* Get interface information. */
1007
ret = netlink_request (AF_PACKET, RTM_GETLINK, &netlink_cmd);
1010
ret = netlink_parse_info (netlink_interface, &netlink_cmd);
1014
/* Get IPv4 address of the interfaces. */
1015
ret = netlink_request (AF_INET, RTM_GETADDR, &netlink_cmd);
1018
ret = netlink_parse_info (netlink_interface_addr, &netlink_cmd);
1023
/* Get IPv6 address of the interfaces. */
1024
ret = netlink_request (AF_INET6, RTM_GETADDR, &netlink_cmd);
1027
ret = netlink_parse_info (netlink_interface_addr, &netlink_cmd);
1030
#endif /* HAVE_IPV6 */
1032
/* restore socket flags */
1034
set_netlink_nonblocking (&netlink_cmd, &flags);
1038
/* Routing table read function using netlink interface. Only called
1041
netlink_route_read ()
1048
* Change netlink socket flags to blocking to ensure we get
1049
* a reply via nelink_parse_info
1051
snb_ret = set_netlink_blocking (&netlink_cmd, &flags);
1053
zlog (NULL, LOG_WARNING,
1054
"%s:%i Warning: Could not set netlink socket to blocking.",
1055
__FUNCTION__, __LINE__);
1057
/* Get IPv4 routing table. */
1058
ret = netlink_request (AF_INET, RTM_GETROUTE, &netlink_cmd);
1061
ret = netlink_parse_info (netlink_routing_table, &netlink_cmd);
1066
/* Get IPv6 routing table. */
1067
ret = netlink_request (AF_INET6, RTM_GETROUTE, &netlink_cmd);
1070
ret = netlink_parse_info (netlink_routing_table, &netlink_cmd);
1073
#endif /* HAVE_IPV6 */
1077
set_netlink_nonblocking (&netlink_cmd, &flags);
1081
/* Utility function comes from iproute2.
1082
Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */
1084
addattr_l (struct nlmsghdr *n, int maxlen, int type, void *data, int alen)
1089
len = RTA_LENGTH (alen);
1091
if (NLMSG_ALIGN (n->nlmsg_len) + len > maxlen)
1094
rta = (struct rtattr *) (((char *) n) + NLMSG_ALIGN (n->nlmsg_len));
1095
rta->rta_type = type;
1097
memcpy (RTA_DATA (rta), data, alen);
1098
n->nlmsg_len = NLMSG_ALIGN (n->nlmsg_len) + len;
1104
rta_addattr_l (struct rtattr *rta, int maxlen, int type, void *data, int alen)
1107
struct rtattr *subrta;
1109
len = RTA_LENGTH (alen);
1111
if (RTA_ALIGN (rta->rta_len) + len > maxlen)
1114
subrta = (struct rtattr *) (((char *) rta) + RTA_ALIGN (rta->rta_len));
1115
subrta->rta_type = type;
1116
subrta->rta_len = len;
1117
memcpy (RTA_DATA (subrta), data, alen);
1118
rta->rta_len = NLMSG_ALIGN (rta->rta_len) + len;
1123
/* Utility function comes from iproute2.
1124
Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */
1126
addattr32 (struct nlmsghdr *n, int maxlen, int type, int data)
1131
len = RTA_LENGTH (4);
1133
if (NLMSG_ALIGN (n->nlmsg_len) + len > maxlen)
1136
rta = (struct rtattr *) (((char *) n) + NLMSG_ALIGN (n->nlmsg_len));
1137
rta->rta_type = type;
1139
memcpy (RTA_DATA (rta), &data, 4);
1140
n->nlmsg_len = NLMSG_ALIGN (n->nlmsg_len) + len;
1146
netlink_talk_filter (struct sockaddr_nl *snl, struct nlmsghdr *h)
1148
zlog_warn ("netlink_talk: ignoring message type 0x%04x", h->nlmsg_type);
1152
/* sendmsg() to netlink socket then recvmsg(). */
1154
netlink_talk (struct nlmsghdr *n, struct nlsock *nl)
1157
struct sockaddr_nl snl;
1158
struct iovec iov = { (void *) n, n->nlmsg_len };
1159
struct msghdr msg = { (void *) &snl, sizeof snl, &iov, 1, NULL, 0, 0 };
1163
memset (&snl, 0, sizeof snl);
1164
snl.nl_family = AF_NETLINK;
1166
n->nlmsg_seq = ++netlink_cmd.seq;
1168
/* Request an acknowledgement by setting NLM_F_ACK */
1169
n->nlmsg_flags |= NLM_F_ACK;
1171
if (IS_ZEBRA_DEBUG_KERNEL)
1172
zlog_info ("netlink_talk: %s type %s(%u), seq=%u", netlink_cmd.name,
1173
lookup (nlmsg_str, n->nlmsg_type), n->nlmsg_type,
1176
/* Send message to netlink interface. */
1177
if (zserv_privs.change (ZPRIVS_RAISE))
1178
zlog (NULL, LOG_ERR, "Can't raise privileges");
1179
status = sendmsg (nl->sock, &msg, 0);
1180
if (zserv_privs.change (ZPRIVS_LOWER))
1181
zlog (NULL, LOG_ERR, "Can't lower privileges");
1185
zlog (NULL, LOG_ERR, "netlink_talk sendmsg() error: %s",
1191
* Change socket flags for blocking I/O.
1192
* This ensures we wait for a reply in netlink_parse_info().
1194
snb_ret = set_netlink_blocking (nl, &flags);
1196
zlog (NULL, LOG_WARNING,
1197
"%s:%i Warning: Could not set netlink socket to blocking.",
1198
__FUNCTION__, __LINE__);
1201
* Get reply from netlink socket.
1202
* The reply should either be an acknowlegement or an error.
1204
status = netlink_parse_info (netlink_talk_filter, nl);
1206
/* Restore socket flags for nonblocking I/O */
1208
set_netlink_nonblocking (nl, &flags);
1213
/* Routing table change via netlink interface. */
1215
netlink_route (int cmd, int family, void *dest, int length, void *gate,
1216
int index, int zebra_flags, int table)
1220
struct sockaddr_nl snl;
1230
memset (&req, 0, sizeof req);
1232
bytelen = (family == AF_INET ? 4 : 16);
1234
req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtmsg));
1235
req.n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
1236
req.n.nlmsg_type = cmd;
1237
req.r.rtm_family = family;
1238
req.r.rtm_table = table;
1239
req.r.rtm_dst_len = length;
1241
if ((zebra_flags & ZEBRA_FLAG_BLACKHOLE)
1242
|| (zebra_flags & ZEBRA_FLAG_REJECT))
1247
if (cmd == RTM_NEWROUTE)
1249
req.r.rtm_protocol = RTPROT_ZEBRA;
1250
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
1254
if (zebra_flags & ZEBRA_FLAG_BLACKHOLE)
1255
req.r.rtm_type = RTN_BLACKHOLE;
1256
else if (zebra_flags & ZEBRA_FLAG_REJECT)
1257
req.r.rtm_type = RTN_UNREACHABLE;
1259
assert (RTN_BLACKHOLE != RTN_UNREACHABLE); /* false */
1262
req.r.rtm_type = RTN_UNICAST;
1266
addattr_l (&req.n, sizeof req, RTA_DST, dest, bytelen);
1271
addattr_l (&req.n, sizeof req, RTA_GATEWAY, gate, bytelen);
1273
addattr32 (&req.n, sizeof req, RTA_OIF, index);
1276
/* Destination netlink address. */
1277
memset (&snl, 0, sizeof snl);
1278
snl.nl_family = AF_NETLINK;
1280
/* Talk to netlink socket. */
1281
ret = netlink_talk (&req.n, &netlink);
1288
/* Routing table change via netlink interface. */
1290
netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
1294
struct sockaddr_nl snl;
1295
struct nexthop *nexthop = NULL;
1296
int nexthop_num = 0;
1307
memset (&req, 0, sizeof req);
1309
bytelen = (family == AF_INET ? 4 : 16);
1311
req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtmsg));
1312
req.n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
1313
req.n.nlmsg_type = cmd;
1314
req.r.rtm_family = family;
1315
req.r.rtm_table = rib->table;
1316
req.r.rtm_dst_len = p->prefixlen;
1318
#ifdef RTM_F_EQUALIZE
1319
req.r.rtm_flags |= RTM_F_EQUALIZE;
1320
#endif /* RTM_F_EQUALIZE */
1322
if ((rib->flags & ZEBRA_FLAG_BLACKHOLE) || (rib->flags & ZEBRA_FLAG_REJECT))
1327
if (cmd == RTM_NEWROUTE)
1329
req.r.rtm_protocol = RTPROT_ZEBRA;
1330
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
1334
if (rib->flags & ZEBRA_FLAG_BLACKHOLE)
1335
req.r.rtm_type = RTN_BLACKHOLE;
1336
else if (rib->flags & ZEBRA_FLAG_REJECT)
1337
req.r.rtm_type = RTN_UNREACHABLE;
1339
assert (RTN_BLACKHOLE != RTN_UNREACHABLE); /* false */
1342
req.r.rtm_type = RTN_UNICAST;
1345
addattr_l (&req.n, sizeof req, RTA_DST, &p->u.prefix, bytelen);
1348
addattr32 (&req.n, sizeof req, RTA_PRIORITY, rib->metric);
1352
if (cmd == RTM_NEWROUTE)
1353
for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
1354
SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
1358
/* Multipath case. */
1359
if (rib->nexthop_active_num == 1 || MULTIPATH_NUM == 1)
1361
for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
1364
if ((cmd == RTM_NEWROUTE
1365
&& CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1366
|| (cmd == RTM_DELROUTE
1367
&& CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))
1370
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
1372
if (IS_ZEBRA_DEBUG_KERNEL)
1375
("netlink_route_multipath() (recursive, 1 hop): "
1376
"%s %s/%d via %s if %u, type %s",
1377
lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
1378
p->prefixlen, inet_ntoa (nexthop->rgate.ipv4),
1380
nexthop_types_desc[nexthop->rtype]);
1383
if (nexthop->rtype == NEXTHOP_TYPE_IPV4
1384
|| nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
1385
addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1386
&nexthop->rgate.ipv4, bytelen);
1388
if (nexthop->rtype == NEXTHOP_TYPE_IPV6
1389
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
1390
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
1391
addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1392
&nexthop->rgate.ipv6, bytelen);
1393
#endif /* HAVE_IPV6 */
1394
if (nexthop->rtype == NEXTHOP_TYPE_IFINDEX
1395
|| nexthop->rtype == NEXTHOP_TYPE_IFNAME
1396
|| nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX
1397
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
1398
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
1399
addattr32 (&req.n, sizeof req, RTA_OIF,
1404
if (IS_ZEBRA_DEBUG_KERNEL)
1407
("netlink_route_multipath(): (single hop)"
1408
"%s %s/%d via %s if %u, type %s",
1409
lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
1410
p->prefixlen, inet_ntoa (nexthop->gate.ipv4),
1412
nexthop_types_desc[nexthop->type]);
1415
if (nexthop->type == NEXTHOP_TYPE_IPV4
1416
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
1417
addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1418
&nexthop->gate.ipv4, bytelen);
1420
if (nexthop->type == NEXTHOP_TYPE_IPV6
1421
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
1422
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
1423
addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1424
&nexthop->gate.ipv6, bytelen);
1425
#endif /* HAVE_IPV6 */
1426
if (nexthop->type == NEXTHOP_TYPE_IFINDEX
1427
|| nexthop->type == NEXTHOP_TYPE_IFNAME
1428
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX
1429
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX
1430
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
1431
addattr32 (&req.n, sizeof req, RTA_OIF, nexthop->ifindex);
1434
if (cmd == RTM_NEWROUTE)
1435
SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
1445
struct rtattr *rta = (void *) buf;
1446
struct rtnexthop *rtnh;
1448
rta->rta_type = RTA_MULTIPATH;
1449
rta->rta_len = RTA_LENGTH (0);
1450
rtnh = RTA_DATA (rta);
1453
for (nexthop = rib->nexthop;
1454
nexthop && (MULTIPATH_NUM == 0 || nexthop_num < MULTIPATH_NUM);
1455
nexthop = nexthop->next)
1457
if ((cmd == RTM_NEWROUTE
1458
&& CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1459
|| (cmd == RTM_DELROUTE
1460
&& CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))
1464
rtnh->rtnh_len = sizeof (*rtnh);
1465
rtnh->rtnh_flags = 0;
1466
rtnh->rtnh_hops = 0;
1467
rta->rta_len += rtnh->rtnh_len;
1469
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
1471
if (IS_ZEBRA_DEBUG_KERNEL)
1473
zlog_info ("netlink_route_multipath() "
1474
"(recursive, multihop): "
1475
"%s %s/%d via %s if %u, type %s",
1476
lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
1477
p->prefixlen, inet_ntoa (nexthop->rgate.ipv4),
1479
nexthop_types_desc[nexthop->type]);
1481
if (nexthop->rtype == NEXTHOP_TYPE_IPV4
1482
|| nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
1484
rta_addattr_l (rta, 4096, RTA_GATEWAY,
1485
&nexthop->rgate.ipv4, bytelen);
1486
rtnh->rtnh_len += sizeof (struct rtattr) + 4;
1489
if (nexthop->rtype == NEXTHOP_TYPE_IPV6
1490
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME
1491
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX)
1492
rta_addattr_l (rta, 4096, RTA_GATEWAY,
1493
&nexthop->rgate.ipv6, bytelen);
1494
#endif /* HAVE_IPV6 */
1496
if (nexthop->rtype == NEXTHOP_TYPE_IFINDEX
1497
|| nexthop->rtype == NEXTHOP_TYPE_IFNAME
1498
|| nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX
1499
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
1500
|| nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
1501
rtnh->rtnh_ifindex = nexthop->rifindex;
1503
rtnh->rtnh_ifindex = 0;
1507
if (IS_ZEBRA_DEBUG_KERNEL)
1509
zlog_info ("netlink_route_multipath() "
1511
"%s %s/%d via %s if %u, type %s",
1512
lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
1513
p->prefixlen, inet_ntoa (nexthop->rgate.ipv4),
1515
nexthop_types_desc[nexthop->type]);
1517
if (nexthop->type == NEXTHOP_TYPE_IPV4
1518
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
1520
rta_addattr_l (rta, 4096, RTA_GATEWAY,
1521
&nexthop->gate.ipv4, bytelen);
1522
rtnh->rtnh_len += sizeof (struct rtattr) + 4;
1525
if (nexthop->type == NEXTHOP_TYPE_IPV6
1526
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
1527
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
1528
rta_addattr_l (rta, 4096, RTA_GATEWAY,
1529
&nexthop->gate.ipv6, bytelen);
1530
#endif /* HAVE_IPV6 */
1532
if (nexthop->type == NEXTHOP_TYPE_IFINDEX
1533
|| nexthop->type == NEXTHOP_TYPE_IFNAME
1534
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX
1535
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
1536
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
1537
rtnh->rtnh_ifindex = nexthop->ifindex;
1539
rtnh->rtnh_ifindex = 0;
1541
rtnh = RTNH_NEXT (rtnh);
1543
if (cmd == RTM_NEWROUTE)
1544
SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
1548
if (rta->rta_len > RTA_LENGTH (0))
1549
addattr_l (&req.n, 1024, RTA_MULTIPATH, RTA_DATA (rta),
1553
/* If there is no useful nexthop then return. */
1554
if (nexthop_num == 0)
1556
if (IS_ZEBRA_DEBUG_KERNEL)
1557
zlog_info ("netlink_route_multipath(): No useful nexthop.");
1563
/* Destination netlink address. */
1564
memset (&snl, 0, sizeof snl);
1565
snl.nl_family = AF_NETLINK;
1567
if (family == AF_INET)
1572
/* Talk to netlink socket. */
1573
return netlink_talk (&req.n, nl);
1577
kernel_add_ipv4 (struct prefix *p, struct rib *rib)
1579
return netlink_route_multipath (RTM_NEWROUTE, p, rib, AF_INET);
1583
kernel_delete_ipv4 (struct prefix *p, struct rib *rib)
1585
return netlink_route_multipath (RTM_DELROUTE, p, rib, AF_INET);
1590
kernel_add_ipv6 (struct prefix *p, struct rib *rib)
1592
return netlink_route_multipath (RTM_NEWROUTE, p, rib, AF_INET6);
1596
kernel_delete_ipv6 (struct prefix *p, struct rib *rib)
1598
return netlink_route_multipath (RTM_DELROUTE, p, rib, AF_INET6);
1601
/* Delete IPv6 route from the kernel. */
1603
kernel_delete_ipv6_old (struct prefix_ipv6 *dest, struct in6_addr *gate,
1604
int index, int flags, int table)
1606
return netlink_route (RTM_DELROUTE, AF_INET6, &dest->prefix,
1607
dest->prefixlen, gate, index, flags, table);
1609
#endif /* HAVE_IPV6 */
1611
/* Interface address modification. */
1613
netlink_address (int cmd, int family, struct interface *ifp,
1614
struct connected *ifc)
1622
struct ifaddrmsg ifa;
1627
memset (&req, 0, sizeof req);
1629
bytelen = (family == AF_INET ? 4 : 16);
1631
req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct ifaddrmsg));
1632
req.n.nlmsg_flags = NLM_F_REQUEST;
1633
req.n.nlmsg_type = cmd;
1634
req.ifa.ifa_family = family;
1636
req.ifa.ifa_index = ifp->ifindex;
1637
req.ifa.ifa_prefixlen = p->prefixlen;
1639
addattr_l (&req.n, sizeof req, IFA_LOCAL, &p->u.prefix, bytelen);
1641
if (family == AF_INET && cmd == RTM_NEWADDR)
1643
if (if_is_broadcast (ifp) && ifc->destination)
1645
p = ifc->destination;
1646
addattr_l (&req.n, sizeof req, IFA_BROADCAST, &p->u.prefix,
1651
if (CHECK_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY))
1652
SET_FLAG (req.ifa.ifa_flags, IFA_F_SECONDARY);
1655
addattr_l (&req.n, sizeof req, IFA_LABEL, ifc->label,
1656
strlen (ifc->label) + 1);
1658
return netlink_talk (&req.n, &netlink_cmd);
1662
kernel_address_add_ipv4 (struct interface *ifp, struct connected *ifc)
1664
return netlink_address (RTM_NEWADDR, AF_INET, ifp, ifc);
1668
kernel_address_delete_ipv4 (struct interface *ifp, struct connected *ifc)
1670
return netlink_address (RTM_DELADDR, AF_INET, ifp, ifc);
1674
extern struct thread_master *master;
1676
/* Kernel route reflection. */
1678
kernel_read (struct thread *thread)
1683
sock = THREAD_FD (thread);
1684
ret = netlink_parse_info (netlink_information_fetch, &netlink);
1685
thread_add_read (zebrad.master, kernel_read, NULL, netlink.sock);
1690
/* Exported interface function. This function simply calls
1691
netlink_socket (). */
1695
unsigned long groups;
1697
groups = RTMGRP_LINK | RTMGRP_IPV4_ROUTE | RTMGRP_IPV4_IFADDR;
1699
groups |= RTMGRP_IPV6_ROUTE | RTMGRP_IPV6_IFADDR;
1700
#endif /* HAVE_IPV6 */
1701
netlink_socket (&netlink, groups);
1702
netlink_socket (&netlink_cmd, 0);
1704
/* Register kernel socket. */
1705
if (netlink.sock > 0)
1706
thread_add_read (zebrad.master, kernel_read, NULL, netlink.sock);