예제 #1
0
		def _key_values (name, data):
			if len(data) < 2:
				raise Notify(2,0,"Bad length for OPEN %s (<2) %s" % (name,Capability.hex(data)))
			l = ord(data[1])
			boundary = l+2
			if len(data) < boundary:
				raise Notify(2,0,"Bad length for OPEN %s (buffer underrun) %s" % (name,Capability.hex(data)))
			key = ord(data[0])
			value = data[2:boundary]
			rest = data[boundary:]
			return key,value,rest
예제 #2
0
		def _key_values (name, data):
			if len(data) < 2:
				raise Notify(2,0,"Bad length for OPEN %s (<2) %s" % (name,Capability.hex(data)))
			l = ord(data[1])
			boundary = l+2
			if len(data) < boundary:
				raise Notify(2,0,"Bad length for OPEN %s (buffer underrun) %s" % (name,Capability.hex(data)))
			key = ord(data[0])
			value = data[2:boundary]
			rest = data[boundary:]
			return key,value,rest
예제 #3
0
	def unpack (data):
		def _key_values (name, data):
			if len(data) < 2:
				raise Notify(2,0,"Bad length for OPEN %s (<2) %s" % (name,Capability.hex(data)))
			l = ord(data[1])
			boundary = l+2
			if len(data) < boundary:
				raise Notify(2,0,"Bad length for OPEN %s (buffer underrun) %s" % (name,Capability.hex(data)))
			key = ord(data[0])
			value = data[2:boundary]
			rest = data[boundary:]
			return key,value,rest

		capabilities = Capabilities()

		option_len = ord(data[0])
		# XXX: FIXME: check the length of data
		if option_len:
			data = data[1:]
			while data:
				key,value,data = _key_values('parameter',data)
				# Paramaters must only be sent once.
				if key == Parameter.AUTHENTIFICATION_INFORMATION:
					raise Notify(2,5)

				if key == Parameter.CAPABILITIES:
					while value:
						capability,capv,value = _key_values('capability',value)
						capabilities[capability] = Capability.unpack(capability,capabilities,capv)
				else:
					raise Notify(2,0,'Unknow OPEN parameter %s' % hex(key))
		return capabilities
예제 #4
0
	def unpack (data):
		def _key_values (name, data):
			if len(data) < 2:
				raise Notify(2,0,"Bad length for OPEN %s (<2) %s" % (name,Capability.hex(data)))
			l = ord(data[1])
			boundary = l+2
			if len(data) < boundary:
				raise Notify(2,0,"Bad length for OPEN %s (buffer underrun) %s" % (name,Capability.hex(data)))
			key = ord(data[0])
			value = data[2:boundary]
			rest = data[boundary:]
			return key,value,rest

		capabilities = Capabilities()

		option_len = ord(data[0])
		# XXX: FIXME: check the length of data
		if option_len:
			data = data[1:]
			while data:
				key,value,data = _key_values('parameter',data)
				# Paramaters must only be sent once.
				if key == Parameter.AUTHENTIFICATION_INFORMATION:
					raise Notify(2,5)

				if key == Parameter.CAPABILITIES:
					while value:
						capability,capv,value = _key_values('capability',value)
						capabilities[capability] = Capability.unpack(capability,capabilities,capv)
				else:
					raise Notify(2,0,'Unknow OPEN parameter %s' % hex(key))
		return capabilities
예제 #5
0
파일: capability.py 프로젝트: xw2060/exabgp
 def family(self, tokeniser):
     data = self.get_section(SectionFamily.name, tokeniser)
     if data:
         self.content[Capability.CODE(
             Capability.CODE.MULTIPROTOCOL)] = MultiProtocol(
                 (afi, safi) for afi in sorted(data)
                 for safi in sorted(data[afi]))
     else:
         return False
예제 #6
0
파일: capability.py 프로젝트: xw2060/exabgp
    def enter(self, tokeniser):
        Section.enter(self, tokeniser)

        self.content[Capability.CODE(Capability.CODE.FOUR_BYTES_ASN)] = True
        self.content[Capability.CODE(Capability.CODE.AIGP)] = False
        self.content[Capability.CODE(Capability.CODE.ADD_PATH)] = 0
        self.content[Capability.CODE(Capability.CODE.OPERATIONAL)] = False
        self.content[Capability.CODE(Capability.CODE.ROUTE_REFRESH)] = False
        self.content[Capability.CODE(Capability.CODE.MULTISESSION)] = False
        self.content[Capability.CODE(Capability.CODE.GRACEFUL_RESTART)] = 0
예제 #7
0
파일: capability.py 프로젝트: xw2060/exabgp
    def addpath(self, tokeniser):
        self._check_duplicate(tokeniser, RaisedCapability)
        valid_options = ('receive', 'send', 'send/receive', 'disable',
                         'disabled')
        ap = tokeniser()
        if ap not in valid_options:
            raise RaisedCapability(
                tokeniser,
                "%s is not a invalid add-path paramerter, options are %s" %
                (ap, ', '.join(valid_options)))

        self.content[Capability.CODE(Capability.CODE.ADD_PATH)] = 0
        if ap.endswith('receive'):
            self.content[Capability.CODE.ADD_PATH] += 1
        if ap.startswith('send'):
            self.content[Capability.CODE.ADD_PATH] += 2
