MCAST-VPN Family

The BGP Multicast VPN(BGP MCAST-VPN) Multiprotocol extension can be used for MVPN auto-discovery, advertising MVPN to Inclusive P-Multicast Service Interface (I-PMSI) tunnel binding, advertising (C-S,C-G) to Selective PMSI (S-PMSI) tunnel binding, VPN customer multicast routing information exchange among Provider Edge routers (PEs), choosing a single forwarder PE, and for procedures in support of co-locating a Customer Rendezvous Point (C-RP) on a PE.

Configuration

This section shows a way to enable MCAST-VPN family in BGP speaker and peer configuration.

BGP Speaker

To enable MCAST-VPN support in BGP plugin, first configure BGP speaker instance:

URL: /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/protocols

Method: POST

Content-Type: application/xml

Request Body:

<protocol xmlns="http://openconfig.net/yang/network-instance">
    <name>bgp-example</name>
    <identifier xmlns:x="http://openconfig.net/yang/policy-types">x:BGP</identifier>
    <bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions">
        <global>
            <config>
                <router-id>192.0.2.2</router-id>
                <as>65000</as>
            </config>
            <afi-safis>
                <afi-safi>
                    <afi-safi-name>IPV4-MCAST-VPN</afi-safi-name>
                </afi-safi>
                <afi-safi>
                    <afi-safi-name>IPV6-MCAST-VPN</afi-safi-name>
                </afi-safi>
            </afi-safis>
        </global>
    </bgp>
</protocol>

BGP Peer

Here is an example for BGP peer configuration with enabled IPV4 MCAST-VPN family.

URL: /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types:BGP,bgp-example/bgp-openconfig-extensions:bgp/neighbors

Method: POST

Content-Type: application/xml

Request Body:

<neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions">
    <neighbor-address>192.0.2.1</neighbor-address>
    <afi-safis>
        <afi-safi>
            <afi-safi-name>IPV4-MCAST-VPN</afi-safi-name>
        </afi-safi>
    </afi-safis>
</neighbor>

Ipv4 MCAST-VPN Route API

Following tree illustrates the BGP MCAST-VPN route structure.

:(mvpn-routes-ipv4-case)
   +--ro mvpn-routes-ipv4
      +--ro mvpn-route* [route-key path-id]
         +--ro (mvpn-choice)
            +--:(intra-as-i-pmsi-a-d-case)
            |  +--ro intra-as-i-pmsi-a-d
            +--:(inter-as-i-pmsi-a-d-case)
            |  +--ro inter-as-i-pmsi-a-d
            |     +--ro source-as    inet:as-number
            +--:(s-pmsi-a-d-case)
            |  +--ro s-pmsi-a-d
            |     +--ro multicast-source             inet:ip-address
            |     +--ro (multicast-group)?
            |        +--:(c-g-address-case)
            |        |  +--ro c-g-address?           inet:ip-address
            |        +--:(ldp-mp-opaque-value-case)
            |           +--ro ldp-mp-opaque-value
            |              +--ro opaque-type             uint8
            |              +--ro opaque-extended-type?   uint16
            |              +--ro opaque                  yang:hex-string
            +--:(leaf-a-d-case)
            |  +--ro leaf-a-d
            |     +--ro (leaf-a-d-route-key)
            |        +--:(inter-as-i-pmsi-a-d-case)
            |        |  +--ro inter-as-i-pmsi-a-d
            |        |     +--ro source-as    inet:as-number
            |        +--:(s-pmsi-a-d-case)
            |           +--ro s-pmsi-a-d
            |              +--ro multicast-source             inet:ip-address
            |              +--ro (multicast-group)?
            |                 +--:(c-g-address-case)
            |                 |  +--ro c-g-address?           inet:ip-address
            |                 +--:(ldp-mp-opaque-value-case)
            |                    +--ro ldp-mp-opaque-value
            |                       +--ro opaque-type             uint8
            |                       +--ro opaque-extended-type?   uint16
            |                       +--ro opaque                  yang:hex-string
            +--:(source-active-a-d-case)
            |  +--ro source-active-a-d
            |     +--ro multicast-source    inet:ip-address
            |     +--ro multicast-group     inet:ip-address
            +--:(shared-tree-join-case)
            |  +--ro shared-tree-join
            |     +--ro c-multicast
            |        +--ro multicast-source             inet:ip-address
            |        +--ro source-as                    inet:as-number
            |        +--ro (multicast-group)?
            |           +--:(c-g-address-case)
            |           |  +--ro c-g-address?           inet:ip-address
            |           +--:(ldp-mp-opaque-value-case)
            |              +--ro ldp-mp-opaque-value
            |                 +--ro opaque-type             uint8
            |                 +--ro opaque-extended-type?   uint16
            |                 +--ro opaque                  yang:hex-string
            +--:(source-tree-join-case)
               +--ro source-tree-join
                  +--ro c-multicast
                     +--ro multicast-source             inet:ip-address
                     +--ro source-as                    inet:as-number
                     +--ro (multicast-group)?
                        +--:(c-g-address-case)
                        |  +--ro c-g-address?           inet:ip-address
                        +--:(ldp-mp-opaque-value-case)
                           +--ro ldp-mp-opaque-value
                              +--ro opaque-type             uint8
                              +--ro opaque-extended-type?   uint16
                              +--ro opaque                  yang:hex-string
                  ...

