>Number:         157001
>Category:       misc
>Synopsis:       [PATCH] net/bird: add multiple fibs support
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri May 13 10:40:03 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Alexander V. Chernikov
>Release:        FreeBSD 8.2-STABLE
>Organization:
JSC "Meganet"
>Environment:
FreeBSD silicium.meganet.ru 8.2-STABLE FreeBSD 8.2-STABLE #1: Mon Apr 18 
18:22:06 MSD 2011     [email protected]:/usr/obj/usr/src/sys/ROUTER  
amd64

>Description:
Changelog:
* Add FIBS option enabling multiple fibs support
* Add LEARN_FIX option enabling simultaneous operation of different routing 
software
* Update to 1.3.1


fibs.diff:
this patch shouldn't be taken into upstream, our routing protocol (rtsock) 
should be changed to support multiple fibs via single socket. However, for 
"here and now" situation this patch can be placed into a port.

learn-krt-sock.c:
by default, bird considers IFF_FLAG1 routes (e.g. all dynamic installed, for 
example, by quagga) as own incorrectly installed routes and deletes them. This 
is default behavior for all *BSD systems since rtsock doesn't support some kind 
of installer identification (caller process pid). This patch makes bird 
consider all such routes as any other (non-directly connected) kernel routes.

Problems can arise if used with "persist" kernel option (bird will not delete 
such routes after restart and IGP link-up)
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -urN net/bird/Makefile net/bird.new/Makefile
--- net/bird/Makefile   2011-04-12 21:52:18.000000000 +0400
+++ net/bird.new/Makefile       2011-05-13 12:59:07.639973965 +0400
@@ -6,7 +6,7 @@
 #
 
 PORTNAME=      bird
-PORTVERSION=   1.3.0
+PORTVERSION=   1.3.1
 CATEGORIES=    net
 MASTER_SITES=  ftp://bird.network.cz/pub/bird/
 
@@ -17,13 +17,26 @@
 USE_GMAKE=     yes
 GNU_CONFIGURE= yes
 
+OPTIONS=       FIBS            "Enable multiple fib support" Off \
+               LEARN_FIX       "Support multiple routing daemons" Off
+
 MAKE_JOBS_UNSAFE=      yes
 
 USE_RC_SUBR=   bird
 
+.include <bsd.port.pre.mk>
+
+.if defined(WITH_FIBS)
+EXTRA_PATCHES+=        ${FILESDIR}/fibs.diff
+.endif
+
+.if defined(WITH_LEARN_FIX)
+EXTRA_PATCHES+=        ${FILESDIR}/learn-krt-sock.c
+.endif
+
 post-install:
        @if [ ! -f ${PREFIX}/etc/bird.conf ]; then \
                ${CP} -p ${PREFIX}/etc/bird.conf.example 
${PREFIX}/etc/bird.conf ; \
        fi
 
