Date created: Tuesday, October 4, 2016 5:24:54 PM. Last modified: Friday, January 13, 2017 11:44:03 AM
Example 2, Public Peering using OpenConfig (JSON over gRPC)
This example script requires the ID of a peering LAN from PeeringDB. It will then query the PeeringDB for all networks on that LAN and build up the OpenConfig BGP configuration to push to a network device to configure a peering sessions with all the peers on that IX peering LAN (it will serialise it to JSON and push over gRPC).
These OpenConf YANG modules need to be compiled using PyangBind for this example:
bensley@ubuntu-laptop:~/Python/pyb_xml/openconfig$ pyang --plugindir /usr/local/lib/python2.7/dist-packages/pyangbind/plugin -f pybind -o openconfig-bgp.py *.yang bensley@ubuntu-laptop:~/Python/pyb_xml/openconfig$ ls -lh total 23M -rw-rw-r-- 1 bensley bensley 17K Nov 4 11:29 ietf-inet-types.yang -rw-rw-r-- 1 bensley bensley 24K Nov 4 11:30 ietf-interfaces.yang -rw-rw-r-- 1 bensley bensley 18K Nov 4 11:29 ietf-yang-types.yang -rw-rw-r-- 1 bensley bensley 12K Nov 4 11:10 openconfig-bgp-common-multiprotocol.yang -rw-rw-r-- 1 bensley bensley 4.5K Nov 4 11:11 openconfig-bgp-common-structure.yang -rw-rw-r-- 1 bensley bensley 17K Nov 4 11:11 openconfig-bgp-common.yang -rw-rw-r-- 1 bensley bensley 6.6K Nov 4 11:11 openconfig-bgp-global.yang -rw-rw-r-- 1 bensley bensley 18K Nov 4 11:14 openconfig-bgp-neighbor.yang -rw-rw-r-- 1 bensley bensley 6.4K Nov 4 11:16 openconfig-bgp-peer-group.yang -rw-rw-r-- 1 bensley bensley 29K Nov 4 11:17 openconfig-bgp-policy.yang -rw-rw-r-- 1 bensley bensley 23M Nov 4 11:30 openconfig-bgp.py -rw-rw-r-- 1 bensley bensley 12K Nov 4 11:17 openconfig-bgp-types.yang -rw-rw-r-- 1 bensley bensley 3.1K Nov 4 11:17 openconfig-bgp.yang -rw-rw-r-- 1 bensley bensley 2.1K Nov 4 11:24 openconfig-extensions.yang -rw-rw-r-- 1 bensley bensley 29K Nov 4 11:30 openconfig-interfaces.yang -rw-rw-r-- 1 bensley bensley 4.3K Nov 4 11:24 openconfig-policy-types.yang -rw-rw-r-- 1 bensley bensley 28K Nov 4 11:24 openconfig-routing-policy.ya
The script will generate the config for IPv4 and IPv6 sessions only for networks with an open peering policy. The final OpenConfig configuration is printed to the screen in JSON format and pushed to a Cisco IOS-XRv 6.2.1 device using Cisco's gRPC python client, for networks with a restrictive peering policy their details are printed so that they may be contacted. There is a caveat with this script (as its just a PoC) that if a network has two or more peering sessions to an IXP only one session is configured per network. Also note that when run against a very large exchange like the LINX London (Juniper / LON1) exchange, the script will take at least 5 minutes to run:
# Version 2.3 - 2016-11 - jwbensley gmail com # Pre-reqs: # # Cisco gRPC Client is here: # https://github.com/cisco-grpc-connection-libs/ios-xr-grpc-python # # pip install pyangbind # # Pyangbind compiled OpenConfig BGP YANG models: # https://github.com/openconfig/public/tree/master/release/models/bgp # plus IETF dependencies: ietf-inet-types.yang, ietf-interfaces.yang # and ietf-yang-types.yang # # OpenConfig modules compiled from here: # https://github.com/openconfig/public/tree/master/release/models import sys import urllib2 import json import copy from collections import OrderedDict import pyangbind.lib.pybindJSON as pybindJSON from openconfig_bgp import openconfig_bgp from grpc.framework.interfaces.face.face import AbortionError sys.path.insert(0, 'ios-xr-grpc-python-master/lib/') from cisco_grpc_client import CiscoGRPCClient default_v4_max = 100 # Default max v4 & v6 prefixes default_v6_max = 100 default_shutdown_pct = 90 # Percent at which BGP session shutsdown default_restart_timer = 1 # Default restart timer after shutdown (minutes) default_v4_pg = "public_v4_peers" # Default BGP peer groups default_v6_pg = "public_v6_peers" default_v4_in_pol = "public_v4_peering_ingress" # Default routing policies default_v4_out_pol = "public_v4_peering_egress" # These are not being used default_v6_in_pol = "public_v6_peering_ingress" # here, the peer groups are default_v6_out_pol = "public_v6_peering_egress" # instead. class PeeringDB: def get_ixlan_id(self, ix_id): self.http_object = urllib2.urlopen("https://peeringdb.com/api/ix/%s" % ix_id) self.json_dict = json.load(self.http_object) return self.json_dict["data"][0]["ixlan_set"][0]["id"] def get_ixlan(self, ixlan_id): self.http_object = urllib2.urlopen("https://peeringdb.com/api/ixlan/%s" % ixlan_id) self.json_dict = json.load(self.http_object) return self.json_dict["data"][0]["net_set"] def get_ip_addrs(self, network): self.http_object = urllib2.urlopen("https://peeringdb.com/api/net/%s" % network["id"]) self.json_dict = json.load(self.http_object) self.netixlan_set = self.json_dict["data"][0]["netixlan_set"] for self.netixlan in self.netixlan_set: if self.netixlan["ix_id"] == ix_id: network["ipaddr4"] = self.netixlan["ipaddr4"] network["ipaddr6"] = self.netixlan["ipaddr6"] return def get_net_pocs(self, network_id): self.http_object = urllib2.urlopen("https://peeringdb.com/api/net/%s" % network_id) self.json_dict = json.load(self.http_object) return self.json_dict["data"][0]["poc_set"] class IXPPeers: def __init__(self): self.open_networks = {} # E.g 5102 is Vostron self.restrictive_networks = {} # E.g 14 is GTT self.oc_bgp = openconfig_bgp() def enumerate_ixlan(self): for network in ixlan: if ((network["policy_general"] == "Open") or (network["policy_general"] == "Selective"))\ and network["policy_ratio"] == 0: # The IPv4/6 address for this network on this LAN needs to be # pulled from the full net object peeringdb.get_ip_addrs(network) if (network["info_prefixes4"] == None) or (network["info_prefixes4"] == 0): network["info_prefixes4"] = default_v4_max if (network["info_prefixes6"] == None) or (network["info_prefixes4"] == 0): network["info_prefixes6"] = default_v6_max self.open_networks[len(self.open_networks)] = network # Restrictive peering network else: # We need to grab the full network object because the network # objects in the ixlan because net_set are missing the # point-of-contact details self.restrictive_networks[len(self.restrictive_networks)] = network self.restrictive_networks[len(self.restrictive_networks)-1]["poc_set"] = peeringdb.get_net_pocs(network["id"]) def generate_oc_bgp(self): if (len(self.open_networks) == 0): print "None.\n" return for key, network in self.open_networks.items(): if network["ipaddr4"] not in self.oc_bgp.bgp.neighbors.neighbor: self.oc_bgp.bgp.neighbors.neighbor.add(network["ipaddr4"]) self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.neighbor_address = network["ipaddr4"] self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.description = network["name"] self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.peer_as = network["asn"] # NOT SUPPORTED ON IOS-XRv 6.2.1 ? #self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.enabled = "true" # NOT SUPPORTED ON IOS-XRv 6.2.1 ? #self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.remove_private_as = "PRIVATE_AS_REMOVE_ALL" # NOT SUPPORTED ON IOS-XRv 6.2.1 ? #self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.peer_type = "EXTERNAL" self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].config.peer_group = default_v4_pg self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].afi_safis.afi_safi.add("openconfig-bgp-types:IPV4_UNICAST") self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].afi_safis.afi_safi["openconfig-bgp-types:IPV4_UNICAST"].config.afi_safi_name = "IPV4_UNICAST" self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].afi_safis.afi_safi["openconfig-bgp-types:IPV4_UNICAST"].config.enabled = "true" self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].afi_safis.afi_safi["openconfig-bgp-types:IPV4_UNICAST"].ipv4_unicast.prefix_limit.config.max_prefixes = network["info_prefixes4"] self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].afi_safis.afi_safi["openconfig-bgp-types:IPV4_UNICAST"].ipv4_unicast.prefix_limit.config.shutdown_threshold_pct = default_shutdown_pct self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr4"]].afi_safis.afi_safi["openconfig-bgp-types:IPV4_UNICAST"].ipv4_unicast.prefix_limit.config.restart_timer = default_restart_timer if (network["info_ipv6"] == 1 and network["ipaddr6"] != None): if network["ipaddr6"] not in self.oc_bgp.bgp.neighbors.neighbor: self.oc_bgp.bgp.neighbors.neighbor.add(network["ipaddr6"]) self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.neighbor_address = network["ipaddr6"] self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.description = network["name"] self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.peer_as = network["asn"] # NOT SUPPORTED ON IOS-XRv 6.2.1 ? #self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.enabled = "true" # NOT SUPPORTED ON IOS-XRv 6.2.1 ? #self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.remove_private_as = "PRIVATE_AS_REMOVE_ALL" # NOT SUPPORTED ON IOS-XRv 6.2.1 ? #self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.peer_type = "EXTERNAL" self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].config.peer_group = default_v6_pg self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].afi_safis.afi_safi.add("openconfig-bgp-types:IPV6_UNICAST") self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].afi_safis.afi_safi["openconfig-bgp-types:IPV6_UNICAST"].config.afi_safi_name = "openconfig-bgp-types:IPV6_UNICAST" self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].afi_safis.afi_safi["openconfig-bgp-types:IPV6_UNICAST"].config.enabled = "true" self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].afi_safis.afi_safi["openconfig-bgp-types:IPV6_UNICAST"].ipv6_unicast.prefix_limit.config.max_prefixes = network["info_prefixes6"] self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].afi_safis.afi_safi["openconfig-bgp-types:IPV6_UNICAST"].ipv6_unicast.prefix_limit.config.shutdown_threshold_pct = default_shutdown_pct self.oc_bgp.bgp.neighbors.neighbor[network["ipaddr6"]].afi_safis.afi_safi["openconfig-bgp-types:IPV6_UNICAST"].ipv6_unicast.prefix_limit.config.restart_timer = default_restart_timer def serialise_openconf_to_dict(self): # PyandBind will serialise to IEFT JSON.. self.openconfig_json = json.loads(pybindJSON.dumps(self.oc_bgp, mode="ietf")) ''' Two issues are now present: Firstly some of the syntax of the serialised JOSN is not accepted by IOS-XRv. Some of the OpenConfig BGP type definitions are using upper-case and IOS-XRv only seems to support lower case, for example "IPV4_UNICAST" AFI/SAFI must be "ipv4-unicast". Also the "restart-timer" is a float value in the OpenConfig type defs so ater being serialised from OC object to JSON the int is converted to a float, IOS-XRv wants an int so it is re-set below. ''' for neighbor in self.openconfig_json["openconfig-bgp:bgp"]["neighbors"]["neighbor"]: if "afi-safi-name" in neighbor["afi-safis"]["afi-safi"][0]: if neighbor["afi-safis"]["afi-safi"][0]["afi-safi-name"] == "openconfig-bgp-types:IPV4_UNICAST": neighbor["afi-safis"]["afi-safi"][0]["afi-safi-name"] = "openconfig-bgp-types:ipv4-unicast" elif neighbor["afi-safis"]["afi-safi"][0]["afi-safi-name"]=="openconfig-bgp-types:IPV6_UNICAST": neighbor["afi-safis"]["afi-safi"][0]["afi-safi-name"] = "openconfig-bgp-types:ipv6-unicast" if "afi-safi-name" in neighbor["afi-safis"]["afi-safi"][0]["config"]: if neighbor["afi-safis"]["afi-safi"][0]["config"]["afi-safi-name"]=="openconfig-bgp-types:IPV4_UNICAST": neighbor["afi-safis"]["afi-safi"][0]["config"]["afi-safi-name"] = "openconfig-bgp-types:ipv4-unicast" elif neighbor["afi-safis"]["afi-safi"][0]["config"]["afi-safi-name"]=="openconfig-bgp-types:openconfig-bgp-types:IPV6_UNICAST": neighbor["afi-safis"]["afi-safi"][0]["config"]["afi-safi-name"] = "openconfig-bgp-types:ipv6-unicast" if "ipv4-unicast" in neighbor["afi-safis"]["afi-safi"][0]: if "restart-timer" in neighbor["afi-safis"]["afi-safi"][0]["ipv4-unicast"]["prefix-limit"]["config"]: neighbor["afi-safis"]["afi-safi"][0]["ipv4-unicast"]["prefix-limit"]["config"]["restart-timer"] = default_restart_timer if "ipv6-unicast" in neighbor["afi-safis"]["afi-safi"][0]: if "restart-timer" in neighbor["afi-safis"]["afi-safi"][0]["ipv6-unicast"]["prefix-limit"]["config"]: neighbor["afi-safis"]["afi-safi"][0]["ipv6-unicast"]["prefix-limit"]["config"]["restart-timer"] = default_restart_timer ''' The second issue is that dict's are unordered and IOS-XRv wants the data in a specific order, so we need to re-order part of the dict, the "afi-safis" section: ''' unsorted_afi_safis = copy.deepcopy(neighbor["afi-safis"]["afi-safi"][0]) sorted_afi_safis = OrderedDict(sorted(unsorted_afi_safis.items(), key=lambda t: t[0])) neighbor["afi-safis"]["afi-safi"][0].clear() neighbor["afi-safis"]["afi-safi"][0] = copy.deepcopy(sorted_afi_safis) # Absolute filth ^ return self.openconfig_json def print_restricted_peers(self): if (len(self.restrictive_networks) == 0): print "None.\n" return for key, network in peers.restrictive_networks.items(): print ("Name: {}\n" "ASN: {}\n" "Policy: {}\n" "Policy Ratio: {}\n" "Policy Locations: {}\n" "Policy URL: {}\n" "Policy Contracts: {}\n". format(network["name"].encode('utf-8'), network["asn"], network["policy_general"], network["policy_ratio"], network["policy_locations"], network["policy_url"], network["policy_contracts"]) ) for poc in network["poc_set"]: print ("Role: {}\n" "Name: {}\n" "Phone: {}\n" "Email: {}\n" "URL: {}\n". format(poc["role"], poc["name"].encode('utf-8'), poc["phone"], poc["email"], poc["url"]) ) print "\n" class gRPCOperations: def connect(self): creds = open('IOS-XRv621-grpc.pem').read() options = 'ems.cisco.com' self.client = CiscoGRPCClient('127.0.0.1', 57777, 10, 'vagrant', 'vagrant', creds, options) def get_bgp_config(self): path = '{"bgp:bgp": [null]}' try: err, result = self.client.getconfig(path) if err: print err print json.dumps(json.loads(result), indent=4) except AbortionError: print "Unable to connect to gRPC server" def merge_config_json(self, json_config): try: response = self.client.mergeconfig(json_config) if response.errors: err = json.loads(response.errors) print err raise SystemExit except AbortionError: print "Unable to connect to gRPC server" if __name__ == "__main__": # E.g 1016 is LINX IXCardiff LAN if (len(sys.argv) < 2 or (len(sys.argv) == 2 and int(sys.argv[1]) < 1) ): print "Missing peeringDB IX ID\n" raise SystemExit # Set up ... ix_id = int(sys.argv[1]) peeringdb = PeeringDB() peers = IXPPeers() grpc_client = gRPCOperations() # Call the peeringDB API to get the ixlan object based on ID ixlan_id = peeringdb.get_ixlan_id(int(sys.argv[1])) ixlan = peeringdb.get_ixlan(ixlan_id) # Enumerate open peering networks on the ixlan peers.enumerate_ixlan() # Populate the OpenConfig YANG modules to create BGP sessions with each open peer peers.generate_oc_bgp() # Serialise the OpenConfig data to JSON print "Open peering networks:" json_config = peers.serialise_openconf_to_dict() print json.dumps(json_config, indent=4),"\n" # Send OpenConfig data to the device serialised as JSON over gRPC transport grpc_client.connect() print "Running BGP config before:" grpc_client.get_bgp_config() print "\n" grpc_client.merge_config_json(json.dumps(json_config)) print "Running BGP config after:" grpc_client.get_bgp_config() print "\n" # Print out contact details for restrictive peers print "Restrictive peering networks:" peers.print_restricted_peers()
bensley@ubuntu-laptop:~/Python/pyb_oc$ python peeringdb-example-2.3.py 40 Open peering networks: { "openconfig-bgp:bgp": { "neighbors": { "neighbor": [ { "neighbor-address": "2001:7f8:2d:e:2:0:2686:1", "config": { "neighbor-address": "2001:7f8:2d:e:2:0:2686:1", "peer-as": 2686, "peer-group": "public_v6_peers", "description": "AT&T EMEA - AS2686" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv6-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv6-unicast" }, "ipv6-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 500 } } } } ] } }, { "neighbor-address": "193.251.216.17", "config": { "neighbor-address": "193.251.216.17", "peer-as": 2484, "peer-group": "public_v4_peers", "description": "FR-NIC-DNS (AFNIC / NIC-France)" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 10 } } } } ] } }, { "neighbor-address": "193.251.216.13", "config": { "neighbor-address": "193.251.216.13", "peer-as": 2686, "peer-group": "public_v4_peers", "description": "AT&T EMEA - AS2686" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 1000 } } } } ] } }, { "neighbor-address": "2001:860:0:6::8359:1", "config": { "neighbor-address": "2001:860:0:6::8359:1", "peer-as": 8359, "peer-group": "public_v6_peers", "description": "Mobile TeleSystems PJSC" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv6-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv6-unicast" }, "ipv6-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 500 } } } } ] } }, { "neighbor-address": "198.32.247.60", "config": { "neighbor-address": "198.32.247.60", "peer-as": 39196, "peer-group": "public_v4_peers", "description": "Broadcasting Center Europe (BCE pop in France)" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 1 } } } } ] } }, { "neighbor-address": "2001:7f8:2d:c:2:3:4019:1", "config": { "neighbor-address": "2001:7f8:2d:c:2:3:4019:1", "peer-as": 34019, "peer-group": "public_v6_peers", "description": "Hivane" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv6-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv6-unicast" }, "ipv6-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 50 } } } } ] } }, { "neighbor-address": "193.251.216.18", "config": { "neighbor-address": "193.251.216.18", "peer-as": 34019, "peer-group": "public_v4_peers", "description": "Hivane" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 100 } } } } ] } }, { "neighbor-address": "193.251.216.70", "config": { "neighbor-address": "193.251.216.70", "peer-as": 4589, "peer-group": "public_v4_peers", "description": "Easynet Global Services" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 1000 } } } } ] } }, { "neighbor-address": "2001:7f8:2d:0:2:0:2486:1", "config": { "neighbor-address": "2001:7f8:2d:0:2:0:2486:1", "peer-as": 2484, "peer-group": "public_v6_peers", "description": "FR-NIC-DNS (AFNIC / NIC-France)" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv6-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv6-unicast" }, "ipv6-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 1 } } } } ] } }, { "neighbor-address": "2001:7f8:2d:f:2:0:4589:1", "config": { "neighbor-address": "2001:7f8:2d:f:2:0:4589:1", "peer-as": 4589, "peer-group": "public_v6_peers", "description": "Easynet Global Services" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv6-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv6-unicast" }, "ipv6-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 50 } } } } ] } }, { "neighbor-address": "198.32.247.107", "config": { "neighbor-address": "198.32.247.107", "peer-as": 15436, "peer-group": "public_v4_peers", "description": "Witbe" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 20 } } } } ] } }, { "neighbor-address": "193.251.216.102", "config": { "neighbor-address": "193.251.216.102", "peer-as": 7500, "peer-group": "public_v4_peers", "description": "M-ROOT DNS Server" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 6 } } } } ] } }, { "neighbor-address": "2001:7f8:2d:1:2:0:7500:1", "config": { "neighbor-address": "2001:7f8:2d:1:2:0:7500:1", "peer-as": 7500, "peer-group": "public_v6_peers", "description": "M-ROOT DNS Server" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv6-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv6-unicast" }, "ipv6-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 0 } } } } ] } }, { "neighbor-address": "62.35.254.148", "config": { "neighbor-address": "62.35.254.148", "peer-as": 8359, "peer-group": "public_v4_peers", "description": "Mobile TeleSystems PJSC" }, "afi-safis": { "afi-safi": [ { "afi-safi-name": "openconfig-bgp-types:ipv4-unicast", "config": { "enabled": true, "afi-safi-name": "openconfig-bgp-types:ipv4-unicast" }, "ipv4-unicast": { "prefix-limit": { "config": { "shutdown-threshold-pct": 90, "restart-timer": 1, "max-prefixes": 10000 } } } } ] } } ] } } } Restrictive peering networks: Name: Verizon Business - EMEA ASN: 702 Policy: Restrictive Policy Ratio: True Policy Locations: Required - International Policy URL: http://www.verizonbusiness.com/peering Policy Contracts: Required Name: Orange ASN: 5511 Policy: Restrictive Policy Ratio: True Policy Locations: Required - International Policy URL: http://vision.opentransit.net/docs/peering_policy/ Policy Contracts: Required Name: V-Com Openpath ASN: 29215 Policy: Restrictive Policy Ratio: False Policy Locations: Preferred Policy URL: Policy Contracts: Not Required Name: Orange France ASN: 3215 Policy: Restrictive Policy Ratio: True Policy Locations: Preferred Policy URL: http://www.parix.net/Politique-peering-FT-AS3215.pdf Policy Contracts: Not Required Name: Savvis ASN: 3561 Policy: Restrictive Policy Ratio: True Policy Locations: Required - US Policy URL: http://www.savvis.net/corp/savvis/peering Policy Contracts: Required Name: Pertineo ASN: 39583 Policy: Selective Policy Ratio: True Policy Locations: Not Required Policy URL: Policy Contracts: Required
Previous page: Example 1, Find Matching PoPs
Next page: Scapy Examples