Ipv6 MCAST-VPN Route API

Following tree illustrates the BGP MCAST-VPN route structure.

:(mvpn-routes-ipv6-case)
   +--ro mvpn-routes-ipv6
      +--ro mvpn-route* [route-key path-id]
         +--ro (mvpn-choice)
            +--:(intra-as-i-pmsi-a-d-case)
            |  +--ro intra-as-i-pmsi-a-d
            +--:(inter-as-i-pmsi-a-d-case)
            |  +--ro inter-as-i-pmsi-a-d
            |     +--ro source-as    inet:as-number
            +--:(s-pmsi-a-d-case)
            |  +--ro s-pmsi-a-d
            |     +--ro multicast-source             inet:ip-address
            |     +--ro (multicast-group)?
            |        +--:(c-g-address-case)
            |        |  +--ro c-g-address?           inet:ip-address
            |        +--:(ldp-mp-opaque-value-case)
            |           +--ro ldp-mp-opaque-value
            |              +--ro opaque-type             uint8
            |              +--ro opaque-extended-type?   uint16
            |              +--ro opaque                  yang:hex-string
            +--:(leaf-a-d-case)
            |  +--ro leaf-a-d
            |     +--ro (leaf-a-d-route-key)
            |        +--:(inter-as-i-pmsi-a-d-case)
            |        |  +--ro inter-as-i-pmsi-a-d
            |        |     +--ro source-as    inet:as-number
            |        +--:(s-pmsi-a-d-case)
            |           +--ro s-pmsi-a-d
            |              +--ro multicast-source             inet:ip-address
            |              +--ro (multicast-group)?
            |                 +--:(c-g-address-case)
            |                 |  +--ro c-g-address?           inet:ip-address
            |                 +--:(ldp-mp-opaque-value-case)
            |                    +--ro ldp-mp-opaque-value
            |                       +--ro opaque-type             uint8
            |                       +--ro opaque-extended-type?   uint16
            |                       +--ro opaque                  yang:hex-string
            +--:(source-active-a-d-case)
            |  +--ro source-active-a-d
            |     +--ro multicast-source    inet:ip-address
            |     +--ro multicast-group     inet:ip-address
            +--:(shared-tree-join-case)
            |  +--ro shared-tree-join
            |     +--ro c-multicast
            |        +--ro multicast-source             inet:ip-address
            |        +--ro source-as                    inet:as-number
            |        +--ro (multicast-group)?
            |           +--:(c-g-address-case)
            |           |  +--ro c-g-address?           inet:ip-address
            |           +--:(ldp-mp-opaque-value-case)
            |              +--ro ldp-mp-opaque-value
            |                 +--ro opaque-type             uint8
            |                 +--ro opaque-extended-type?   uint16
            |                 +--ro opaque                  yang:hex-string
            +--:(source-tree-join-case)
               +--ro source-tree-join
                  +--ro c-multicast
                     +--ro multicast-source             inet:ip-address
                     +--ro source-as                    inet:as-number
                     +--ro (multicast-group)?
                        +--:(c-g-address-case)
                        |  +--ro c-g-address?           inet:ip-address
                        +--:(ldp-mp-opaque-value-case)
                           +--ro ldp-mp-opaque-value
                              +--ro opaque-type             uint8
                              +--ro opaque-extended-type?   uint16
                              +--ro opaque                  yang:hex-string
                  ...

