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: /restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance: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: /restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/bgp-example/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: /restconf/operational/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

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: /restconf/operational/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

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: /restconf/config/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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4">
   <route-key>mvpn</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>
        <extended-communities>
        ....
        </extended-communities>
    </attributes>
</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: /restconf/config/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