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; }