Annotation of embedaddon/quagga/doc/routeserver.texi, revision 1.1

1.1     ! misho       1: @c -*-texinfo-*-
        !             2: @c @value{COPYRIGHT_STR}
        !             3: @c See file quagga.texi for copying conditions.
        !             4: @c
        !             5: @c This file is a modified version of Jose Luis Rubio's TeX sources 
        !             6: @c of his RS-Manual document
        !             7: 
        !             8: @node Configuring Quagga as a Route Server
        !             9: @chapter Configuring Quagga as a Route Server
        !            10: 
        !            11: The purpose of a Route Server is to centralize the peerings between BGP
        !            12: speakers. For example if we have an exchange point scenario with four BGP
        !            13: speakers, each of which maintaining a BGP peering with the other three
        !            14: (@pxref{fig:full-mesh}), we can convert it into a centralized scenario where
        !            15: each of the four establishes a single BGP peering against the Route Server
        !            16: (@pxref{fig:route-server}).
        !            17: 
        !            18: We will first describe briefly the Route Server model implemented by Quagga.
        !            19: We will explain the commands that have been added for configuring that
        !            20: model. And finally we will show a full example of Quagga configured as Route
        !            21: Server.
        !            22: 
        !            23: @menu
        !            24: * Description of the Route Server model::
        !            25: * Commands for configuring a Route Server::
        !            26: * Example of Route Server Configuration::
        !            27: @end menu
        !            28: 
        !            29: @node Description of the Route Server model
        !            30: @section Description of the Route Server model
        !            31: 
        !            32: First we are going to describe the normal processing that BGP announcements
        !            33: suffer inside a standard BGP speaker, as shown in @ref{fig:normal-processing},
        !            34: it consists of three steps:
        !            35: 
        !            36: @itemize @bullet
        !            37: @item
        !            38: When an announcement is received from some peer, the `In' filters
        !            39: configured for that peer are applied to the announcement. These filters can
        !            40: reject the announcement, accept it unmodified, or accept it with some of its
        !            41: attributes modified.
        !            42: 
        !            43: @item
        !            44: The announcements that pass the `In' filters go into the
        !            45: Best Path Selection process, where they are compared to other
        !            46: announcements referred to the same destination that have been
        !            47: received from different peers (in case such other
        !            48: announcements exist). For each different destination, the announcement
        !            49: which is selected as the best is inserted into the BGP speaker's Loc-RIB.
        !            50: 
        !            51: @item
        !            52: The routes which are inserted in the Loc-RIB are
        !            53: considered for announcement to all the peers (except the one
        !            54: from which the route came). This is done by passing the routes
        !            55: in the Loc-RIB through the `Out' filters corresponding to each
        !            56: peer. These filters can reject the route,
        !            57: accept it unmodified, or accept it with some of its attributes
        !            58: modified. Those routes which are accepted by the `Out' filters
        !            59: of a peer are announced to that peer.
        !            60: @end itemize
        !            61: 
        !            62: @float Figure,fig:normal-processing
        !            63: @image{fig-normal-processing,400pt,,Normal announcement processing}
        !            64: @caption{Announcement processing inside a ``normal'' BGP speaker}
        !            65: @end float
        !            66: 
        !            67: @float Figure,fig:full-mesh
        !            68: @image{fig_topologies_full,120pt,,Full Mesh BGP Topology}
        !            69: @caption{Full Mesh}
        !            70: @end float
        !            71: 
        !            72: @float Figure,fig:route-server
        !            73: @image{fig_topologies_rs,120pt,,Route Server BGP Topology}
        !            74: @caption{Route Server and clients} 
        !            75: @end float
        !            76: 
        !            77: Of course we want that the routing tables obtained in each of the routers
        !            78: are the same when using the route server than when not. But as a consequence
        !            79: of having a single BGP peering (against the route server), the BGP speakers
        !            80: can no longer distinguish from/to which peer each announce comes/goes.
        !            81: @anchor{filter-delegation}This means that the routers connected to the route
        !            82: server are not able to apply by themselves the same input/output filters
        !            83: as in the full mesh scenario, so they have to delegate those functions to
        !            84: the route server.
        !            85: 
        !            86: Even more, the ``best path'' selection must be also performed inside
        !            87: the route server on behalf of its clients. The reason is that if, after
        !            88: applying the filters of the announcer and the (potential) receiver, the
        !            89: route server decides to send to some client two or more different
        !            90: announcements referred to the same destination, the client will only
        !            91: retain the last one, considering it as an implicit withdrawal of the
        !            92: previous announcements for the same destination. This is the expected
        !            93: behavior of a BGP speaker as defined in @cite{RFC1771}, and even though
        !            94: there are some proposals of mechanisms that permit multiple paths for
        !            95: the same destination to be sent through a single BGP peering, none are
        !            96: currently supported by most existing BGP implementations.
        !            97: 
        !            98: As a consequence a route server must maintain additional information and
        !            99: perform additional tasks for a RS-client that those necessary for common BGP
        !           100: peerings. Essentially a route server must:
        !           101: 
        !           102: @anchor{Route Server tasks}
        !           103: @itemize @bullet
        !           104: @item
        !           105: Maintain a separated Routing Information Base (Loc-RIB)
        !           106: for each peer configured as RS-client, containing the routes
        !           107: selected as a result of the ``Best Path Selection'' process
        !           108: that is performed on behalf of that RS-client.
        !           109: 
        !           110: @item
        !           111: Whenever it receives an announcement from a RS-client,
        !           112: it must consider it for the Loc-RIBs of the other RS-clients.
        !           113: 
        !           114: @anchor{Route-server path filter process}
        !           115: @itemize @bullet
        !           116: @item
        !           117: This means that for each of them the route server must pass the
        !           118: announcement through the appropriate `Out' filter of the
        !           119: announcer.
        !           120: 
        !           121: @item
        !           122: Then through the  appropriate `In' filter of
        !           123: the potential  receiver. 
        !           124: 
        !           125: @item
        !           126: Only if the announcement is accepted by both filters it will be passed
        !           127: to the ``Best Path Selection'' process.
        !           128: 
        !           129: @item
        !           130: Finally, it might go into the Loc-RIB of the receiver.
        !           131: @end itemize
        !           132: @end itemize
        !           133: 
        !           134: When we talk about the ``appropriate'' filter, both the announcer and the
        !           135: receiver of the route must be taken into account. Suppose that the route
        !           136: server receives an announcement from client A, and the route server is
        !           137: considering it for the Loc-RIB of client B. The filters that should be
        !           138: applied are the same that would be used in the full mesh scenario, i.e.,
        !           139: first the `Out' filter of router A for announcements going to router B, and
        !           140: then the `In' filter of router B for announcements coming from router A.
        !           141: 
        !           142: We call ``Export Policy'' of a RS-client to the set of `Out' filters that
        !           143: the client would use if there was no route server. The same applies for the
        !           144: ``Import Policy'' of a RS-client and the set of `In' filters of the client
        !           145: if there was no route server.
        !           146: 
        !           147: It is also common to demand from a route server that it does not
        !           148: modify some BGP attributes (next-hop, as-path and MED) that are usually
        !           149: modified by standard BGP speakers before announcing a route.
        !           150: 
        !           151: The announcement processing model implemented by Quagga is shown in
        !           152: @ref{fig:rs-processing}. The figure shows a mixture of RS-clients (B, C and D)
        !           153: with normal BGP peers (A). There are some details that worth additional
        !           154: comments:
        !           155: 
        !           156: @itemize @bullet
        !           157: @item
        !           158: Announcements coming from a normal BGP peer are also
        !           159: considered for the Loc-RIBs of all the RS-clients. But
        !           160: logically they do not pass through any export policy.
        !           161: 
        !           162: @item
        !           163: Those peers that are configured as RS-clients do not
        !           164: receive any announce from the `Main' Loc-RIB.
        !           165: 
        !           166: @item
        !           167: Apart from import and export policies,
        !           168: `In' and `Out' filters can also be set for RS-clients. `In'
        !           169: filters might be useful when the route server has also normal
        !           170: BGP peers. On the other hand, `Out' filters for RS-clients are
        !           171: probably unnecessary, but we decided not to remove them as
        !           172: they do not hurt anybody (they can always be left empty).
        !           173: @end itemize
        !           174: 
        !           175: @float Figure,fig:rs-processing
        !           176: @image{fig-rs-processing,450pt,,Route Server Processing Model}
        !           177: @caption{Announcement processing model implemented by the Route Server}
        !           178: @end float
        !           179: 
        !           180: @node Commands for configuring a Route Server
        !           181: @section Commands for configuring a Route Server
        !           182: 
        !           183: Now we will describe the commands that have been added to quagga
        !           184: in order to support the route server features.
        !           185: 
        !           186: @deffn {Route-Server} {neighbor @var{peer-group} route-server-client} {}
        !           187: @deffnx {Route-Server} {neighbor @var{A.B.C.D} route-server-client} {}
        !           188: @deffnx {Route-Server} {neighbor @var{X:X::X:X} route-server-client} {}
        !           189: This command configures the peer given by @var{peer}, @var{A.B.C.D} or
        !           190: @var{X:X::X:X} as an RS-client.
        !           191: 
        !           192: Actually this command is not new, it already existed in standard Quagga. It
        !           193: enables the transparent mode for the specified peer. This means that some
        !           194: BGP attributes (as-path, next-hop and MED) of the routes announced to that
        !           195: peer are not modified.
        !           196: 
        !           197: With the route server patch, this command, apart from setting the
        !           198: transparent mode, creates a new Loc-RIB dedicated to the specified peer
        !           199: (those named `Loc-RIB for X' in @ref{fig:rs-processing}.). Starting from
        !           200: that moment, every announcement received by the route server will be also
        !           201: considered for the new Loc-RIB.
        !           202: @end deffn
        !           203: 
        !           204: @deffn {Route-Server} {neigbor @{A.B.C.D|X.X::X.X|peer-group@} route-map WORD @{import|export@}} {}
        !           205: This set of commands can be used to specify the route-map that
        !           206: represents the Import or Export policy of a peer which is
        !           207: configured as a RS-client (with the previous command).
        !           208: @end deffn
        !           209: 
        !           210: @deffn {Route-Server} {match peer @{A.B.C.D|X:X::X:X@}} {}
        !           211: This is a new @emph{match} statement for use in route-maps, enabling them to
        !           212: describe import/export policies. As we said before, an import/export policy
        !           213: represents a set of input/output filters of the RS-client. This statement
        !           214: makes possible that a single route-map represents the full set of filters
        !           215: that a BGP speaker would use for its different peers in a non-RS scenario.
        !           216: 
        !           217: The @emph{match peer} statement has different semantics whether it is used
        !           218: inside an import or an export route-map. In the first case the statement
        !           219: matches if the address of the peer who sends the announce is the same that
        !           220: the address specified by @{A.B.C.D|X:X::X:X@}. For export route-maps it
        !           221: matches when @{A.B.C.D|X:X::X:X@} is the address of the RS-Client into whose
        !           222: Loc-RIB the announce is going to be inserted (how the same export policy is
        !           223: applied before different Loc-RIBs is shown in @ref{fig:rs-processing}.).
        !           224: @end deffn
        !           225: 
        !           226: @deffn {Route-map Command} {call @var{WORD}} {}
        !           227: This command (also used inside a route-map) jumps into a different
        !           228: route-map, whose name is specified by @var{WORD}. When the called
        !           229: route-map finishes, depending on its result the original route-map
        !           230: continues or not. Apart from being useful for making import/export
        !           231: route-maps easier to write, this command can also be used inside
        !           232: any normal (in or out) route-map.
        !           233: @end deffn
        !           234: 
        !           235: @node Example of Route Server Configuration
        !           236: @section Example of Route Server Configuration
        !           237: 
        !           238: Finally we are going to show how to configure a Quagga daemon to act as a
        !           239: Route Server. For this purpose we are going to present a scenario without
        !           240: route server, and then we will show how to use the configurations of the BGP
        !           241: routers to generate the configuration of the route server.
        !           242: 
        !           243: All the configuration files shown in this section have been taken
        !           244: from scenarios which were tested using the VNUML tool
        !           245: @uref{http://www.dit.upm.es/vnuml,VNUML}. 
        !           246: 
        !           247: @menu
        !           248: * Configuration of the BGP routers without Route Server::
        !           249: * Configuration of the BGP routers with Route Server::
        !           250: * Configuration of the Route Server itself::
        !           251: * Further considerations about Import and Export route-maps::
        !           252: @end menu
        !           253: 
        !           254: @node Configuration of the BGP routers without Route Server
        !           255: @subsection Configuration of the BGP routers without Route Server
        !           256: 
        !           257: We will suppose that our initial scenario is an exchange point with three
        !           258: BGP capable routers, named RA, RB and RC. Each of the BGP speakers generates
        !           259: some routes (with the @var{network} command), and establishes BGP peerings
        !           260: against the other two routers. These peerings have In and Out route-maps
        !           261: configured, named like ``PEER-X-IN'' or ``PEER-X-OUT''. For example the
        !           262: configuration file for router RA could be the following:
        !           263: 
        !           264: @exampleindent 0
        !           265: @example
        !           266: #Configuration for router 'RA'
        !           267: !
        !           268: hostname RA
        !           269: password ****
        !           270: !
        !           271: router bgp 65001
        !           272:   no bgp default ipv4-unicast
        !           273:   neighbor 2001:0DB8::B remote-as 65002
        !           274:   neighbor 2001:0DB8::C remote-as 65003
        !           275: !
        !           276:   address-family ipv6
        !           277:     network 2001:0DB8:AAAA:1::/64
        !           278:     network 2001:0DB8:AAAA:2::/64
        !           279:     network 2001:0DB8:0000:1::/64
        !           280:     network 2001:0DB8:0000:2::/64
        !           281: 
        !           282:     neighbor 2001:0DB8::B activate
        !           283:     neighbor 2001:0DB8::B soft-reconfiguration inbound
        !           284:     neighbor 2001:0DB8::B route-map PEER-B-IN in
        !           285:     neighbor 2001:0DB8::B route-map PEER-B-OUT out
        !           286: 
        !           287:     neighbor 2001:0DB8::C activate
        !           288:     neighbor 2001:0DB8::C soft-reconfiguration inbound
        !           289:     neighbor 2001:0DB8::C route-map PEER-C-IN in
        !           290:     neighbor 2001:0DB8::C route-map PEER-C-OUT out
        !           291:   exit-address-family
        !           292: !
        !           293: ipv6 prefix-list COMMON-PREFIXES seq  5 permit 2001:0DB8:0000::/48 ge 64 le 64
        !           294: ipv6 prefix-list COMMON-PREFIXES seq 10 deny any
        !           295: !
        !           296: ipv6 prefix-list PEER-A-PREFIXES seq  5 permit 2001:0DB8:AAAA::/48 ge 64 le 64
        !           297: ipv6 prefix-list PEER-A-PREFIXES seq 10 deny any
        !           298: !
        !           299: ipv6 prefix-list PEER-B-PREFIXES seq  5 permit 2001:0DB8:BBBB::/48 ge 64 le 64
        !           300: ipv6 prefix-list PEER-B-PREFIXES seq 10 deny any
        !           301: !
        !           302: ipv6 prefix-list PEER-C-PREFIXES seq  5 permit 2001:0DB8:CCCC::/48 ge 64 le 64
        !           303: ipv6 prefix-list PEER-C-PREFIXES seq 10 deny any
        !           304: !
        !           305: route-map PEER-B-IN permit 10
        !           306:   match ipv6 address prefix-list COMMON-PREFIXES
        !           307:   set metric 100
        !           308: route-map PEER-B-IN permit 20
        !           309:   match ipv6 address prefix-list PEER-B-PREFIXES
        !           310:   set community 65001:11111
        !           311: !
        !           312: route-map PEER-C-IN permit 10
        !           313:   match ipv6 address prefix-list COMMON-PREFIXES
        !           314:   set metric 200
        !           315: route-map PEER-C-IN permit 20
        !           316:   match ipv6 address prefix-list PEER-C-PREFIXES
        !           317:   set community 65001:22222
        !           318: !
        !           319: route-map PEER-B-OUT permit 10
        !           320:   match ipv6 address prefix-list PEER-A-PREFIXES
        !           321: !
        !           322: route-map PEER-C-OUT permit 10
        !           323:   match ipv6 address prefix-list PEER-A-PREFIXES
        !           324: !
        !           325: line vty
        !           326: !
        !           327: @end example
        !           328: 
        !           329: @node Configuration of the BGP routers with Route Server
        !           330: @subsection Configuration of the BGP routers with Route Server
        !           331: 
        !           332: To convert the initial scenario into one with route server, first we must
        !           333: modify the configuration of routers RA, RB and RC. Now they must not peer
        !           334: between them, but only with the route server. For example, RA's
        !           335: configuration would turn into:
        !           336: 
        !           337: @example
        !           338: # Configuration for router 'RA'
        !           339: !
        !           340: hostname RA
        !           341: password ****
        !           342: !
        !           343: router bgp 65001
        !           344:   no bgp default ipv4-unicast
        !           345:   neighbor 2001:0DB8::FFFF remote-as 65000
        !           346: !
        !           347:   address-family ipv6
        !           348:     network 2001:0DB8:AAAA:1::/64
        !           349:     network 2001:0DB8:AAAA:2::/64
        !           350:     network 2001:0DB8:0000:1::/64
        !           351:     network 2001:0DB8:0000:2::/64
        !           352: 
        !           353:     neighbor 2001:0DB8::FFFF activate
        !           354:     neighbor 2001:0DB8::FFFF soft-reconfiguration inbound
        !           355:   exit-address-family
        !           356: !
        !           357: line vty
        !           358: !
        !           359: @end example
        !           360: 
        !           361: Which is logically much simpler than its initial configuration, as it now
        !           362: maintains only one BGP peering and all the filters (route-maps) have
        !           363: disappeared.
        !           364: 
        !           365: @node Configuration of the Route Server itself
        !           366: @subsection Configuration of the Route Server itself
        !           367: 
        !           368: As we said when we described the functions of a route server
        !           369: (@pxref{Description of the Route Server model}), it is in charge of all the
        !           370: route filtering. To achieve that, the In and Out filters from the RA, RB and
        !           371: RC configurations must be converted into Import and Export policies in the
        !           372: route server.
        !           373: 
        !           374: This is a fragment of the route server configuration (we only show
        !           375: the policies for client RA):
        !           376: 
        !           377: @example
        !           378: # Configuration for Route Server ('RS')
        !           379: !
        !           380: hostname RS
        !           381: password ix
        !           382: !
        !           383: bgp multiple-instance
        !           384: !
        !           385: router bgp 65000 view RS
        !           386:   no bgp default ipv4-unicast
        !           387:   neighbor 2001:0DB8::A  remote-as 65001
        !           388:   neighbor 2001:0DB8::B  remote-as 65002
        !           389:   neighbor 2001:0DB8::C  remote-as 65003
        !           390: !
        !           391:   address-family ipv6
        !           392:     neighbor 2001:0DB8::A activate
        !           393:     neighbor 2001:0DB8::A route-server-client
        !           394:     neighbor 2001:0DB8::A route-map RSCLIENT-A-IMPORT import
        !           395:     neighbor 2001:0DB8::A route-map RSCLIENT-A-EXPORT export
        !           396:     neighbor 2001:0DB8::A soft-reconfiguration inbound
        !           397: 
        !           398:     neighbor 2001:0DB8::B activate
        !           399:     neighbor 2001:0DB8::B route-server-client
        !           400:     neighbor 2001:0DB8::B route-map RSCLIENT-B-IMPORT import
        !           401:     neighbor 2001:0DB8::B route-map RSCLIENT-B-EXPORT export
        !           402:     neighbor 2001:0DB8::B soft-reconfiguration inbound
        !           403: 
        !           404:     neighbor 2001:0DB8::C activate
        !           405:     neighbor 2001:0DB8::C route-server-client
        !           406:     neighbor 2001:0DB8::C route-map RSCLIENT-C-IMPORT import
        !           407:     neighbor 2001:0DB8::C route-map RSCLIENT-C-EXPORT export
        !           408:     neighbor 2001:0DB8::C soft-reconfiguration inbound
        !           409:   exit-address-family
        !           410: !
        !           411: ipv6 prefix-list COMMON-PREFIXES seq  5 permit 2001:0DB8:0000::/48 ge 64 le 64
        !           412: ipv6 prefix-list COMMON-PREFIXES seq 10 deny any
        !           413: !
        !           414: ipv6 prefix-list PEER-A-PREFIXES seq  5 permit 2001:0DB8:AAAA::/48 ge 64 le 64
        !           415: ipv6 prefix-list PEER-A-PREFIXES seq 10 deny any
        !           416: !
        !           417: ipv6 prefix-list PEER-B-PREFIXES seq  5 permit 2001:0DB8:BBBB::/48 ge 64 le 64
        !           418: ipv6 prefix-list PEER-B-PREFIXES seq 10 deny any
        !           419: !
        !           420: ipv6 prefix-list PEER-C-PREFIXES seq  5 permit 2001:0DB8:CCCC::/48 ge 64 le 64
        !           421: ipv6 prefix-list PEER-C-PREFIXES seq 10 deny any
        !           422: !
        !           423: route-map RSCLIENT-A-IMPORT permit 10
        !           424:   match peer 2001:0DB8::B
        !           425:   call A-IMPORT-FROM-B
        !           426: route-map RSCLIENT-A-IMPORT permit 20
        !           427:   match peer 2001:0DB8::C
        !           428:   call A-IMPORT-FROM-C
        !           429: !
        !           430: route-map A-IMPORT-FROM-B permit 10
        !           431:   match ipv6 address prefix-list COMMON-PREFIXES
        !           432:   set metric 100
        !           433: route-map A-IMPORT-FROM-B permit 20
        !           434:   match ipv6 address prefix-list PEER-B-PREFIXES
        !           435:   set community 65001:11111
        !           436: !
        !           437: route-map A-IMPORT-FROM-C permit 10
        !           438:   match ipv6 address prefix-list COMMON-PREFIXES
        !           439:   set metric 200
        !           440: route-map A-IMPORT-FROM-C permit 20
        !           441:   match ipv6 address prefix-list PEER-C-PREFIXES
        !           442:   set community 65001:22222
        !           443: !
        !           444: route-map RSCLIENT-A-EXPORT permit 10
        !           445:   match peer 2001:0DB8::B
        !           446:   match ipv6 address prefix-list PEER-A-PREFIXES
        !           447: route-map RSCLIENT-A-EXPORT permit 20
        !           448:   match peer 2001:0DB8::C
        !           449:   match ipv6 address prefix-list PEER-A-PREFIXES
        !           450: !
        !           451: ...
        !           452: ...
        !           453: ...
        !           454: @end example
        !           455: 
        !           456: If you compare the initial configuration of RA with the route server
        !           457: configuration above, you can see how easy it is to generate the Import and
        !           458: Export policies for RA from the In and Out route-maps of RA's original
        !           459: configuration.
        !           460: 
        !           461: When there was no route server, RA maintained two peerings, one with RB and
        !           462: another with RC. Each of this peerings had an In route-map configured. To
        !           463: build the Import route-map for client RA in the route server, simply add
        !           464: route-map entries following this scheme:
        !           465: 
        !           466: @example
        !           467: route-map <NAME> permit 10
        !           468:     match peer <Peer Address>
        !           469:     call <In Route-Map for this Peer>
        !           470: route-map <NAME> permit 20
        !           471:     match peer <Another Peer Address>
        !           472:     call <In Route-Map for this Peer>
        !           473: @end example
        !           474: 
        !           475: This is exactly the process that has been followed to generate the route-map
        !           476: RSCLIENT-A-IMPORT. The route-maps that are called inside it (A-IMPORT-FROM-B
        !           477: and A-IMPORT-FROM-C) are exactly the same than the In route-maps from the
        !           478: original configuration of RA (PEER-B-IN and PEER-C-IN), only the name is
        !           479: different.
        !           480: 
        !           481: The same could have been done to create the Export policy for RA (route-map
        !           482: RSCLIENT-A-EXPORT), but in this case the original Out route-maps where so
        !           483: simple that we decided not to use the @var{call WORD} commands, and we
        !           484: integrated all in a single route-map (RSCLIENT-A-EXPORT).
        !           485: 
        !           486: The Import and Export policies for RB and RC are not shown, but
        !           487: the process would be identical.
        !           488: 
        !           489: @node Further considerations about Import and Export route-maps
        !           490: @subsection Further considerations about Import and Export route-maps
        !           491: 
        !           492: The current version of the route server patch only allows to specify a
        !           493: route-map for import and export policies, while in a standard BGP speaker
        !           494: apart from route-maps there are other tools for performing input and output
        !           495: filtering (access-lists, community-lists, ...). But this does not represent
        !           496: any limitation, as all kinds of filters can be included in import/export
        !           497: route-maps. For example suppose that in the non-route-server scenario peer
        !           498: RA had the following filters configured for input from peer B:
        !           499: 
        !           500: @example
        !           501:     neighbor 2001:0DB8::B prefix-list LIST-1 in
        !           502:     neighbor 2001:0DB8::B filter-list LIST-2 in
        !           503:     neighbor 2001:0DB8::B route-map PEER-B-IN in
        !           504:     ...
        !           505:     ...
        !           506: route-map PEER-B-IN permit 10
        !           507:   match ipv6 address prefix-list COMMON-PREFIXES
        !           508:   set local-preference 100
        !           509: route-map PEER-B-IN permit 20
        !           510:   match ipv6 address prefix-list PEER-B-PREFIXES
        !           511:   set community 65001:11111
        !           512: @end example
        !           513: 
        !           514: It is posible to write a single route-map which is equivalent to
        !           515: the three filters (the community-list, the prefix-list and the
        !           516: route-map). That route-map can then be used inside the Import
        !           517: policy in the route server. Lets see how to do it:
        !           518: 
        !           519: @example
        !           520:     neighbor 2001:0DB8::A route-map RSCLIENT-A-IMPORT import
        !           521:     ...
        !           522: !
        !           523: ...
        !           524: route-map RSCLIENT-A-IMPORT permit 10
        !           525:   match peer 2001:0DB8::B
        !           526:   call A-IMPORT-FROM-B
        !           527: ...
        !           528: ...
        !           529: !
        !           530: route-map A-IMPORT-FROM-B permit 1
        !           531:   match ipv6 address prefix-list LIST-1
        !           532:   match as-path LIST-2
        !           533:   on-match goto 10
        !           534: route-map A-IMPORT-FROM-B deny 2
        !           535: route-map A-IMPORT-FROM-B permit 10
        !           536:   match ipv6 address prefix-list COMMON-PREFIXES
        !           537:   set local-preference 100
        !           538: route-map A-IMPORT-FROM-B permit 20
        !           539:   match ipv6 address prefix-list PEER-B-PREFIXES
        !           540:   set community 65001:11111
        !           541: !
        !           542: ...
        !           543: ...
        !           544: @end example
        !           545: 
        !           546: The route-map A-IMPORT-FROM-B is equivalent to the three filters
        !           547: (LIST-1, LIST-2 and PEER-B-IN). The first entry of route-map
        !           548: A-IMPORT-FROM-B (sequence number 1) matches if and only if both
        !           549: the prefix-list LIST-1 and the filter-list LIST-2 match. If that
        !           550: happens, due to the ``on-match goto 10'' statement the next
        !           551: route-map entry to be processed will be number 10, and as of that
        !           552: point route-map A-IMPORT-FROM-B is identical to PEER-B-IN. If
        !           553: the first entry does not match, `on-match goto 10'' will be
        !           554: ignored and the next processed entry will be number 2, which will
        !           555: deny the route.
        !           556: 
        !           557: Thus, the result is the same that with the three original filters,
        !           558: i.e., if either LIST-1 or LIST-2 rejects the route, it does not
        !           559: reach the route-map PEER-B-IN. In case both LIST-1 and LIST-2
        !           560: accept the route, it passes to PEER-B-IN, which can reject, accept
        !           561: or modify the route.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>