]> git.proxmox.com Git - mirror_frr.git/blob - zebra/rt_netlink.c
[zebra] Record NEWADDR metric on PF_ROUTE, print CACHEINFO debug on netlink
[mirror_frr.git] / zebra / rt_netlink.c
1 /* Kernel routing table updates using netlink over GNU/Linux system.
2 * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
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
9 * later version.
10 *
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.
15 *
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
19 * 02111-1307, USA.
20 */
21
22 #include <zebra.h>
23
24 /* Hack for GNU libc version 2. */
25 #ifndef MSG_TRUNC
26 #define MSG_TRUNC 0x20
27 #endif /* MSG_TRUNC */
28
29 #include "linklist.h"
30 #include "if.h"
31 #include "log.h"
32 #include "prefix.h"
33 #include "connected.h"
34 #include "table.h"
35 #include "rib.h"
36 #include "thread.h"
37 #include "privs.h"
38
39 #include "zebra/zserv.h"
40 #include "zebra/rt.h"
41 #include "zebra/redistribute.h"
42 #include "zebra/interface.h"
43 #include "zebra/debug.h"
44
45 /* Socket interface to kernel */
46 struct nlsock
47 {
48 int sock;
49 int seq;
50 struct sockaddr_nl snl;
51 const char *name;
52 } netlink = { -1, 0, {0}, "netlink-listen"}, /* kernel messages */
53 netlink_cmd = { -1, 0, {0}, "netlink-cmd"}; /* command channel */
54
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"},
65 {0, NULL}
66 };
67
68 const char *nexthop_types_desc[] =
69 {
70 "none",
71 "Directly connected",
72 "Interface route",
73 "IPv4 nexthop",
74 "IPv4 nexthop with ifindex",
75 "IPv4 nexthop with ifname",
76 "IPv6 nexthop",
77 "IPv6 nexthop with ifindex",
78 "IPv6 nexthop with ifname",
79 "Null0 nexthop",
80 };
81
82
83 extern struct zebra_t zebrad;
84
85 extern struct zebra_privs_t zserv_privs;
86
87 extern u_int32_t nl_rcvbufsize;
88
89 /* Note: on netlink systems, there should be a 1-to-1 mapping between interface
90 names and ifindex values. */
91 static void
92 set_ifindex(struct interface *ifp, unsigned int ifi_index)
93 {
94 struct interface *oifp;
95
96 if (((oifp = if_lookup_by_index(ifi_index)) != NULL) && (oifp != ifp))
97 {
98 if (ifi_index == IFINDEX_INTERNAL)
99 zlog_err("Netlink is setting interface %s ifindex to reserved "
100 "internal value %u", ifp->name, ifi_index);
101 else
102 {
103 if (IS_ZEBRA_DEBUG_KERNEL)
104 zlog_debug("interface index %d was renamed from %s to %s",
105 ifi_index, oifp->name, ifp->name);
106 if (if_is_up(oifp))
107 zlog_err("interface rename detected on up interface: index %d "
108 "was renamed from %s to %s, results are uncertain!",
109 ifi_index, oifp->name, ifp->name);
110 if_delete_update(oifp);
111 }
112 }
113 ifp->ifindex = ifi_index;
114 }
115
116 /* Make socket for Linux netlink interface. */
117 static int
118 netlink_socket (struct nlsock *nl, unsigned long groups)
119 {
120 int ret;
121 struct sockaddr_nl snl;
122 int sock;
123 int namelen;
124 int save_errno;
125
126 sock = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
127 if (sock < 0)
128 {
129 zlog (NULL, LOG_ERR, "Can't open %s socket: %s", nl->name,
130 safe_strerror (errno));
131 return -1;
132 }
133
134 ret = fcntl (sock, F_SETFL, O_NONBLOCK);
135 if (ret < 0)
136 {
137 zlog (NULL, LOG_ERR, "Can't set %s socket flags: %s", nl->name,
138 safe_strerror (errno));
139 close (sock);
140 return -1;
141 }
142
143 /* Set receive buffer size if it's set from command line */
144 if (nl_rcvbufsize)
145 {
146 u_int32_t oldsize, oldlen;
147 u_int32_t newsize, newlen;
148
149 oldlen = sizeof(oldsize);
150 newlen = sizeof(newsize);
151
152 ret = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &oldsize, &oldlen);
153 if (ret < 0)
154 {
155 zlog (NULL, LOG_ERR, "Can't get %s receive buffer size: %s", nl->name,
156 safe_strerror (errno));
157 close (sock);
158 return -1;
159 }
160
161 ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &nl_rcvbufsize,
162 sizeof(nl_rcvbufsize));
163 if (ret < 0)
164 {
165 zlog (NULL, LOG_ERR, "Can't set %s receive buffer size: %s", nl->name,
166 safe_strerror (errno));
167 close (sock);
168 return -1;
169 }
170
171 ret = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &newsize, &newlen);
172 if (ret < 0)
173 {
174 zlog (NULL, LOG_ERR, "Can't get %s receive buffer size: %s", nl->name,
175 safe_strerror (errno));
176 close (sock);
177 return -1;
178 }
179
180 zlog (NULL, LOG_INFO,
181 "Setting netlink socket receive buffer size: %u -> %u",
182 oldsize, newsize);
183 }
184
185 memset (&snl, 0, sizeof snl);
186 snl.nl_family = AF_NETLINK;
187 snl.nl_groups = groups;
188
189 /* Bind the socket to the netlink structure for anything. */
190 if (zserv_privs.change (ZPRIVS_RAISE))
191 {
192 zlog (NULL, LOG_ERR, "Can't raise privileges");
193 return -1;
194 }
195
196 ret = bind (sock, (struct sockaddr *) &snl, sizeof snl);
197 save_errno = errno;
198 if (zserv_privs.change (ZPRIVS_LOWER))
199 zlog (NULL, LOG_ERR, "Can't lower privileges");
200
201 if (ret < 0)
202 {
203 zlog (NULL, LOG_ERR, "Can't bind %s socket to group 0x%x: %s",
204 nl->name, snl.nl_groups, safe_strerror (save_errno));
205 close (sock);
206 return -1;
207 }
208
209 /* multiple netlink sockets will have different nl_pid */
210 namelen = sizeof snl;
211 ret = getsockname (sock, (struct sockaddr *) &snl, (socklen_t *) &namelen);
212 if (ret < 0 || namelen != sizeof snl)
213 {
214 zlog (NULL, LOG_ERR, "Can't get %s socket name: %s", nl->name,
215 safe_strerror (errno));
216 close (sock);
217 return -1;
218 }
219
220 nl->snl = snl;
221 nl->sock = sock;
222 return ret;
223 }
224
225 int
226 set_netlink_blocking (struct nlsock *nl, int *flags)
227 {
228
229 /* Change socket flags for blocking I/O. */
230 if ((*flags = fcntl (nl->sock, F_GETFL, 0)) < 0)
231 {
232 zlog (NULL, LOG_ERR, "%s:%i F_GETFL error: %s",
233 __FUNCTION__, __LINE__, safe_strerror (errno));
234 return -1;
235 }
236 *flags &= ~O_NONBLOCK;
237 if (fcntl (nl->sock, F_SETFL, *flags) < 0)
238 {
239 zlog (NULL, LOG_ERR, "%s:%i F_SETFL error: %s",
240 __FUNCTION__, __LINE__, safe_strerror (errno));
241 return -1;
242 }
243 return 0;
244 }
245
246 int
247 set_netlink_nonblocking (struct nlsock *nl, int *flags)
248 {
249 /* Restore socket flags for nonblocking I/O */
250 *flags |= O_NONBLOCK;
251 if (fcntl (nl->sock, F_SETFL, *flags) < 0)
252 {
253 zlog (NULL, LOG_ERR, "%s:%i F_SETFL error: %s",
254 __FUNCTION__, __LINE__, safe_strerror (errno));
255 return -1;
256 }
257 return 0;
258 }
259
260 /* Get type specified information from netlink. */
261 static int
262 netlink_request (int family, int type, struct nlsock *nl)
263 {
264 int ret;
265 struct sockaddr_nl snl;
266 int save_errno;
267
268 struct
269 {
270 struct nlmsghdr nlh;
271 struct rtgenmsg g;
272 } req;
273
274
275 /* Check netlink socket. */
276 if (nl->sock < 0)
277 {
278 zlog (NULL, LOG_ERR, "%s socket isn't active.", nl->name);
279 return -1;
280 }
281
282 memset (&snl, 0, sizeof snl);
283 snl.nl_family = AF_NETLINK;
284
285 memset (&req, 0, sizeof req);
286 req.nlh.nlmsg_len = sizeof req;
287 req.nlh.nlmsg_type = type;
288 req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
289 req.nlh.nlmsg_pid = 0;
290 req.nlh.nlmsg_seq = ++nl->seq;
291 req.g.rtgen_family = family;
292
293 /* linux appears to check capabilities on every message
294 * have to raise caps for every message sent
295 */
296 if (zserv_privs.change (ZPRIVS_RAISE))
297 {
298 zlog (NULL, LOG_ERR, "Can't raise privileges");
299 return -1;
300 }
301
302 ret = sendto (nl->sock, (void *) &req, sizeof req, 0,
303 (struct sockaddr *) &snl, sizeof snl);
304 save_errno = errno;
305
306 if (zserv_privs.change (ZPRIVS_LOWER))
307 zlog (NULL, LOG_ERR, "Can't lower privileges");
308
309 if (ret < 0)
310 {
311 zlog (NULL, LOG_ERR, "%s sendto failed: %s", nl->name,
312 safe_strerror (save_errno));
313 return -1;
314 }
315
316 return 0;
317 }
318
319 /* Receive message from netlink interface and pass those information
320 to the given function. */
321 static int
322 netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *),
323 struct nlsock *nl)
324 {
325 int status;
326 int ret = 0;
327 int error;
328
329 while (1)
330 {
331 char buf[4096];
332 struct iovec iov = { buf, sizeof buf };
333 struct sockaddr_nl snl;
334 struct msghdr msg = { (void *) &snl, sizeof snl, &iov, 1, NULL, 0, 0 };
335 struct nlmsghdr *h;
336 int save_errno;
337
338 if (zserv_privs.change (ZPRIVS_RAISE))
339 zlog (NULL, LOG_ERR, "Can't raise privileges");
340
341 status = recvmsg (nl->sock, &msg, 0);
342 save_errno = errno;
343
344 if (zserv_privs.change (ZPRIVS_LOWER))
345 zlog (NULL, LOG_ERR, "Can't lower privileges");
346
347 if (status < 0)
348 {
349 if (save_errno == EINTR)
350 continue;
351 if (save_errno == EWOULDBLOCK || save_errno == EAGAIN)
352 break;
353 zlog (NULL, LOG_ERR, "%s recvmsg overrun: %s",
354 nl->name, safe_strerror(save_errno));
355 continue;
356 }
357
358 if (status == 0)
359 {
360 zlog (NULL, LOG_ERR, "%s EOF", nl->name);
361 return -1;
362 }
363
364 if (msg.msg_namelen != sizeof snl)
365 {
366 zlog (NULL, LOG_ERR, "%s sender address length error: length %d",
367 nl->name, msg.msg_namelen);
368 return -1;
369 }
370
371 /* JF: Ignore messages that aren't from the kernel */
372 if ( snl.nl_pid != 0 )
373 {
374 zlog ( NULL, LOG_ERR, "Ignoring message from pid %u", snl.nl_pid );
375 continue;
376 }
377
378 for (h = (struct nlmsghdr *) buf; NLMSG_OK (h, (unsigned int) status);
379 h = NLMSG_NEXT (h, status))
380 {
381 /* Finish of reading. */
382 if (h->nlmsg_type == NLMSG_DONE)
383 return ret;
384
385 /* Error handling. */
386 if (h->nlmsg_type == NLMSG_ERROR)
387 {
388 struct nlmsgerr *err = (struct nlmsgerr *) NLMSG_DATA (h);
389
390 /* If the error field is zero, then this is an ACK */
391 if (err->error == 0)
392 {
393 if (IS_ZEBRA_DEBUG_KERNEL)
394 {
395 zlog_debug ("%s: %s ACK: type=%s(%u), seq=%u, pid=%u",
396 __FUNCTION__, nl->name,
397 lookup (nlmsg_str, err->msg.nlmsg_type),
398 err->msg.nlmsg_type, err->msg.nlmsg_seq,
399 err->msg.nlmsg_pid);
400 }
401
402 /* return if not a multipart message, otherwise continue */
403 if (!(h->nlmsg_flags & NLM_F_MULTI))
404 {
405 return 0;
406 }
407 continue;
408 }
409
410 if (h->nlmsg_len < NLMSG_LENGTH (sizeof (struct nlmsgerr)))
411 {
412 zlog (NULL, LOG_ERR, "%s error: message truncated",
413 nl->name);
414 return -1;
415 }
416
417 /* Deal with Error Noise - MAG */
418 {
419 int loglvl = LOG_ERR;
420 int errnum = err->error;
421 int msg_type = err->msg.nlmsg_type;
422
423 if (nl == &netlink_cmd
424 && (-errnum == ENODEV || -errnum == ESRCH)
425 && (msg_type == RTM_NEWROUTE || msg_type == RTM_DELROUTE))
426 loglvl = LOG_DEBUG;
427
428 zlog (NULL, loglvl, "%s error: %s, type=%s(%u), "
429 "seq=%u, pid=%u",
430 nl->name, safe_strerror (-errnum),
431 lookup (nlmsg_str, msg_type),
432 msg_type, err->msg.nlmsg_seq, err->msg.nlmsg_pid);
433 }
434 /*
435 ret = -1;
436 continue;
437 */
438 return -1;
439 }
440
441 /* OK we got netlink message. */
442 if (IS_ZEBRA_DEBUG_KERNEL)
443 zlog_debug ("netlink_parse_info: %s type %s(%u), seq=%u, pid=%u",
444 nl->name,
445 lookup (nlmsg_str, h->nlmsg_type), h->nlmsg_type,
446 h->nlmsg_seq, h->nlmsg_pid);
447
448 /* skip unsolicited messages originating from command socket */
449 if (nl != &netlink_cmd && h->nlmsg_pid == netlink_cmd.snl.nl_pid)
450 {
451 if (IS_ZEBRA_DEBUG_KERNEL)
452 zlog_debug ("netlink_parse_info: %s packet comes from %s",
453 netlink_cmd.name, nl->name);
454 continue;
455 }
456
457 error = (*filter) (&snl, h);
458 if (error < 0)
459 {
460 zlog (NULL, LOG_ERR, "%s filter function error", nl->name);
461 ret = error;
462 }
463 }
464
465 /* After error care. */
466 if (msg.msg_flags & MSG_TRUNC)
467 {
468 zlog (NULL, LOG_ERR, "%s error: message truncated", nl->name);
469 continue;
470 }
471 if (status)
472 {
473 zlog (NULL, LOG_ERR, "%s error: data remnant size %d", nl->name,
474 status);
475 return -1;
476 }
477 }
478 return ret;
479 }
480
481 /* Utility function for parse rtattr. */
482 static void
483 netlink_parse_rtattr (struct rtattr **tb, int max, struct rtattr *rta,
484 int len)
485 {
486 while (RTA_OK (rta, len))
487 {
488 if (rta->rta_type <= max)
489 tb[rta->rta_type] = rta;
490 rta = RTA_NEXT (rta, len);
491 }
492 }
493
494 /* Called from interface_lookup_netlink(). This function is only used
495 during bootstrap. */
496 int
497 netlink_interface (struct sockaddr_nl *snl, struct nlmsghdr *h)
498 {
499 int len;
500 struct ifinfomsg *ifi;
501 struct rtattr *tb[IFLA_MAX + 1];
502 struct interface *ifp;
503 char *name;
504 int i;
505
506 ifi = NLMSG_DATA (h);
507
508 if (h->nlmsg_type != RTM_NEWLINK)
509 return 0;
510
511 len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifinfomsg));
512 if (len < 0)
513 return -1;
514
515 /* Looking up interface name. */
516 memset (tb, 0, sizeof tb);
517 netlink_parse_rtattr (tb, IFLA_MAX, IFLA_RTA (ifi), len);
518
519 #ifdef IFLA_WIRELESS
520 /* check for wireless messages to ignore */
521 if ((tb[IFLA_WIRELESS] != NULL) && (ifi->ifi_change == 0))
522 {
523 if (IS_ZEBRA_DEBUG_KERNEL)
524 zlog_debug ("%s: ignoring IFLA_WIRELESS message", __func__);
525 return 0;
526 }
527 #endif /* IFLA_WIRELESS */
528
529 if (tb[IFLA_IFNAME] == NULL)
530 return -1;
531 name = (char *) RTA_DATA (tb[IFLA_IFNAME]);
532
533 /* Add interface. */
534 ifp = if_get_by_name (name);
535 set_ifindex(ifp, ifi->ifi_index);
536 ifp->flags = ifi->ifi_flags & 0x0000fffff;
537 ifp->mtu6 = ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]);
538 ifp->metric = 1;
539
540 /* Hardware type and address. */
541 ifp->hw_type = ifi->ifi_type;
542
543 if (tb[IFLA_ADDRESS])
544 {
545 int hw_addr_len;
546
547 hw_addr_len = RTA_PAYLOAD (tb[IFLA_ADDRESS]);
548
549 if (hw_addr_len > INTERFACE_HWADDR_MAX)
550 zlog_warn ("Hardware address is too large: %d", hw_addr_len);
551 else
552 {
553 ifp->hw_addr_len = hw_addr_len;
554 memcpy (ifp->hw_addr, RTA_DATA (tb[IFLA_ADDRESS]), hw_addr_len);
555
556 for (i = 0; i < hw_addr_len; i++)
557 if (ifp->hw_addr[i] != 0)
558 break;
559
560 if (i == hw_addr_len)
561 ifp->hw_addr_len = 0;
562 else
563 ifp->hw_addr_len = hw_addr_len;
564 }
565 }
566
567 if_add_update (ifp);
568
569 return 0;
570 }
571
572 /* Lookup interface IPv4/IPv6 address. */
573 int
574 netlink_interface_addr (struct sockaddr_nl *snl, struct nlmsghdr *h)
575 {
576 int len;
577 struct ifaddrmsg *ifa;
578 struct rtattr *tb[IFA_MAX + 1];
579 struct interface *ifp;
580 void *addr = NULL;
581 void *broad = NULL;
582 u_char flags = 0;
583 char *label = NULL;
584
585 ifa = NLMSG_DATA (h);
586
587 if (ifa->ifa_family != AF_INET
588 #ifdef HAVE_IPV6
589 && ifa->ifa_family != AF_INET6
590 #endif /* HAVE_IPV6 */
591 )
592 return 0;
593
594 if (h->nlmsg_type != RTM_NEWADDR && h->nlmsg_type != RTM_DELADDR)
595 return 0;
596
597 len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifaddrmsg));
598 if (len < 0)
599 return -1;
600
601 memset (tb, 0, sizeof tb);
602 netlink_parse_rtattr (tb, IFA_MAX, IFA_RTA (ifa), len);
603
604 ifp = if_lookup_by_index (ifa->ifa_index);
605 if (ifp == NULL)
606 {
607 zlog_err ("netlink_interface_addr can't find interface by index %d",
608 ifa->ifa_index);
609 return -1;
610 }
611
612 if (IS_ZEBRA_DEBUG_KERNEL) /* remove this line to see initial ifcfg */
613 {
614 char buf[BUFSIZ];
615 zlog_debug ("netlink_interface_addr %s %s:",
616 lookup (nlmsg_str, h->nlmsg_type), ifp->name);
617 if (tb[IFA_LOCAL])
618 zlog_debug (" IFA_LOCAL %s/%d",
619 inet_ntop (ifa->ifa_family, RTA_DATA (tb[IFA_LOCAL]),
620 buf, BUFSIZ), ifa->ifa_prefixlen);
621 if (tb[IFA_ADDRESS])
622 zlog_debug (" IFA_ADDRESS %s/%d",
623 inet_ntop (ifa->ifa_family, RTA_DATA (tb[IFA_ADDRESS]),
624 buf, BUFSIZ), ifa->ifa_prefixlen);
625 if (tb[IFA_BROADCAST])
626 zlog_debug (" IFA_BROADCAST %s/%d",
627 inet_ntop (ifa->ifa_family, RTA_DATA (tb[IFA_BROADCAST]),
628 buf, BUFSIZ), ifa->ifa_prefixlen);
629 if (tb[IFA_LABEL] && strcmp (ifp->name, RTA_DATA (tb[IFA_LABEL])))
630 zlog_debug (" IFA_LABEL %s", (char *)RTA_DATA (tb[IFA_LABEL]));
631
632 if (tb[IFA_CACHEINFO])
633 {
634 struct ifa_cacheinfo *ci = RTA_DATA (tb[IFA_CACHEINFO]);
635 zlog_debug (" IFA_CACHEINFO pref %d, valid %d",
636 ci->ifa_prefered, ci->ifa_valid);
637 }
638 }
639
640 if (tb[IFA_ADDRESS] == NULL)
641 tb[IFA_ADDRESS] = tb[IFA_LOCAL];
642
643 if (ifp->flags & IFF_POINTOPOINT)
644 {
645 if (tb[IFA_LOCAL])
646 {
647 addr = RTA_DATA (tb[IFA_LOCAL]);
648 if (tb[IFA_ADDRESS] &&
649 memcmp(RTA_DATA(tb[IFA_ADDRESS]),RTA_DATA(tb[IFA_LOCAL]),4))
650 /* if IFA_ADDRESS != IFA_LOCAL, then it's the peer address */
651 broad = RTA_DATA (tb[IFA_ADDRESS]);
652 else
653 broad = NULL;
654 }
655 else
656 {
657 if (tb[IFA_ADDRESS])
658 addr = RTA_DATA (tb[IFA_ADDRESS]);
659 else
660 addr = NULL;
661 }
662 }
663 else
664 {
665 if (tb[IFA_ADDRESS])
666 addr = RTA_DATA (tb[IFA_ADDRESS]);
667 else
668 addr = NULL;
669
670 if (tb[IFA_BROADCAST])
671 broad = RTA_DATA(tb[IFA_BROADCAST]);
672 else
673 broad = NULL;
674 }
675
676 /* Flags. */
677 if (ifa->ifa_flags & IFA_F_SECONDARY)
678 SET_FLAG (flags, ZEBRA_IFA_SECONDARY);
679
680 /* Label */
681 if (tb[IFA_LABEL])
682 label = (char *) RTA_DATA (tb[IFA_LABEL]);
683
684 if (ifp && label && strcmp (ifp->name, label) == 0)
685 label = NULL;
686
687 /* Register interface address to the interface. */
688 if (ifa->ifa_family == AF_INET)
689 {
690 if (h->nlmsg_type == RTM_NEWADDR)
691 connected_add_ipv4 (ifp, flags,
692 (struct in_addr *) addr, ifa->ifa_prefixlen,
693 (struct in_addr *) broad, label);
694 else
695 connected_delete_ipv4 (ifp, flags,
696 (struct in_addr *) addr, ifa->ifa_prefixlen,
697 (struct in_addr *) broad);
698 }
699 #ifdef HAVE_IPV6
700 if (ifa->ifa_family == AF_INET6)
701 {
702 if (h->nlmsg_type == RTM_NEWADDR)
703 connected_add_ipv6 (ifp,
704 (struct in6_addr *) addr, ifa->ifa_prefixlen,
705 (struct in6_addr *) broad, label);
706 else
707 connected_delete_ipv6 (ifp,
708 (struct in6_addr *) addr, ifa->ifa_prefixlen,
709 (struct in6_addr *) broad);
710 }
711 #endif /* HAVE_IPV6 */
712
713 return 0;
714 }
715
716 /* Looking up routing table by netlink interface. */
717 int
718 netlink_routing_table (struct sockaddr_nl *snl, struct nlmsghdr *h)
719 {
720 int len;
721 struct rtmsg *rtm;
722 struct rtattr *tb[RTA_MAX + 1];
723 u_char flags = 0;
724
725 char anyaddr[16] = { 0 };
726
727 int index;
728 int table;
729 int metric;
730
731 void *dest;
732 void *gate;
733
734 rtm = NLMSG_DATA (h);
735
736 if (h->nlmsg_type != RTM_NEWROUTE)
737 return 0;
738 if (rtm->rtm_type != RTN_UNICAST)
739 return 0;
740
741 table = rtm->rtm_table;
742 #if 0 /* we weed them out later in rib_weed_tables () */
743 if (table != RT_TABLE_MAIN && table != zebrad.rtm_table_default)
744 return 0;
745 #endif
746
747 len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct rtmsg));
748 if (len < 0)
749 return -1;
750
751 memset (tb, 0, sizeof tb);
752 netlink_parse_rtattr (tb, RTA_MAX, RTM_RTA (rtm), len);
753
754 if (rtm->rtm_flags & RTM_F_CLONED)
755 return 0;
756 if (rtm->rtm_protocol == RTPROT_REDIRECT)
757 return 0;
758 if (rtm->rtm_protocol == RTPROT_KERNEL)
759 return 0;
760
761 if (rtm->rtm_src_len != 0)
762 return 0;
763
764 /* Route which inserted by Zebra. */
765 if (rtm->rtm_protocol == RTPROT_ZEBRA)
766 flags |= ZEBRA_FLAG_SELFROUTE;
767
768 index = 0;
769 metric = 0;
770 dest = NULL;
771 gate = NULL;
772
773 if (tb[RTA_OIF])
774 index = *(int *) RTA_DATA (tb[RTA_OIF]);
775
776 if (tb[RTA_DST])
777 dest = RTA_DATA (tb[RTA_DST]);
778 else
779 dest = anyaddr;
780
781 /* Multipath treatment is needed. */
782 if (tb[RTA_GATEWAY])
783 gate = RTA_DATA (tb[RTA_GATEWAY]);
784
785 if (tb[RTA_PRIORITY])
786 metric = *(int *) RTA_DATA(tb[RTA_PRIORITY]);
787
788 if (rtm->rtm_family == AF_INET)
789 {
790 struct prefix_ipv4 p;
791 p.family = AF_INET;
792 memcpy (&p.prefix, dest, 4);
793 p.prefixlen = rtm->rtm_dst_len;
794
795 rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, index, table, metric, 0);
796 }
797 #ifdef HAVE_IPV6
798 if (rtm->rtm_family == AF_INET6)
799 {
800 struct prefix_ipv6 p;
801 p.family = AF_INET6;
802 memcpy (&p.prefix, dest, 16);
803 p.prefixlen = rtm->rtm_dst_len;
804
805 rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, index, table,
806 metric, 0);
807 }
808 #endif /* HAVE_IPV6 */
809
810 return 0;
811 }
812
813 struct message rtproto_str[] = {
814 {RTPROT_REDIRECT, "redirect"},
815 {RTPROT_KERNEL, "kernel"},
816 {RTPROT_BOOT, "boot"},
817 {RTPROT_STATIC, "static"},
818 {RTPROT_GATED, "GateD"},
819 {RTPROT_RA, "router advertisement"},
820 {RTPROT_MRT, "MRT"},
821 {RTPROT_ZEBRA, "Zebra"},
822 #ifdef RTPROT_BIRD
823 {RTPROT_BIRD, "BIRD"},
824 #endif /* RTPROT_BIRD */
825 {0, NULL}
826 };
827
828 /* Routing information change from the kernel. */
829 int
830 netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
831 {
832 int len;
833 struct rtmsg *rtm;
834 struct rtattr *tb[RTA_MAX + 1];
835
836 char anyaddr[16] = { 0 };
837
838 int index;
839 int table;
840 void *dest;
841 void *gate;
842
843 rtm = NLMSG_DATA (h);
844
845 if (!(h->nlmsg_type == RTM_NEWROUTE || h->nlmsg_type == RTM_DELROUTE))
846 {
847 /* If this is not route add/delete message print warning. */
848 zlog_warn ("Kernel message: %d\n", h->nlmsg_type);
849 return 0;
850 }
851
852 /* Connected route. */
853 if (IS_ZEBRA_DEBUG_KERNEL)
854 zlog_debug ("%s %s %s proto %s",
855 h->nlmsg_type ==
856 RTM_NEWROUTE ? "RTM_NEWROUTE" : "RTM_DELROUTE",
857 rtm->rtm_family == AF_INET ? "ipv4" : "ipv6",
858 rtm->rtm_type == RTN_UNICAST ? "unicast" : "multicast",
859 lookup (rtproto_str, rtm->rtm_protocol));
860
861 if (rtm->rtm_type != RTN_UNICAST)
862 {
863 return 0;
864 }
865
866 table = rtm->rtm_table;
867 if (table != RT_TABLE_MAIN && table != zebrad.rtm_table_default)
868 {
869 return 0;
870 }
871
872 len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct rtmsg));
873 if (len < 0)
874 return -1;
875
876 memset (tb, 0, sizeof tb);
877 netlink_parse_rtattr (tb, RTA_MAX, RTM_RTA (rtm), len);
878
879 if (rtm->rtm_flags & RTM_F_CLONED)
880 return 0;
881 if (rtm->rtm_protocol == RTPROT_REDIRECT)
882 return 0;
883 if (rtm->rtm_protocol == RTPROT_KERNEL)
884 return 0;
885
886 if (rtm->rtm_protocol == RTPROT_ZEBRA && h->nlmsg_type == RTM_NEWROUTE)
887 return 0;
888
889 if (rtm->rtm_src_len != 0)
890 {
891 zlog_warn ("netlink_route_change(): no src len");
892 return 0;
893 }
894
895 index = 0;
896 dest = NULL;
897 gate = NULL;
898
899 if (tb[RTA_OIF])
900 index = *(int *) RTA_DATA (tb[RTA_OIF]);
901
902 if (tb[RTA_DST])
903 dest = RTA_DATA (tb[RTA_DST]);
904 else
905 dest = anyaddr;
906
907 if (tb[RTA_GATEWAY])
908 gate = RTA_DATA (tb[RTA_GATEWAY]);
909
910 if (rtm->rtm_family == AF_INET)
911 {
912 struct prefix_ipv4 p;
913 p.family = AF_INET;
914 memcpy (&p.prefix, dest, 4);
915 p.prefixlen = rtm->rtm_dst_len;
916
917 if (IS_ZEBRA_DEBUG_KERNEL)
918 {
919 if (h->nlmsg_type == RTM_NEWROUTE)
920 zlog_debug ("RTM_NEWROUTE %s/%d",
921 inet_ntoa (p.prefix), p.prefixlen);
922 else
923 zlog_debug ("RTM_DELROUTE %s/%d",
924 inet_ntoa (p.prefix), p.prefixlen);
925 }
926
927 if (h->nlmsg_type == RTM_NEWROUTE)
928 rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, table, 0, 0);
929 else
930 rib_delete_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, table);
931 }
932
933 #ifdef HAVE_IPV6
934 if (rtm->rtm_family == AF_INET6)
935 {
936 struct prefix_ipv6 p;
937 char buf[BUFSIZ];
938
939 p.family = AF_INET6;
940 memcpy (&p.prefix, dest, 16);
941 p.prefixlen = rtm->rtm_dst_len;
942
943 if (IS_ZEBRA_DEBUG_KERNEL)
944 {
945 if (h->nlmsg_type == RTM_NEWROUTE)
946 zlog_debug ("RTM_NEWROUTE %s/%d",
947 inet_ntop (AF_INET6, &p.prefix, buf, BUFSIZ),
948 p.prefixlen);
949 else
950 zlog_debug ("RTM_DELROUTE %s/%d",
951 inet_ntop (AF_INET6, &p.prefix, buf, BUFSIZ),
952 p.prefixlen);
953 }
954
955 if (h->nlmsg_type == RTM_NEWROUTE)
956 rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0, 0, 0);
957 else
958 rib_delete_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0);
959 }
960 #endif /* HAVE_IPV6 */
961
962 return 0;
963 }
964
965 int
966 netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
967 {
968 int len;
969 struct ifinfomsg *ifi;
970 struct rtattr *tb[IFLA_MAX + 1];
971 struct interface *ifp;
972 char *name;
973
974 ifi = NLMSG_DATA (h);
975
976 if (!(h->nlmsg_type == RTM_NEWLINK || h->nlmsg_type == RTM_DELLINK))
977 {
978 /* If this is not link add/delete message so print warning. */
979 zlog_warn ("netlink_link_change: wrong kernel message %d\n",
980 h->nlmsg_type);
981 return 0;
982 }
983
984 len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifinfomsg));
985 if (len < 0)
986 return -1;
987
988 /* Looking up interface name. */
989 memset (tb, 0, sizeof tb);
990 netlink_parse_rtattr (tb, IFLA_MAX, IFLA_RTA (ifi), len);
991
992 #ifdef IFLA_WIRELESS
993 /* check for wireless messages to ignore */
994 if ((tb[IFLA_WIRELESS] != NULL) && (ifi->ifi_change == 0))
995 {
996 if (IS_ZEBRA_DEBUG_KERNEL)
997 zlog_debug ("%s: ignoring IFLA_WIRELESS message", __func__);
998 return 0;
999 }
1000 #endif /* IFLA_WIRELESS */
1001
1002 if (tb[IFLA_IFNAME] == NULL)
1003 return -1;
1004 name = (char *) RTA_DATA (tb[IFLA_IFNAME]);
1005
1006 /* Add interface. */
1007 if (h->nlmsg_type == RTM_NEWLINK)
1008 {
1009 ifp = if_lookup_by_name (name);
1010
1011 if (ifp == NULL || !CHECK_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE))
1012 {
1013 if (ifp == NULL)
1014 ifp = if_get_by_name (name);
1015
1016 set_ifindex(ifp, ifi->ifi_index);
1017 ifp->flags = ifi->ifi_flags & 0x0000fffff;
1018 ifp->mtu6 = ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]);
1019 ifp->metric = 1;
1020
1021 /* If new link is added. */
1022 if_add_update (ifp);
1023 }
1024 else
1025 {
1026 /* Interface status change. */
1027 set_ifindex(ifp, ifi->ifi_index);
1028 ifp->mtu6 = ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]);
1029 ifp->metric = 1;
1030
1031 if (if_is_operative (ifp))
1032 {
1033 ifp->flags = ifi->ifi_flags & 0x0000fffff;
1034 if (!if_is_operative (ifp))
1035 if_down (ifp);
1036 else
1037 /* Must notify client daemons of new interface status. */
1038 zebra_interface_up_update (ifp);
1039 }
1040 else
1041 {
1042 ifp->flags = ifi->ifi_flags & 0x0000fffff;
1043 if (if_is_operative (ifp))
1044 if_up (ifp);
1045 }
1046 }
1047 }
1048 else
1049 {
1050 /* RTM_DELLINK. */
1051 ifp = if_lookup_by_name (name);
1052
1053 if (ifp == NULL)
1054 {
1055 zlog (NULL, LOG_WARNING, "interface %s is deleted but can't find",
1056 name);
1057 return 0;
1058 }
1059
1060 if_delete_update (ifp);
1061 }
1062
1063 return 0;
1064 }
1065
1066 int
1067 netlink_information_fetch (struct sockaddr_nl *snl, struct nlmsghdr *h)
1068 {
1069 switch (h->nlmsg_type)
1070 {
1071 case RTM_NEWROUTE:
1072 return netlink_route_change (snl, h);
1073 break;
1074 case RTM_DELROUTE:
1075 return netlink_route_change (snl, h);
1076 break;
1077 case RTM_NEWLINK:
1078 return netlink_link_change (snl, h);
1079 break;
1080 case RTM_DELLINK:
1081 return netlink_link_change (snl, h);
1082 break;
1083 case RTM_NEWADDR:
1084 return netlink_interface_addr (snl, h);
1085 break;
1086 case RTM_DELADDR:
1087 return netlink_interface_addr (snl, h);
1088 break;
1089 default:
1090 zlog_warn ("Unknown netlink nlmsg_type %d\n", h->nlmsg_type);
1091 break;
1092 }
1093 return 0;
1094 }
1095
1096 /* Interface lookup by netlink socket. */
1097 int
1098 interface_lookup_netlink (void)
1099 {
1100 int ret;
1101 int flags;
1102 int snb_ret;
1103
1104 /*
1105 * Change netlink socket flags to blocking to ensure we get
1106 * a reply via nelink_parse_info
1107 */
1108 snb_ret = set_netlink_blocking (&netlink_cmd, &flags);
1109 if (snb_ret < 0)
1110 zlog (NULL, LOG_WARNING,
1111 "%s:%i Warning: Could not set netlink socket to blocking.",
1112 __FUNCTION__, __LINE__);
1113
1114 /* Get interface information. */
1115 ret = netlink_request (AF_PACKET, RTM_GETLINK, &netlink_cmd);
1116 if (ret < 0)
1117 return ret;
1118 ret = netlink_parse_info (netlink_interface, &netlink_cmd);
1119 if (ret < 0)
1120 return ret;
1121
1122 /* Get IPv4 address of the interfaces. */
1123 ret = netlink_request (AF_INET, RTM_GETADDR, &netlink_cmd);
1124 if (ret < 0)
1125 return ret;
1126 ret = netlink_parse_info (netlink_interface_addr, &netlink_cmd);
1127 if (ret < 0)
1128 return ret;
1129
1130 #ifdef HAVE_IPV6
1131 /* Get IPv6 address of the interfaces. */
1132 ret = netlink_request (AF_INET6, RTM_GETADDR, &netlink_cmd);
1133 if (ret < 0)
1134 return ret;
1135 ret = netlink_parse_info (netlink_interface_addr, &netlink_cmd);
1136 if (ret < 0)
1137 return ret;
1138 #endif /* HAVE_IPV6 */
1139
1140 /* restore socket flags */
1141 if (snb_ret == 0)
1142 set_netlink_nonblocking (&netlink_cmd, &flags);
1143 return 0;
1144 }
1145
1146 /* Routing table read function using netlink interface. Only called
1147 bootstrap time. */
1148 int
1149 netlink_route_read (void)
1150 {
1151 int ret;
1152 int flags;
1153 int snb_ret;
1154
1155 /*
1156 * Change netlink socket flags to blocking to ensure we get
1157 * a reply via nelink_parse_info
1158 */
1159 snb_ret = set_netlink_blocking (&netlink_cmd, &flags);
1160 if (snb_ret < 0)
1161 zlog (NULL, LOG_WARNING,
1162 "%s:%i Warning: Could not set netlink socket to blocking.",
1163 __FUNCTION__, __LINE__);
1164
1165 /* Get IPv4 routing table. */
1166 ret = netlink_request (AF_INET, RTM_GETROUTE, &netlink_cmd);
1167 if (ret < 0)
1168 return ret;
1169 ret = netlink_parse_info (netlink_routing_table, &netlink_cmd);
1170 if (ret < 0)
1171 return ret;
1172
1173 #ifdef HAVE_IPV6
1174 /* Get IPv6 routing table. */
1175 ret = netlink_request (AF_INET6, RTM_GETROUTE, &netlink_cmd);
1176 if (ret < 0)
1177 return ret;
1178 ret = netlink_parse_info (netlink_routing_table, &netlink_cmd);
1179 if (ret < 0)
1180 return ret;
1181 #endif /* HAVE_IPV6 */
1182
1183 /* restore flags */
1184 if (snb_ret == 0)
1185 set_netlink_nonblocking (&netlink_cmd, &flags);
1186 return 0;
1187 }
1188
1189 /* Utility function comes from iproute2.
1190 Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */
1191 int
1192 addattr_l (struct nlmsghdr *n, int maxlen, int type, void *data, int alen)
1193 {
1194 int len;
1195 struct rtattr *rta;
1196
1197 len = RTA_LENGTH (alen);
1198
1199 if (NLMSG_ALIGN (n->nlmsg_len) + len > maxlen)
1200 return -1;
1201
1202 rta = (struct rtattr *) (((char *) n) + NLMSG_ALIGN (n->nlmsg_len));
1203 rta->rta_type = type;
1204 rta->rta_len = len;
1205 memcpy (RTA_DATA (rta), data, alen);
1206 n->nlmsg_len = NLMSG_ALIGN (n->nlmsg_len) + len;
1207
1208 return 0;
1209 }
1210
1211 int
1212 rta_addattr_l (struct rtattr *rta, int maxlen, int type, void *data, int alen)
1213 {
1214 int len;
1215 struct rtattr *subrta;
1216
1217 len = RTA_LENGTH (alen);
1218
1219 if (RTA_ALIGN (rta->rta_len) + len > maxlen)
1220 return -1;
1221
1222 subrta = (struct rtattr *) (((char *) rta) + RTA_ALIGN (rta->rta_len));
1223 subrta->rta_type = type;
1224 subrta->rta_len = len;
1225 memcpy (RTA_DATA (subrta), data, alen);
1226 rta->rta_len = NLMSG_ALIGN (rta->rta_len) + len;
1227
1228 return 0;
1229 }
1230
1231 /* Utility function comes from iproute2.
1232 Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */
1233 int
1234 addattr32 (struct nlmsghdr *n, int maxlen, int type, int data)
1235 {
1236 int len;
1237 struct rtattr *rta;
1238
1239 len = RTA_LENGTH (4);
1240
1241 if (NLMSG_ALIGN (n->nlmsg_len) + len > maxlen)
1242 return -1;
1243
1244 rta = (struct rtattr *) (((char *) n) + NLMSG_ALIGN (n->nlmsg_len));
1245 rta->rta_type = type;
1246 rta->rta_len = len;
1247 memcpy (RTA_DATA (rta), &data, 4);
1248 n->nlmsg_len = NLMSG_ALIGN (n->nlmsg_len) + len;
1249
1250 return 0;
1251 }
1252
1253 static int
1254 netlink_talk_filter (struct sockaddr_nl *snl, struct nlmsghdr *h)
1255 {
1256 zlog_warn ("netlink_talk: ignoring message type 0x%04x", h->nlmsg_type);
1257 return 0;
1258 }
1259
1260 /* sendmsg() to netlink socket then recvmsg(). */
1261 int
1262 netlink_talk (struct nlmsghdr *n, struct nlsock *nl)
1263 {
1264 int status;
1265 struct sockaddr_nl snl;
1266 struct iovec iov = { (void *) n, n->nlmsg_len };
1267 struct msghdr msg = { (void *) &snl, sizeof snl, &iov, 1, NULL, 0, 0 };
1268 int flags = 0;
1269 int snb_ret;
1270 int save_errno;
1271
1272 memset (&snl, 0, sizeof snl);
1273 snl.nl_family = AF_NETLINK;
1274
1275 n->nlmsg_seq = ++nl->seq;
1276
1277 /* Request an acknowledgement by setting NLM_F_ACK */
1278 n->nlmsg_flags |= NLM_F_ACK;
1279
1280 if (IS_ZEBRA_DEBUG_KERNEL)
1281 zlog_debug ("netlink_talk: %s type %s(%u), seq=%u", nl->name,
1282 lookup (nlmsg_str, n->nlmsg_type), n->nlmsg_type,
1283 n->nlmsg_seq);
1284
1285 /* Send message to netlink interface. */
1286 if (zserv_privs.change (ZPRIVS_RAISE))
1287 zlog (NULL, LOG_ERR, "Can't raise privileges");
1288 status = sendmsg (nl->sock, &msg, 0);
1289 save_errno = errno;
1290 if (zserv_privs.change (ZPRIVS_LOWER))
1291 zlog (NULL, LOG_ERR, "Can't lower privileges");
1292
1293 if (status < 0)
1294 {
1295 zlog (NULL, LOG_ERR, "netlink_talk sendmsg() error: %s",
1296 safe_strerror (save_errno));
1297 return -1;
1298 }
1299
1300 /*
1301 * Change socket flags for blocking I/O.
1302 * This ensures we wait for a reply in netlink_parse_info().
1303 */
1304 snb_ret = set_netlink_blocking (nl, &flags);
1305 if (snb_ret < 0)
1306 zlog (NULL, LOG_WARNING,
1307 "%s:%i Warning: Could not set netlink socket to blocking.",
1308 __FUNCTION__, __LINE__);
1309
1310 /*
1311 * Get reply from netlink socket.
1312 * The reply should either be an acknowlegement or an error.
1313 */
1314 status = netlink_parse_info (netlink_talk_filter, nl);
1315
1316 /* Restore socket flags for nonblocking I/O */
1317 if (snb_ret == 0)
1318 set_netlink_nonblocking (nl, &flags);
1319
1320 return status;
1321 }
1322
1323 /* Routing table change via netlink interface. */
1324 int
1325 netlink_route (int cmd, int family, void *dest, int length, void *gate,
1326 int index, int zebra_flags, int table)
1327 {
1328 int ret;
1329 int bytelen;
1330 struct sockaddr_nl snl;
1331 int discard;
1332
1333 struct
1334 {
1335 struct nlmsghdr n;
1336 struct rtmsg r;
1337 char buf[1024];
1338 } req;
1339
1340 memset (&req, 0, sizeof req);
1341
1342 bytelen = (family == AF_INET ? 4 : 16);
1343
1344 req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtmsg));
1345 req.n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
1346 req.n.nlmsg_type = cmd;
1347 req.r.rtm_family = family;
1348 req.r.rtm_table = table;
1349 req.r.rtm_dst_len = length;
1350
1351 if ((zebra_flags & ZEBRA_FLAG_BLACKHOLE)
1352 || (zebra_flags & ZEBRA_FLAG_REJECT))
1353 discard = 1;
1354 else
1355 discard = 0;
1356
1357 if (cmd == RTM_NEWROUTE)
1358 {
1359 req.r.rtm_protocol = RTPROT_ZEBRA;
1360 req.r.rtm_scope = RT_SCOPE_UNIVERSE;
1361
1362 if (discard)
1363 {
1364 if (zebra_flags & ZEBRA_FLAG_BLACKHOLE)
1365 req.r.rtm_type = RTN_BLACKHOLE;
1366 else if (zebra_flags & ZEBRA_FLAG_REJECT)
1367 req.r.rtm_type = RTN_UNREACHABLE;
1368 else
1369 assert (RTN_BLACKHOLE != RTN_UNREACHABLE); /* false */
1370 }
1371 else
1372 req.r.rtm_type = RTN_UNICAST;
1373 }
1374
1375 if (dest)
1376 addattr_l (&req.n, sizeof req, RTA_DST, dest, bytelen);
1377
1378 if (!discard)
1379 {
1380 if (gate)
1381 addattr_l (&req.n, sizeof req, RTA_GATEWAY, gate, bytelen);
1382 if (index > 0)
1383 addattr32 (&req.n, sizeof req, RTA_OIF, index);
1384 }
1385
1386 /* Destination netlink address. */
1387 memset (&snl, 0, sizeof snl);
1388 snl.nl_family = AF_NETLINK;
1389
1390 /* Talk to netlink socket. */
1391 ret = netlink_talk (&req.n, &netlink_cmd);
1392 if (ret < 0)
1393 return -1;
1394
1395 return 0;
1396 }
1397
1398 /* Routing table change via netlink interface. */
1399 int
1400 netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
1401 int family)
1402 {
1403 int bytelen;
1404 struct sockaddr_nl snl;
1405 struct nexthop *nexthop = NULL;
1406 int nexthop_num = 0;
1407 int discard;
1408
1409 struct
1410 {
1411 struct nlmsghdr n;
1412 struct rtmsg r;
1413 char buf[1024];
1414 } req;
1415
1416 memset (&req, 0, sizeof req);
1417
1418 bytelen = (family == AF_INET ? 4 : 16);
1419
1420 req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtmsg));
1421 req.n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
1422 req.n.nlmsg_type = cmd;
1423 req.r.rtm_family = family;
1424 req.r.rtm_table = rib->table;
1425 req.r.rtm_dst_len = p->prefixlen;
1426
1427 if ((rib->flags & ZEBRA_FLAG_BLACKHOLE) || (rib->flags & ZEBRA_FLAG_REJECT))
1428 discard = 1;
1429 else
1430 discard = 0;
1431
1432 if (cmd == RTM_NEWROUTE)
1433 {
1434 req.r.rtm_protocol = RTPROT_ZEBRA;
1435 req.r.rtm_scope = RT_SCOPE_UNIVERSE;
1436
1437 if (discard)
1438 {
1439 if (rib->flags & ZEBRA_FLAG_BLACKHOLE)
1440 req.r.rtm_type = RTN_BLACKHOLE;
1441 else if (rib->flags & ZEBRA_FLAG_REJECT)
1442 req.r.rtm_type = RTN_UNREACHABLE;
1443 else
1444 assert (RTN_BLACKHOLE != RTN_UNREACHABLE); /* false */
1445 }
1446 else
1447 req.r.rtm_type = RTN_UNICAST;
1448 }
1449
1450 addattr_l (&req.n, sizeof req, RTA_DST, &p->u.prefix, bytelen);
1451
1452 /* Metric. */
1453 addattr32 (&req.n, sizeof req, RTA_PRIORITY, rib->metric);
1454
1455 if (discard)
1456 {
1457 if (cmd == RTM_NEWROUTE)
1458 for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
1459 SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
1460 goto skip;
1461 }
1462
1463 /* Multipath case. */
1464 if (rib->nexthop_active_num == 1 || MULTIPATH_NUM == 1)
1465 {
1466 for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
1467 {
1468
1469 if ((cmd == RTM_NEWROUTE
1470 && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1471 || (cmd == RTM_DELROUTE
1472 && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))
1473 {
1474
1475 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
1476 {
1477 if (IS_ZEBRA_DEBUG_KERNEL)
1478 {
1479 zlog_debug
1480 ("netlink_route_multipath() (recursive, 1 hop): "
1481 "%s %s/%d, type %s", lookup (nlmsg_str, cmd),
1482 #ifdef HAVE_IPV6
1483 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
1484 inet6_ntoa (p->u.prefix6),
1485 #else
1486 inet_ntoa (p->u.prefix4),
1487 #endif /* HAVE_IPV6 */
1488
1489 p->prefixlen, nexthop_types_desc[nexthop->rtype]);
1490 }
1491
1492 if (nexthop->rtype == NEXTHOP_TYPE_IPV4
1493 || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
1494 {
1495 addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1496 &nexthop->rgate.ipv4, bytelen);
1497
1498 if (IS_ZEBRA_DEBUG_KERNEL)
1499 zlog_debug("netlink_route_multipath() (recursive, "
1500 "1 hop): nexthop via %s if %u",
1501 inet_ntoa (nexthop->rgate.ipv4),
1502 nexthop->rifindex);
1503 }
1504 #ifdef HAVE_IPV6
1505 if (nexthop->rtype == NEXTHOP_TYPE_IPV6
1506 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
1507 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
1508 {
1509 addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1510 &nexthop->rgate.ipv6, bytelen);
1511
1512 if (IS_ZEBRA_DEBUG_KERNEL)
1513 zlog_debug("netlink_route_multipath() (recursive, "
1514 "1 hop): nexthop via %s if %u",
1515 inet6_ntoa (nexthop->rgate.ipv6),
1516 nexthop->rifindex);
1517 }
1518 #endif /* HAVE_IPV6 */
1519 if (nexthop->rtype == NEXTHOP_TYPE_IFINDEX
1520 || nexthop->rtype == NEXTHOP_TYPE_IFNAME
1521 || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX
1522 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
1523 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
1524 {
1525 addattr32 (&req.n, sizeof req, RTA_OIF,
1526 nexthop->rifindex);
1527
1528 if (IS_ZEBRA_DEBUG_KERNEL)
1529 zlog_debug("netlink_route_multipath() (recursive, "
1530 "1 hop): nexthop via if %u",
1531 nexthop->rifindex);
1532 }
1533 }
1534 else
1535 {
1536 if (IS_ZEBRA_DEBUG_KERNEL)
1537 {
1538 zlog_debug
1539 ("netlink_route_multipath() (single hop): "
1540 "%s %s/%d, type %s", lookup (nlmsg_str, cmd),
1541 #ifdef HAVE_IPV6
1542 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
1543 inet6_ntoa (p->u.prefix6),
1544 #else
1545 inet_ntoa (p->u.prefix4),
1546 #endif /* HAVE_IPV6 */
1547 p->prefixlen, nexthop_types_desc[nexthop->type]);
1548 }
1549
1550 if (nexthop->type == NEXTHOP_TYPE_IPV4
1551 || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
1552 {
1553 addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1554 &nexthop->gate.ipv4, bytelen);
1555
1556 if (IS_ZEBRA_DEBUG_KERNEL)
1557 zlog_debug("netlink_route_multipath() (single hop): "
1558 "nexthop via %s if %u",
1559 inet_ntoa (nexthop->gate.ipv4),
1560 nexthop->ifindex);
1561 }
1562 #ifdef HAVE_IPV6
1563 if (nexthop->type == NEXTHOP_TYPE_IPV6
1564 || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
1565 || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
1566 {
1567 addattr_l (&req.n, sizeof req, RTA_GATEWAY,
1568 &nexthop->gate.ipv6, bytelen);
1569
1570 if (IS_ZEBRA_DEBUG_KERNEL)
1571 zlog_debug("netlink_route_multipath() (single hop): "
1572 "nexthop via %s if %u",
1573 inet6_ntoa (nexthop->gate.ipv6),
1574 nexthop->ifindex);
1575 }
1576 #endif /* HAVE_IPV6 */
1577 if (nexthop->type == NEXTHOP_TYPE_IFINDEX
1578 || nexthop->type == NEXTHOP_TYPE_IFNAME
1579 || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX
1580 || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX
1581 || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
1582 {
1583 addattr32 (&req.n, sizeof req, RTA_OIF, nexthop->ifindex);
1584
1585 if (IS_ZEBRA_DEBUG_KERNEL)
1586 zlog_debug("netlink_route_multipath() (single hop): "
1587 "nexthop via if %u", nexthop->ifindex);
1588 }
1589 }
1590
1591 if (cmd == RTM_NEWROUTE)
1592 SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
1593
1594 nexthop_num++;
1595 break;
1596 }
1597 }
1598 }
1599 else
1600 {
1601 char buf[1024];
1602 struct rtattr *rta = (void *) buf;
1603 struct rtnexthop *rtnh;
1604
1605 rta->rta_type = RTA_MULTIPATH;
1606 rta->rta_len = RTA_LENGTH (0);
1607 rtnh = RTA_DATA (rta);
1608
1609 nexthop_num = 0;
1610 for (nexthop = rib->nexthop;
1611 nexthop && (MULTIPATH_NUM == 0 || nexthop_num < MULTIPATH_NUM);
1612 nexthop = nexthop->next)
1613 {
1614 if ((cmd == RTM_NEWROUTE
1615 && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1616 || (cmd == RTM_DELROUTE
1617 && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))
1618 {
1619 nexthop_num++;
1620
1621 rtnh->rtnh_len = sizeof (*rtnh);
1622 rtnh->rtnh_flags = 0;
1623 rtnh->rtnh_hops = 0;
1624 rta->rta_len += rtnh->rtnh_len;
1625
1626 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
1627 {
1628 if (IS_ZEBRA_DEBUG_KERNEL)
1629 {
1630 zlog_debug ("netlink_route_multipath() "
1631 "(recursive, multihop): %s %s/%d type %s",
1632 lookup (nlmsg_str, cmd),
1633 #ifdef HAVE_IPV6
1634 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
1635 inet6_ntoa (p->u.prefix6),
1636 #else
1637 inet_ntoa (p->u.prefix4),
1638 #endif /* HAVE_IPV6 */
1639 p->prefixlen, nexthop_types_desc[nexthop->rtype]);
1640 }
1641 if (nexthop->rtype == NEXTHOP_TYPE_IPV4
1642 || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
1643 {
1644 rta_addattr_l (rta, 4096, RTA_GATEWAY,
1645 &nexthop->rgate.ipv4, bytelen);
1646 rtnh->rtnh_len += sizeof (struct rtattr) + 4;
1647
1648 if (IS_ZEBRA_DEBUG_KERNEL)
1649 zlog_debug("netlink_route_multipath() (recursive, "
1650 "multihop): nexthop via %s if %u",
1651 inet_ntoa (nexthop->rgate.ipv4),
1652 nexthop->rifindex);
1653 }
1654 #ifdef HAVE_IPV6
1655 if (nexthop->rtype == NEXTHOP_TYPE_IPV6
1656 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME
1657 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX)
1658 {
1659 rta_addattr_l (rta, 4096, RTA_GATEWAY,
1660 &nexthop->rgate.ipv6, bytelen);
1661
1662 if (IS_ZEBRA_DEBUG_KERNEL)
1663 zlog_debug("netlink_route_multipath() (recursive, "
1664 "multihop): nexthop via %s if %u",
1665 inet6_ntoa (nexthop->rgate.ipv6),
1666 nexthop->rifindex);
1667 }
1668 #endif /* HAVE_IPV6 */
1669 /* ifindex */
1670 if (nexthop->rtype == NEXTHOP_TYPE_IFINDEX
1671 || nexthop->rtype == NEXTHOP_TYPE_IFNAME
1672 || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX
1673 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
1674 || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
1675 {
1676 rtnh->rtnh_ifindex = nexthop->rifindex;
1677
1678 if (IS_ZEBRA_DEBUG_KERNEL)
1679 zlog_debug("netlink_route_multipath() (recursive, "
1680 "multihop): nexthop via if %u",
1681 nexthop->rifindex);
1682 }
1683 else
1684 {
1685 rtnh->rtnh_ifindex = 0;
1686 }
1687 }
1688 else
1689 {
1690 if (IS_ZEBRA_DEBUG_KERNEL)
1691 {
1692 zlog_debug ("netlink_route_multipath() (multihop): "
1693 "%s %s/%d, type %s", lookup (nlmsg_str, cmd),
1694 #ifdef HAVE_IPV6
1695 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
1696 inet6_ntoa (p->u.prefix6),
1697 #else
1698 inet_ntoa (p->u.prefix4),
1699 #endif /* HAVE_IPV6 */
1700 p->prefixlen, nexthop_types_desc[nexthop->type]);
1701 }
1702 if (nexthop->type == NEXTHOP_TYPE_IPV4
1703 || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
1704 {
1705 rta_addattr_l (rta, 4096, RTA_GATEWAY,
1706 &nexthop->gate.ipv4, bytelen);
1707 rtnh->rtnh_len += sizeof (struct rtattr) + 4;
1708
1709 if (IS_ZEBRA_DEBUG_KERNEL)
1710 zlog_debug("netlink_route_multipath() (multihop): "
1711 "nexthop via %s if %u",
1712 inet_ntoa (nexthop->gate.ipv4),
1713 nexthop->ifindex);
1714 }
1715 #ifdef HAVE_IPV6
1716 if (nexthop->type == NEXTHOP_TYPE_IPV6
1717 || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
1718 || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
1719 {
1720 rta_addattr_l (rta, 4096, RTA_GATEWAY,
1721 &nexthop->gate.ipv6, bytelen);
1722
1723 if (IS_ZEBRA_DEBUG_KERNEL)
1724 zlog_debug("netlink_route_multipath() (multihop): "
1725 "nexthop via %s if %u",
1726 inet6_ntoa (nexthop->gate.ipv6),
1727 nexthop->ifindex);
1728 }
1729 #endif /* HAVE_IPV6 */
1730 /* ifindex */
1731 if (nexthop->type == NEXTHOP_TYPE_IFINDEX
1732 || nexthop->type == NEXTHOP_TYPE_IFNAME
1733 || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX
1734 || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
1735 || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
1736 {
1737 rtnh->rtnh_ifindex = nexthop->ifindex;
1738
1739 if (IS_ZEBRA_DEBUG_KERNEL)
1740 zlog_debug("netlink_route_multipath() (multihop): "
1741 "nexthop via if %u", nexthop->ifindex);
1742 }
1743 else
1744 {
1745 rtnh->rtnh_ifindex = 0;
1746 }
1747 }
1748 rtnh = RTNH_NEXT (rtnh);
1749
1750 if (cmd == RTM_NEWROUTE)
1751 SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
1752 }
1753 }
1754
1755 if (rta->rta_len > RTA_LENGTH (0))
1756 addattr_l (&req.n, 1024, RTA_MULTIPATH, RTA_DATA (rta),
1757 RTA_PAYLOAD (rta));
1758 }
1759
1760 /* If there is no useful nexthop then return. */
1761 if (nexthop_num == 0)
1762 {
1763 if (IS_ZEBRA_DEBUG_KERNEL)
1764 zlog_debug ("netlink_route_multipath(): No useful nexthop.");
1765 return 0;
1766 }
1767
1768 skip:
1769
1770 /* Destination netlink address. */
1771 memset (&snl, 0, sizeof snl);
1772 snl.nl_family = AF_NETLINK;
1773
1774 /* Talk to netlink socket. */
1775 return netlink_talk (&req.n, &netlink_cmd);
1776 }
1777
1778 int
1779 kernel_add_ipv4 (struct prefix *p, struct rib *rib)
1780 {
1781 return netlink_route_multipath (RTM_NEWROUTE, p, rib, AF_INET);
1782 }
1783
1784 int
1785 kernel_delete_ipv4 (struct prefix *p, struct rib *rib)
1786 {
1787 return netlink_route_multipath (RTM_DELROUTE, p, rib, AF_INET);
1788 }
1789
1790 #ifdef HAVE_IPV6
1791 int
1792 kernel_add_ipv6 (struct prefix *p, struct rib *rib)
1793 {
1794 return netlink_route_multipath (RTM_NEWROUTE, p, rib, AF_INET6);
1795 }
1796
1797 int
1798 kernel_delete_ipv6 (struct prefix *p, struct rib *rib)
1799 {
1800 return netlink_route_multipath (RTM_DELROUTE, p, rib, AF_INET6);
1801 }
1802
1803 /* Delete IPv6 route from the kernel. */
1804 int
1805 kernel_delete_ipv6_old (struct prefix_ipv6 *dest, struct in6_addr *gate,
1806 unsigned int index, int flags, int table)
1807 {
1808 return netlink_route (RTM_DELROUTE, AF_INET6, &dest->prefix,
1809 dest->prefixlen, gate, index, flags, table);
1810 }
1811 #endif /* HAVE_IPV6 */
1812 \f
1813 /* Interface address modification. */
1814 int
1815 netlink_address (int cmd, int family, struct interface *ifp,
1816 struct connected *ifc)
1817 {
1818 int bytelen;
1819 struct prefix *p;
1820
1821 struct
1822 {
1823 struct nlmsghdr n;
1824 struct ifaddrmsg ifa;
1825 char buf[1024];
1826 } req;
1827
1828 p = ifc->address;
1829 memset (&req, 0, sizeof req);
1830
1831 bytelen = (family == AF_INET ? 4 : 16);
1832
1833 req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct ifaddrmsg));
1834 req.n.nlmsg_flags = NLM_F_REQUEST;
1835 req.n.nlmsg_type = cmd;
1836 req.ifa.ifa_family = family;
1837
1838 req.ifa.ifa_index = ifp->ifindex;
1839 req.ifa.ifa_prefixlen = p->prefixlen;
1840
1841 addattr_l (&req.n, sizeof req, IFA_LOCAL, &p->u.prefix, bytelen);
1842
1843 if (family == AF_INET && cmd == RTM_NEWADDR)
1844 {
1845 if (if_is_broadcast (ifp) && ifc->destination)
1846 {
1847 p = ifc->destination;
1848 addattr_l (&req.n, sizeof req, IFA_BROADCAST, &p->u.prefix,
1849 bytelen);
1850 }
1851 }
1852
1853 if (CHECK_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY))
1854 SET_FLAG (req.ifa.ifa_flags, IFA_F_SECONDARY);
1855
1856 if (ifc->label)
1857 addattr_l (&req.n, sizeof req, IFA_LABEL, ifc->label,
1858 strlen (ifc->label) + 1);
1859
1860 return netlink_talk (&req.n, &netlink_cmd);
1861 }
1862
1863 int
1864 kernel_address_add_ipv4 (struct interface *ifp, struct connected *ifc)
1865 {
1866 return netlink_address (RTM_NEWADDR, AF_INET, ifp, ifc);
1867 }
1868
1869 int
1870 kernel_address_delete_ipv4 (struct interface *ifp, struct connected *ifc)
1871 {
1872 return netlink_address (RTM_DELADDR, AF_INET, ifp, ifc);
1873 }
1874
1875
1876 extern struct thread_master *master;
1877
1878 /* Kernel route reflection. */
1879 int
1880 kernel_read (struct thread *thread)
1881 {
1882 int ret;
1883 int sock;
1884
1885 sock = THREAD_FD (thread);
1886 ret = netlink_parse_info (netlink_information_fetch, &netlink);
1887 thread_add_read (zebrad.master, kernel_read, NULL, netlink.sock);
1888
1889 return 0;
1890 }
1891
1892 /* Exported interface function. This function simply calls
1893 netlink_socket (). */
1894 void
1895 kernel_init (void)
1896 {
1897 unsigned long groups;
1898
1899 groups = RTMGRP_LINK | RTMGRP_IPV4_ROUTE | RTMGRP_IPV4_IFADDR;
1900 #ifdef HAVE_IPV6
1901 groups |= RTMGRP_IPV6_ROUTE | RTMGRP_IPV6_IFADDR;
1902 #endif /* HAVE_IPV6 */
1903 netlink_socket (&netlink, groups);
1904 netlink_socket (&netlink_cmd, 0);
1905
1906 /* Register kernel socket. */
1907 if (netlink.sock > 0)
1908 thread_add_read (zebrad.master, kernel_read, NULL, netlink.sock);
1909 }