-.include <bsd.port.mk>
+.include <bsd.port.post.mk>
diff -urN net/bird/distinfo net/bird.new/distinfo
--- net/bird/distinfo   2011-04-12 21:52:18.000000000 +0400
+++ net/bird.new/distinfo       2011-05-10 13:32:38.378103543 +0400
@@ -1,2 +1,2 @@
-SHA256 (bird-1.3.0.tar.gz) = 
ff90e3ee115a83e2b03a57095132923f66e1fca874dcca7a908075b6c2dc84b3
-SIZE (bird-1.3.0.tar.gz) = 735100
+SHA256 (bird-1.3.1.tar.gz) = 
848be209aba6a1a85ae0ed6192710f8bcc2f1257068191fe2959398cdec01afb
+SIZE (bird-1.3.1.tar.gz) = 826422
diff -urN net/bird/files/fibs.diff net/bird.new/files/fibs.diff
--- net/bird/files/fibs.diff    1970-01-01 03:00:00.000000000 +0300
+++ net/bird.new/files/fibs.diff        2011-05-10 13:32:09.407955382 +0400
@@ -0,0 +1,126 @@
+diff -urN sysdep/bsd/Modules sysdep/bsd/Modules
+--- sysdep/bsd/Modules 2011-03-31 12:29:42.000000000 +0400
++++ sysdep/bsd/Modules 2011-05-10 12:04:30.643950460 +0400
+@@ -4,3 +4,4 @@
+ krt-set.h
+ krt-sock.c
+ krt-sock.h
++fib.Y
+diff -urN sysdep/bsd/fib.Y sysdep/bsd/fib.Y
+--- sysdep/bsd/fib.Y   1970-01-01 03:00:00.000000000 +0300
++++ sysdep/bsd/fib.Y   2011-05-10 12:04:05.724272679 +0400
+@@ -0,0 +1,29 @@
++/*
++ *    BIRD -- FreeBSD rtsock configuration
++ *
++ *    (c) 2011 Alexander V. Chernikov
++ *
++ *    Can be freely distributed and used under the terms of the GNU GPL.
++ */
++
++CF_HDR
++
++CF_DECLS
++
++CF_KEYWORDS(ASYNC, KERNEL, TABLE, KRT_PREFSRC, KRT_REALM)
++
++CF_GRAMMAR
++
++CF_ADDTO(kern_proto, kern_proto rtsock_item ';')
++
++rtsock_item:
++   KERNEL TABLE expr {
++      if ($3 <= 0 || $3 >= max_fib_num())
++        cf_error("Kernel routing table number out of range");
++      THIS_KRT->scan.table_id = $3;
++   }
++ ;
++
++CF_CODE
++
++CF_END
+diff -urN sysdep/bsd/krt-scan.h sysdep/bsd/krt-scan.h
+--- sysdep/bsd/krt-scan.h      2011-03-31 12:29:42.000000000 +0400
++++ sysdep/bsd/krt-scan.h      2011-05-10 11:58:54.812942887 +0400
+@@ -10,6 +10,7 @@
+ #define _BIRD_KRT_SCAN_H_
+ 
+ struct krt_scan_params {
++  int table_id;                               /* Kernel table ID we sync with 
*/
+ };
+ 
+ struct krt_scan_status {
+diff -urN sysdep/bsd/krt-sock.c sysdep/bsd/krt-sock.c
+--- sysdep/bsd/krt-sock.c      2011-05-02 12:13:18.000000000 +0400
++++ sysdep/bsd/krt-sock.c      2011-05-10 12:25:22.075267568 +0400
+@@ -53,6 +53,21 @@
+      );
+ }
+ 
++int
++max_fib_num()
++{
++  int fibs = 1;
++  size_t fibs_len = sizeof(fibs);
++  if (sysctlbyname("net.fibs", &fibs, &fibs_len, NULL, 0) == -1)
++  {
++    log(L_ERR "KRT: unable to get fib number, assuming 1. error: %s", 
strerror(errno));
++    return 1;
++  }
++
++  log(L_TRACE "Max fibs: %d\n", fibs);
++  return fibs;
++}
++
+ #define ROUNDUP(a) \
+         ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
+ 
+@@ -219,6 +234,7 @@
+ {
+   sock *sk_rt;
+   static int ks_open_tried = 0;
++  int fib = 0;
+ 
+   if (ks_open_tried)
+     return;
+@@ -230,6 +246,16 @@
+   if( (rt_sock = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0)
+     die("Cannot open kernel socket for routes");
+ 
++  fib = ((struct krt_config *)x)->scan.table_id;
++  log(L_TRACE "KRT: Setting fib %d", fib);
++
++
++  if ((fib != 0) && (setsockopt(rt_sock, SOL_SOCKET, SO_SETFIB, &fib, 
sizeof(fib)) == -1))
++  {
++    log(L_ERR "KRT: setsockopt() failed for socket %d: %s", rt_sock, 
strerror(errno));
++    die("Cannot set fib for kernel socket");
++  }
++
+   sk_rt = sk_new(krt_pool);
+   sk_rt->type = SK_MAGIC;
+   sk_rt->rx_hook = krt_set_hook;
+diff -urN sysdep/cf/bsd-v6.h sysdep/cf/bsd-v6.h
+--- sysdep/cf/bsd-v6.h 2011-03-31 12:29:42.000000000 +0400
++++ sysdep/cf/bsd-v6.h 2011-05-10 11:19:01.394166479 +0400
+@@ -10,7 +10,7 @@
+ 
+ #define CONFIG_AUTO_ROUTES
+ #define CONFIG_SELF_CONSCIOUS
+-#undef CONFIG_MULTIPLE_TABLES
++#define CONFIG_MULTIPLE_TABLES
+ 
+ #undef CONFIG_UNIX_IFACE
+ #undef CONFIG_UNIX_SET
+diff -urN sysdep/cf/bsd.h sysdep/cf/bsd.h
+--- sysdep/cf/bsd.h    2011-03-31 12:29:42.000000000 +0400
++++ sysdep/cf/bsd.h    2011-05-10 11:19:01.398182352 +0400
+@@ -8,7 +8,7 @@
+ 
+ #define CONFIG_AUTO_ROUTES
+ #define CONFIG_SELF_CONSCIOUS
+-#undef CONFIG_MULTIPLE_TABLES
++#define CONFIG_MULTIPLE_TABLES
+ 
+ #undef CONFIG_UNIX_IFACE
+ #undef CONFIG_UNIX_SET
diff -urN net/bird/files/learn-krt-sock.c net/bird.new/files/learn-krt-sock.c
--- net/bird/files/learn-krt-sock.c     1970-01-01 03:00:00.000000000 +0300
+++ net/bird.new/files/learn-krt-sock.c 2011-05-11 10:43:24.587310296 +0400
@@ -0,0 +1,11 @@
+--- sysdep/bsd/krt-sock.c.orig 2011-05-11 10:41:35.432219356 +0400
++++ sysdep/bsd/krt-sock.c      2011-05-11 10:42:02.483875083 +0400
+@@ -320,7 +320,7 @@
+   if ((flags & RTF_GATEWAY) && ipa_zero(igate))
+     { log(L_ERR "%s (%I/%d) - missing gateway", errmsg, idst, pxlen); return; 
}
+ 
+-  u32 self_mask = RTF_PROTO1;
++  u32 self_mask = 0;
+   u32 alien_mask = RTF_STATIC | RTF_PROTO1 | RTF_GATEWAY;
+ 
+ #ifdef RTF_PROTO2


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to