<div>Hello everyone.</div><div>š</div><div>I'd like to share some (beta-quality) patches permitting to create BGP protocol instances dynamically, based on templates.</div><div>Main purpose is to get feedback and make them good enough to be integrated into main tree.</div><div>š</div><div>Similar feature was implemented by major vendors yeas ago.</div><div>Juniper:</div><div><a href="http://www.juniper.net/techpubs/en_US/junos11.4/topics/usage-guidelines/routing-configuring-bgp-groups-and-peers.html">http://www.juniper.net/techpubs/en_US/junos11.4/topics/usage-guidelines/routing-configuring-bgp-groups-and-peers.html</a></div><div>Cisco IOS:š<a href="http://www.cisco.com/c/en/us/td/docs/ios/12_2sr/12_2srb/feature/guide/tbgp_c/brbpeer.html#wp1128937">http://www.cisco.com/c/en/us/td/docs/ios/12_2sr/12_2srb/feature/guide/tbgp_c/brbpeer.html#wp1128937</a></div><div>š</div><div>Typically it is used in peering setups.</div><div>š</div><div>Patches still have some rough edges (see below) but should work^Wnot make bird crash every 5 minutes.</div><div>š</div><div>Example setup:</div><div><div>š</div><div># Set up template with ALL info except and IP address</div><div># In this case we don't have any option to specify interface, so it is specified in</div><div># neighbor part</div><div>template bgp bgg {</div><div>š š š š debug all;</div><div>š š š š local as 4444;</div><div>š š š š neighbor fe80::1%em0 as 4443;</div><div>š š š š import all;</div><div>š š š š export all;</div><div>};</div></div><div>š</div><div># Set up dynamic template with ranges and neighbor mask</div><div># Accepted format (%) values:</div><div># 1..4 - octets in IPv4 address</div><div># 1..8 - hex groups in IPv6 address</div><div># I - full addressš</div><div># format values can be specified more than once in format string</div><div># e.g. "b_x_%4_%I_%4"</div><div><div>dynamic template bgp bgp_int from bgg {</div><div>š š š š dynamic template name "b_s%4-%8-%8";</div><div>š š š š dynamic allow fe80::f000/112, fe80::f00/116;</div><div>};</div></div><div>š</div><div># You need to have at least one "normal" bgp peer to get listen socket opened</div><div># That's all</div><div>š</div><div># Example from working system:</div><div># š using šseveral { dynamic template name "b_Vrf1_s%8";šdynamic allow fe80::/64; }</div><div># štemplates</div><div>š</div><div><div>bird> show protocols</div><div>name š š proto š štable š šstate šsince š š š info</div><div>direct1 šDirect š master š up š š 22:06:05</div><div>kernel1 šKernel š master š up š š 22:06:05</div><div>device1 šDevice š master š up š š 22:06:05</div><div>ospf3 š šOSPF š š master š up š š 22:06:05 š šRunning</div><div>..</div><div><div>b_Vrf2_dc1_c1 BGP š š šVrf2 š š up š š 22:06:06 š šEstablished</div><div>b_Vrf1_se48 BGP š š šVrf1 š up š š 22:06:05 š šEstablished</div><div>b_Vrf1_se10 BGP š š šVrf1 š up š š 22:06:06 š šEstablished</div><div>b_Vrf1_se45 BGP š š šVrf1 š up š š 22:06:06 š šEstablished</div><div>b_Vrf1_se60 BGP š š šVrf1 š up š š 22:06:07 š šEstablished</div><div>b_Vrf2_se91 BGP š š šVrf2 š š up š š 22:06:08 š šEstablished</div></div><div>..</div><div>š</div><div>Comments on individual patches:</div><div>0001 is basic LPM for the f_trie šand is part of aggregator patch</div><div>0002 decouples get-proto-from-address function from incoming connection handling. This makes hacking here much simpler (for example, implementing IP hash lookup)</div><div>0003 just movesšSYM_MAX_LEN definition to header</div><div>0004 moves sizeof(XXX_proto) info inside protocol structure permitting anyone to call proto_config_init() without knowing details</div><div>0005 tries to isolate/limit global new_config/cfg_mem variables usage to absolute minimum. Despite the fact that actual BGP patch does not require much more than config_start_edit() / config_stop_edit() implementation, I (after hours of debugging cores) decided to make things more transparent here.</div><div>0006 is the actual patch.</div><div>Basically, it</div><div>* adds SYM_TEMPLATE class</div><div>* adds dyn_parent proto_config field to specify parent template</div><div>* adds condition-check and copy-dynamic protocol callbacks</div><div>* adds runtime config/protocol creation functions to nest</div><div>* adds bgp-specific structure to struct config allocated on demandš</div><div>š</div><div>Rough edges:</div><div>* non-optimized case for IPv6 LL prefixes</div><div>* non-optimized peer lookup for existing sessions</div><div>* dynamic expire not implemented (next version)</div><div>* no docs (next version)</div><div>* some bugs, definitely</div></div>