Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
bgp
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.rdoc

BGP4R

Build Status

Description

BGP4R is a ruby library which enables the creation and manipulation of BGP messages. In BGP4R, all well-known BGP constructs are defined in classes.

Using BGP4R, the process of building BGP messages becomes a simple matter of adding objects to their respective containers; i.e. an attribute is added to a Path_attribute container, while a Path_attribute object or Nlri object is added to an Update object.

A Neighbor class is used to describe a BGP peering adjacency.

A Neighbor instance can be started, stopped, and programmed to send BGP messages

Neighbor#start
Neighbor#stop
Neighbor#send_message

Neighbor capabilities such as MBGP or 4-byte AS can be set using Neighbor#capability

e.g.: 

 neighbor = Neighbor.new \
    :version=> 4, 
    :my_as=> 100, 
    :remote_addr => '192.168.1.200', 
    :id=> '1.1.1.1', 
    :holdtime=> 20

 neighbor.capability_mbgp_ipv4_unicast  
 neighbor.capability_mbgp_ipv4_multicast
 neighbor.capability_mbgp_ipv4_mpls_vpn_unicast
 neighbor.capability_mbgp_ipv6_mpls_vpn_multicast
 neighbor.capability_mbgp_nsap_mpls_vpn_unicast
 neighbor.capability_mbgp_nsap_unicast  
 neighbor.capability_route_refresh
 neighbor.capability_route_refresh 128  
 neighbor.capability_four_byte_as

Ruby classes representing BGP messages, attributes, and nlri

Messages:

Open
Update
Notification
Keepalive
Route_refresh

Attributes:

Origin
As_path
Next_hop
Local_pref
Multi_exit_disc
Communities
Atomic_aggregate
Aggregator
Originator_id
Cluster_list
Mp_reach
Mp_unreach
As4_path
As4_aggregator
Extended_communities

Update containers:

Nlri
Path_attribute
Withdrawn

Getting started

Here is an example illustrating how to use this API:

require 'bgp4r'
include BGP

Start loggin

Log.create
Log.level=Logger::DEBUG

Create a Neighbor:

neighbor = Neighbor.new \
  :version=> 4, 
  :my_as=> 100, 
  :remote_addr => '192.168.1.200', 
  :id=> '1.1.1.1', :holdtime=> 20

Set its capabilities:

neighbor.capability_mbgp_ipv4_unicast  
neighbor.capability_mbgp_ipv4_multicast
neighbor.capability_mbgp_ipv4_mpls_vpn_unicast
neighbor.capability_mbgp_ipv6_mpls_vpn_multicast
neighbor.capability_mbgp_nsap_mpls_vpn_unicast
neighbor.capability_mbgp_nsap_unicast  
neighbor.capability_route_refresh
neighbor.capability_route_refresh 128  
neighbor.capability_four_byte_as

Start peering:

neighbor.start :auto_retry=> true

Build an BGP Update object made up of a Path_attribute and a Nlri objects:

an_update = Update.new(
  Path_attribute.new(
    Origin.new(2),
    Next_hop.new('192.168.1.5'),
    Multi_exit_disc.new(100),
    Local_pref.new(100),
    As_path.new(400,300,200),
    Communities.new('1311:1 311:59 2805:64')
  ),
  Nlri.new('77.0.0.0/17', '78.0.0.0/18', '79.0.0.0/19')
)

Ship it!

neighbor.send_message an_update

Produces:

Jean-Michel-Esnaults-MacBook-Pro-17:bgp4r jme$ ruby bgp
I, [56:08#28463]  INFO -- : Open Socket old state Idle new state Active
I, [56:08#28463]  INFO -- : SendOpen
D, [56:08#28463] DEBUG -- : Send Open Message (1), length: 61
  Version 4, my AS 100, Holdtime 20s, ID 1.1.1.1
  Capability(65): 4-octet AS number: 100
  Option Capabilities Advertisement (2): [02020200]
    Route Refresh (2), length: 2
  Option Capabilities Advertisement (2): [02028000]
    Route Refresh (Cisco) (128), length: 2
  Option Capabilities Advertisement (2): [0206010400010001]
    Multiprotocol Extensions (1), length: 4
      AFI IPv4 (1), SAFI Unicast (1)
  Option Capabilities Advertisement (2): [0206010400010002]
    Multiprotocol Extensions (1), length: 4
      AFI IPv4 (1), SAFI Multicast (2)

0x0000: ffff ffff ffff ffff ffff ffff ffff ffff
0x0001: 003d 0104 0064 0014 0101 0101 2002 0641
0x0002: 0400 0000 6402 0202 0002 0280 0002 0601
0x0003: 0400 0100 0102 0601 0400 0100

D, [56:08#28463] DEBUG -- : #<BGP::IO::Input:0x40ab50> #<Thread:0x40a7b8> started
D, [56:08#28463] DEBUG -- : #<BGP::IO::Output:0x40ab14> #<Thread:0x40a754> started
I, [56:08#28463]  INFO -- : ev_send_open old state Active new state OpenSent
I, [56:08#28463]  INFO -- : RecvOpen
D, [56:08#28463] DEBUG -- : Recv Open Message (1), length: 61
  Version 4, my AS 100, Holdtime 180s, ID 2.2.2.2
  Option Capabilities Advertisement (2): [0206010400010001]
    Multiprotocol Extensions (1), length: 4
      AFI IPv4 (1), SAFI Unicast (1)
  Option Capabilities Advertisement (2): [0206010400010002]
    Multiprotocol Extensions (1), length: 4
      AFI IPv4 (1), SAFI Multicast (2)
  Option Capabilities Advertisement (2): [02028000]
    Route Refresh (Cisco) (128), length: 2
  Option Capabilities Advertisement (2): [02020200]
    Route Refresh (2), length: 2
  Capability(65): 4-octet AS number: 100

0x0000: ffff ffff ffff ffff ffff ffff ffff ffff
0x0001: 003d 0104 0064 00b4 0202 0202 2002 0601
0x0002: 0400 0100 0102 0601 0400 0100 0202 0280
0x0003: 0002 0202 0002 0641 0400 0000

I, [56:08#28463]  INFO -- : RecvOpen old state OpenSent new state OpenConfirm
I, [56:08#28463]  INFO -- : RecvKeepalive
D, [56:08#28463] DEBUG -- : Recv Keepalive Message (4), length: 19, [001304]

I, [56:08#28463]  INFO -- : SendKeepalive
D, [56:08#28463] DEBUG -- : Send Keepalive Message (4), length: 19, [001304]

D, [56:08#28463] DEBUG -- : SendKeepAlive
I, [56:08#28463]  INFO -- : RecvKeepAlive old state OpenConfirm new state Established
I, [56:08#28463]  INFO -- : RecvKeepalive
D, [56:08#28463] DEBUG -- : Recv Keepalive Message (4), length: 19, [001304]

I, [56:08#28463]  INFO -- : version: 4, id: 1.1.1.1, as: 100, holdtime: 20, peer addr: 192.168.1.200, local addr: 192.168.1.5 started
I, [56:08#28463]  INFO -- : SendUpdate
D, [56:08#28463] DEBUG -- : Send Update Message (2), 4 bytes AS, length: 92
  Path Attributes:
  Origin (1), length: 1, Flags [T]: incomplete
   0x0000: 
  Next Hop (3), length: 4, Flags [T]: 192.168.1.5
   0x0000: c0a8 0105
  Multi Exit Disc (4), length: 4, Flags [O]: (0x0064) 100
   0x0000: 0000 0064
  Local Pref (5), length: 4, Flags [T]: (0x0064) 100
   0x0000: 0000 0064
  As Path (2), length: 14, Flags [T]: 400 300 200
   0x0000: 0203 0000 0190 0000 012c 0000 00c8
  Communities (8), length: 12, Flags [OT]: 1311:1 311:59 2805:64
   0x0000: 051f 0001 0137 003b 0af5 0040
77.0.0.0/17
78.0.0.0/18
79.0.0.0/19

0x0000: ffff ffff ffff ffff ffff ffff ffff ffff
0x0001: 005c 0200 0000 3940 0101 0240 0304 c0a8
0x0002: 0105 8004 0400 0000 6440 0504 0000 0064
0x0003: 4002 0e02 0300 0001 9000 0001 2c00 0000
0x0004: c8c0 080c 051f 0001 0137 003b 0af5 0040
0x0005: 114d 0000 124e 0000 134f 0000

I, [56:13#28463]  INFO -- : RecvKeepalive
D, [56:13#28463] DEBUG -- : Recv Keepalive Message (4), length: 19, [001304]

I, [56:14#28463]  INFO -- : SendKeepalive
D, [56:14#28463] DEBUG -- : Send Keepalive Message (4), length: 19, [001304]

Source Code

Source code is hosted on github.

Installation

Install the gem

sudo gem install bgp4r

Requirements

License

BGP4R is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

BGP4R is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with BGP4R. If not, see <www.gnu.org/licenses/>.

About

BGP4R is a BGP-4 ruby library to create, send, and receive BGP messages in an object oriented manner.

Resources

License

Packages

No packages published

Languages

You can’t perform that action at this time.