On 18.10.2013 15:23, Milan Kocian wrote:
Sometimes its useful feature. So make it optional per bgp protocol.
Based on hint http://permalink.gmane.org/gmane.network.bird.user/944

Signed-off-by: Milan Kocian <mi...@wq.cz>
---
  proto/bgp/attrs.c  | 5 +++--
  proto/bgp/bgp.h    | 1 +
  proto/bgp/config.Y | 4 +++-
  3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index c27a498..27a2694 100644
--- a/proto/bgp/attrs.c
+++ b/proto/bgp/attrs.c
@@ -1704,8 +1704,9 @@ bgp_decode_attrs(struct bgp_conn *conn, byte *attr, 
unsigned int len, struct lin
    bgp_remove_as4_attrs(bgp, a);
/* If the AS path attribute contains our AS, reject the routes */
-  if (bgp_as_path_loopy(bgp, a))
-    goto withdraw;
+  if (!bgp->cf->allow_as_in)
+    if (bgp_as_path_loopy(bgp, a))
+      goto withdraw;
Removing loop check at all is wrong (as it can lead to real loops).
Typical implementation include configurable maximum number of local ASn that can be contained in path.

/* Two checks for IBGP loops caused by route reflection, RFC 4456 */
    if (bgp_originator_id_loopy(bgp, a) ||
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h
index 77a3671..f45c3aa 100644
--- a/proto/bgp/bgp.h
+++ b/proto/bgp/bgp.h
@@ -44,6 +44,7 @@ struct bgp_config {
    int passive;                                /* Do not initiate outgoing 
connection */
    int interpret_communities;          /* Hardwired handling of well-known 
communities */
    int secondary;                      /* Accept also non-best routes (i.e. 
RA_ACCEPTED) */
+  int allow_as_in;
    unsigned connect_retry_time;
    unsigned hold_time, initial_hold_time;
    unsigned keepalive_time;
diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y
index d5e5aac..709f5dc 100644
--- a/proto/bgp/config.Y
+++ b/proto/bgp/config.Y
@@ -26,7 +26,7 @@ CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS, HOLD, TIME, CONNECT, 
RETRY,
        PREFER, OLDER, MISSING, LLADDR, DROP, IGNORE, ROUTE, REFRESH,
        INTERPRET, COMMUNITIES, BGP_ORIGINATOR_ID, BGP_CLUSTER_LIST, IGP,
        TABLE, GATEWAY, DIRECT, RECURSIVE, MED, TTL, SECURITY, DETERMINISTIC,
-       SECONDARY)
+       SECONDARY, ALLOW, ALLOW_AS_IN)
CF_GRAMMAR @@ -49,6 +49,7 @@ bgp_proto_start: proto_start BGP {
       BGP_CFG->advertise_ipv4 = 1;
       BGP_CFG->interpret_communities = 1;
       BGP_CFG->default_local_pref = 100;
+     BGP_CFG->allow_as_in = 0;
   }
   ;
@@ -78,6 +79,7 @@ bgp_proto:
   | bgp_proto MULTIHOP expr ';' { BGP_CFG->multihop = $3; if (($3<1) || ($3>255)) 
cf_error("Multihop must be in range 1-255"); }
   | bgp_proto NEXT HOP SELF ';' { BGP_CFG->next_hop_self = 1; 
BGP_CFG->next_hop_keep = 0; }
   | bgp_proto NEXT HOP KEEP ';' { BGP_CFG->next_hop_keep = 1; 
BGP_CFG->next_hop_self = 0; }
+ | bgp_proto ALLOW AS IN ';' { BGP_CFG->allow_as_in = 1; }
   | bgp_proto MISSING LLADDR SELF ';' { BGP_CFG->missing_lladdr = MLL_SELF; }
   | bgp_proto MISSING LLADDR DROP ';' { BGP_CFG->missing_lladdr = MLL_DROP; }
   | bgp_proto MISSING LLADDR IGNORE ';' { BGP_CFG->missing_lladdr = 
MLL_IGNORE; }

Reply via email to