Usage

The Ipv4 Multicast VPN table in an instance of the speaker’s Loc-RIB can be verified via REST:

URL: /rests/data/bgp-rib:bgp-rib/rib=bgp-example/loc-rib/tables=bgp-types:ipv4-address-family,bgp-mvpn:mcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes?content=nonconfig

Method: GET

Response Body:

<mvpn-routes xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4">
   <mvpn-route>
      <route-key>flow1</route-key>
      <path-id>0</path-id>
      <intra-as-i-pmsi-a-d>
         <route-distinguisher>172.16.0.44:101</route-distinguisher>
         <orig-route-ip>192.168.100.1</orig-route-ip>
      </intra-as-i-pmsi-a-d>
      <attributes>
         <ipv4-next-hop>
            <global>199.20.166.41</global>
         </ipv4-next-hop>
         <as-path/>
         <origin>
            <value>igp</value>
         </origin>
      </attributes>
   </mvpn-route>
</mvpn-routes>

The Ipv6 Multicast VPN table in an instance of the speaker’s Loc-RIB can be verified via REST:

URL: /rests/data/bgp-rib:bgp-rib/rib=bgp-example/loc-rib/tables=bgp-types:ipv4-address-family,bgp-mvpn:mcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes?content=nonconfig

Method: GET

Response Body:

<mvpn-routes xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv6">
   <mvpn-route>
      <route-key>flow1</route-key>
      <path-id>0</path-id>
      <intra-as-i-pmsi-a-d>
         <route-distinguisher>172.16.0.44:101</route-distinguisher>
         <orig-route-ip>192.168.100.1</orig-route-ip>
      </intra-as-i-pmsi-a-d>
      <attributes>
         <ipv6-next-hop>
            <global>2001:db8:1::6</global>
         </ipv6-next-hop>
         <as-path/>
         <origin>
            <value>igp</value>
         </origin>
      </attributes>
   </mvpn-route>
</mvpn-routes>

Programming

These examples show how to originate and remove MCAST-VPN routes via programmable RIB. There are seven different types of MCAST-VPN routes, and multiples extended communities. Routes can be used for variety of use-cases supported by BGP/MPLS MCAST-VPN. Make sure the Application Peer is configured first.

URL: /rests/data/bgp-rib:application-rib/10.25.1.9/tables=bgp-types:ipv4-address-family,bgp-mvpn:mcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes

Method: POST

Content-Type: application/xml

Request Body:

 1<mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4">
 2   <route-key>mvpn</route-key>
 3   <path-id>0</path-id>
 4   <intra-as-i-pmsi-a-d>
 5      <route-distinguisher>172.16.0.44:101</route-distinguisher>
 6      <orig-route-ip>192.168.100.1</orig-route-ip>
 7   </intra-as-i-pmsi-a-d>
 8   ....
 9   <attributes>
10      <ipv4-next-hop>
11         <global>199.20.166.41</global>
12      </ipv4-next-hop>
13      <as-path/>
14      <origin>
15         <value>igp</value>
16      </origin>
17      <extended-communities>
18         ....
19      </extended-communities>
20   </attributes>
21</mvpn-route>

@line 4: One of the MCAST-VPN route must be set here.

@line 15: In some cases, specific extended community presence is required.


MVPN Routes:

  • Intra-AS I-PMSI A-D

<intra-as-i-pmsi-a-d>
    <route-distinguisher>0:5:3</route-distinguisher>
    <orig-route-ip>10.10.10.10</orig-route-ip>