예제 #8
0
파일: capability.py 프로젝트: xw2060/exabgp
    def graceful(self, tokeniser):
        self._check_duplicate(tokeniser, RaisedCapability)
        token = tokeniser()
        if not token.isdigit():
            raise RaisedCapability(
                tokeniser,
                "%s is not a valid option for graceful-restart, it must be a positive number smaller than 2^16"
                % token)

        duration = int(token)
        if duration < 0:
            raise RaisedCapability(
                tokeniser,
                "%s is not a valid option for graceful-restart, it must be a positive number smaller than 2^16"
                % token)
        if duration > pow(2, 16):
            raise RaisedCapability(
                tokeniser,
                "%s is not a valid option for graceful-restart, it must be a positive number smaller than 2^16"
                % token)

        self.content[Capability.CODE(
            Capability.CODE.GRACEFUL_RESTART)] = duration
예제 #9
0
파일: __init__.py 프로젝트: kyehwanl/BGPs
from exabgp.bgp.message.open.capability.capability import Capability

from exabgp.bgp.message.open.capability.addpath import AddPath
from exabgp.bgp.message.open.capability.asn4 import ASN4
from exabgp.bgp.message.open.capability.graceful import Graceful
from exabgp.bgp.message.open.capability.mp import MultiProtocol
from exabgp.bgp.message.open.capability.ms import MultiSession
from exabgp.bgp.message.open.capability.operational import Operational
from exabgp.bgp.message.open.capability.refresh import RouteRefresh
from exabgp.bgp.message.open.capability.refresh import EnhancedRouteRefresh
from exabgp.bgp.message.open.capability.unknown import UnknownCapability
from exabgp.bgp.message.open.capability.bgpsec import BGPSEC

# Must be imported and registered for the register API to work
Capability.register_capability(AddPath)
Capability.register_capability(ASN4)
Capability.register_capability(Graceful)
Capability.register_capability(MultiProtocol)
Capability.register_capability(MultiSession,Capability.CODE.MULTISESSION_CISCO)
Capability.register_capability(MultiSession,Capability.CODE.MULTISESSION)
Capability.register_capability(Operational)
Capability.register_capability(RouteRefresh,Capability.CODE.ROUTE_REFRESH)
Capability.register_capability(RouteRefresh,Capability.CODE.ROUTE_REFRESH_CISCO)
Capability.register_capability(EnhancedRouteRefresh)
Capability.register_capability(BGPSEC)
Capability.fallback_capability(UnknownCapability)
# End registration


class REFRESH (object):
예제 #10
0
파일: __init__.py 프로젝트: Akheon23/exabgp
"""

from exabgp.bgp.message.open.capability.capability import Capability

from exabgp.bgp.message.open.capability.addpath import AddPath
from exabgp.bgp.message.open.capability.asn4 import ASN4
from exabgp.bgp.message.open.capability.graceful import Graceful
from exabgp.bgp.message.open.capability.mp import MultiProtocol
from exabgp.bgp.message.open.capability.ms import MultiSession
from exabgp.bgp.message.open.capability.operational import Operational
from exabgp.bgp.message.open.capability.refresh import RouteRefresh
from exabgp.bgp.message.open.capability.refresh import EnhancedRouteRefresh
from exabgp.bgp.message.open.capability.unknown import UnknownCapability

# Must be imported and registered for the register API to work
Capability.register_capability(AddPath)
Capability.register_capability(ASN4)
Capability.register_capability(Graceful)
Capability.register_capability(MultiProtocol)
Capability.register_capability(MultiSession,Capability.CODE.MULTISESSION_CISCO)
Capability.register_capability(MultiSession,Capability.CODE.MULTISESSION)
Capability.register_capability(Operational)
Capability.register_capability(RouteRefresh,Capability.CODE.ROUTE_REFRESH)
Capability.register_capability(RouteRefresh,Capability.CODE.ROUTE_REFRESH_CISCO)
Capability.register_capability(EnhancedRouteRefresh)
Capability.fallback_capability(UnknownCapability)
# End registration


class REFRESH (object):
	ABSENT   = 0x01
예제 #11
0
파일: capability.py 프로젝트: xw2060/exabgp
 def aigp(self, tokeniser):
     self._check_duplicate(tokeniser, RaisedCapability)
     self.content[Capability.CODE(Capability.CODE.AIGP)] = boolean(
         tokeniser, False)
예제 #12
0
파일: capability.py 프로젝트: xw2060/exabgp
 def asn4(self, tokeniser):
     self._check_duplicate(tokeniser, RaisedCapability)
     self.content[Capability.CODE(
         Capability.CODE.FOUR_BYTES_ASN)] = boolean(tokeniser, True)
예제 #13
0
파일: capability.py 프로젝트: xw2060/exabgp
 def exit(self, tokeniser):
     if Capability.CODE(Capability.CODE.MULTIPROTOCOL) not in self.content:
         self.content[Capability.CODE(
             Capability.CODE.MULTIPROTOCOL)] = MultiProtocol(
                 known_families())
예제 #14
0
파일: capability.py 프로젝트: xw2060/exabgp
 def multisession(self, tokeniser):
     self._check_duplicate(tokeniser, RaisedCapability)
     self.content[Capability.CODE(
         Capability.CODE.MULTISESSION_CISCO)] = boolean(tokeniser, False)
예제 #15
0
파일: capability.py 프로젝트: xw2060/exabgp
 def refresh(self, tokeniser):
     self._check_duplicate(tokeniser, RaisedCapability)
     self.content[Capability.CODE(Capability.CODE.ROUTE_REFRESH)] = boolean(
         tokeniser, False)
예제 #16
0
파일: capability.py 프로젝트: xw2060/exabgp
 def operational(self, tokeniser):
     self._check_duplicate(tokeniser, RaisedCapability)
     self.content[Capability.CODE(Capability.CODE.OPERATIONAL)] = boolean(
         tokeniser, False)