</intra-as-i-pmsi-a-d>
  • Inter-AS I-PMSI A-D

<inter-as-i-pmsi-a-d>
    <route-distinguisher>1.2.3.4:258</route-distinguisher>
    <source-as>64496</source-as>
</inter-as-i-pmsi-a-d>
  • S-PMSI A-D

<s-pmsi-a-d>
    <route-distinguisher>1.2.3.4:258</route-distinguisher>
    <multicast-source>10.0.0.10</multicast-source>
    <c-g-address>12.0.0.12</c-g-address>
    <orig-route-ip>1.0.0.1</orig-route-ip>
</s-pmsi-a-d>
<s-pmsi-a-d>
    <route-distinguisher>1.2.3.4:258</route-distinguisher>
    <multicast-source>10.0.0.10</multicast-source>
    <ldp-mp-opaque-value>
        <opaque-type>1</opaque-type>
        <opaque-extended-type>0</opaque-extended-type>
        <opaque>das75das48bvxc</opaque>
    </ldp-mp-opaque-value>
    <orig-route-ip>1.0.0.1</orig-route-ip>
</s-pmsi-a-d>
  • Leaf A-D

<leaf-a-d>
    <inter-as-i-pmsi-a-d>
        <route-distinguisher>1.2.3.4:258</route-distinguisher>
        <source-as>1</source-as>
    </inter-as-i-pmsi-a-d>
    <orig-route-ip>1.0.0.1</orig-route-ip>
</leaf-a-d>
<leaf-a-d>
    <s-pmsi-a-d>
        <route-distinguisher>1.2.3.4:258</route-distinguisher>
        <multicast-source>10.0.0.10</multicast-source>
        <ldp-mp-opaque-value>
            <opaque-type>1</opaque-type>
            <opaque-extended-type>0</opaque-extended-type>
            <opaque>das75das48bvxc</opaque>
        </ldp-mp-opaque-value>
        <orig-route-ip>1.0.0.1</orig-route-ip>
    </s-pmsi-a-d>
    <orig-route-ip>1.0.0.1</orig-route-ip>
</leaf-a-d>
  • Source Active A-D

<source-active-a-d>
    <route-distinguisher>1.2.3.4:258</route-distinguisher>
    <multicast-source>1.0.0.1</multicast-source>
    <multicast-group>2.0.0.2</multicast-group>
</source-active-a-d>
  • Shared Tree Join

<shared-tree-join>
    <c-multicast>
       <route-distinguisher>1.2.3.4:258</route-distinguisher>
       <source-as>64415</source-as>
       <multicast-source>1.0.0.1</multicast-source>
       <c-g-address>2.0.0.2</c-g-address>
    </c-multicast>
</shared-tree-join>
<shared-tree-join>
    <c-multicast>
       <route-distinguisher>1.2.3.4:258</route-distinguisher>
       <source-as>64415</source-as>
       <multicast-source>1.0.0.1</multicast-source>
       <ldp-mp-opaque-value>
           <opaque-type>1</opaque-type>
           <opaque-extended-type>0</opaque-extended-type>
           <opaque>das75das48bvxc</opaque>
       </ldp-mp-opaque-value>
    </c-multicast>
</shared-tree-join>
  • Source Tree Join

<source-tree-join>
    <c-multicast>
        <route-distinguisher>1.2.3.4:258</route-distinguisher>
        <source-as>64415</source-as>
        <multicast-source>1.0.0.1</multicast-source>
        <c-g-address>2.0.0.2</c-g-address>
    </c-multicast>
</source-tree-join>
<source-tree-join>
    <c-multicast>
        <route-distinguisher>1.2.3.4:258</route-distinguisher>
        <source-as>64415</source-as>
        <multicast-source>1.0.0.1</multicast-source>
        <ldp-mp-opaque-value>
            <opaque-type>1</opaque-type>
            <opaque-extended-type>0</opaque-extended-type>
            <opaque>das75das48bvxc</opaque>
        </ldp-mp-opaque-value>
    </c-multicast>
</source-tree-join>

Attributes:

PSMI Attribute

  • P-Multicast Service Interface Tunnel (PMSI) attribute:

    • RSVP-TE P2MP LSP

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <rsvp-te-p2mp-lsp>
            <p2mp-id>1111111111</p2mp-id>
            <tunnel-id>11111</tunnel-id>
            <extended-tunnel-id>10.10.10.10</extended-tunnel-id>
        </rsvp-te-p2mp-lsp>
    </pmsi-tunnel>
    
    • mLDP P2MP LSP

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <mldp-p2mp-lsp>
            <address-family xmlns:x="urn:opendaylight:params:xml:ns:yang:bgp-types">x:ipv4-address-family</address-family>
            <root-node-address>10.10.10.10</root-node-address>
            <opaque-value>
                <opaque-type>255</opaque-type>
                <opaque-extended-type>11111</opaque-extended-type>
                <opaque>aa:aa:aa</opaque>
            </opaque-value>
        </mldp-p2mp-lsp>
    </pmsi-tunnel>
    
    • PIM-SSM Tree

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <pim-ssm-tree>
            <p-address>11.12.13.14</p-address>
            <p-multicast-group>10.10.10.10</p-multicast-group>
        </pim-ssm-tree>
    </pmsi-tunnel>
    
    • PIM-SM Tree

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <pim-sm-tree>
            <p-address>1.0.0.1</p-address>
            <p-multicast-group>10.10.10.10</p-multicast-group>
        </pim-sm-tree>
    </pmsi-tunnel>
    
    • BIDIR-PIM Tree

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <bidir-pim-tree>
            <p-address>1.0.0.1</p-address>
            <p-multicast-group>10.10.10.10</p-multicast-group>
        </bidir-pim-tree>
    </pmsi-tunnel>
    
    • Ingress Replication

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <ingress-replication>
            <receiving-endpoint-address>172.12.123.3</receiving-endpoint-address>
        </ingress-replication>
    </pmsi-tunnel>
    
    • mLDP MP2MP LSP

    <pmsi-tunnel>
        <leaf-information-required>true</leaf-information-required>
        <mpls-label>20024</mpls-label>
        <mldp-mp2mp-lsp>
            <opaque-type>255</opaque-type>
            <opaque-extended-type>11111</opaque-extended-type>
            <opaque>aa:aa</opaque>
        </mldp-mp2mp-lsp>
    </pmsi-tunnel>
    
  • PE Distinguisher Labels Attribute

<pe-distinguisher-labels-attribute>
    <pe-distinguisher-label-attribute>
        <pe-address>10.10.10.1</pe-address>
        <mpls-label>20024</mpls-label>
    </pe-distinguisher-label-attribute>
    <pe-distinguisher-label-attribute>
        <pe-address>10.10.20.2</pe-address>
        <mpls-label>20028</mpls-label>
    </pe-distinguisher-label-attribute>
</pe-distinguisher-labels-attribute>

Extended Communities:

  • Source AS Extended Community

<extended-communities>
    <transitive>true</transitive>
    <source-as-extended-community>
        <global-administrator>65</global-administrator>
    </source-as-extended-community>
</extended-communities>
  • Source AS 4 Octets Extended Community

<extended-communities>
    <transitive>true</transitive>
    <source-as-4-extended-community>
        <global-administrator>65555</global-administrator>
    </source-as-4-extended-community>
</extended-communities>
  • ES-Import Route Target

<extended-communities>
    <transitive>true</transitive>
    <vrf-route-import-extended-community>
        <inet4-specific-extended-community-common>
            <global-administrator>10.0.0.1</global-administrator>
            <local-administrator>123=</local-administrator>
        </inet4-specific-extended-community-common>
    </vrf-route-import-extended-community>
</extended-communities>

To remove the route added above, following request can be used:

URL: /rests/data/bgp-rib:application-rib/10.25.1.9/tables=bgp-types:ipv4-address-family,bgp-mvpn:mcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes/mvpn-route/mvpn/0

Method: DELETE

References