From 9f161ef3bbf3856f9f0fec7629facc041e282394 Mon Sep 17 00:00:00 2001 From: tehnerd Date: Sat, 26 Oct 2013 17:03:36 +0400 Subject: [PATCH] added initial protobuf for lsp's representation. added new class TEController. so application will looks like: pce_controller - everything related to communication between pcc and pce will be here (socket's handling etc) pcep - pcep handling (msg parsing etc) te_controller - full controllers logic (todo;)(path computation, lsp storing etc) or/and proxy to external controller --- mpls_lsp.proto | 35 ++++++ mpls_lsp_pb2.py | 288 ++++++++++++++++++++++++++++++++++++++++++++++ pce_controller.py | 9 +- pcep.py | 8 +- te_controller.py | 58 ++++++++++ 5 files changed, 391 insertions(+), 7 deletions(-) create mode 100644 mpls_lsp.proto create mode 100644 mpls_lsp_pb2.py create mode 100644 te_controller.py diff --git a/mpls_lsp.proto b/mpls_lsp.proto new file mode 100644 index 0000000..0bce56f --- /dev/null +++ b/mpls_lsp.proto @@ -0,0 +1,35 @@ +package mplspce; + +message LSP { + optional string pcc_ip = 1; + + message LSPObject { + optional uint32 plsp_id = 1; + optional bool delegated = 2; + optional bool administrative = 3; + optional uint32 operational = 4; + } + + message LSPAttributeObject { + optional uint32 setup_prio = 1; + optional uint32 hold_prio = 2; + optional bool local_protection = 3; + } + + message EROSubObject { + optional bool loose =1; + optional string node_ip =2; + optional uint32 node_mask =3; + } + + message RROSubObject { + optional string node_ip =1; + optional uint32 node_mask =2; + } + + optional LSPObject lsp_obj = 2; + optional LSPAttributeObject lspa_obj = 3; + repeated EROSubObject ero =4; + repeated RROSubObject rro =5; + optional uint32 bandwidth =6; +} diff --git a/mpls_lsp_pb2.py b/mpls_lsp_pb2.py new file mode 100644 index 0000000..b87da4b --- /dev/null +++ b/mpls_lsp_pb2.py @@ -0,0 +1,288 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: mpls_lsp.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='mpls_lsp.proto', + package='mplspce', + serialized_pb='\n\x0empls_lsp.proto\x12\x07mplspce\"\x80\x04\n\x03LSP\x12\x0e\n\x06pcc_ip\x18\x01 \x01(\t\x12\'\n\x07lsp_obj\x18\x02 \x01(\x0b\x32\x16.mplspce.LSP.LSPObject\x12\x31\n\x08lspa_obj\x18\x03 \x01(\x0b\x32\x1f.mplspce.LSP.LSPAttributeObject\x12&\n\x03\x65ro\x18\x04 \x03(\x0b\x32\x19.mplspce.LSP.EROSubObject\x12&\n\x03rro\x18\x05 \x03(\x0b\x32\x19.mplspce.LSP.RROSubObject\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x1a\\\n\tLSPObject\x12\x0f\n\x07plsp_id\x18\x01 \x01(\r\x12\x11\n\tdelegated\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x64ministrative\x18\x03 \x01(\x08\x12\x13\n\x0boperational\x18\x04 \x01(\r\x1aU\n\x12LSPAttributeObject\x12\x12\n\nsetup_prio\x18\x01 \x01(\r\x12\x11\n\thold_prio\x18\x02 \x01(\r\x12\x18\n\x10local_protection\x18\x03 \x01(\x08\x1a\x41\n\x0c\x45ROSubObject\x12\r\n\x05loose\x18\x01 \x01(\x08\x12\x0f\n\x07node_ip\x18\x02 \x01(\t\x12\x11\n\tnode_mask\x18\x03 \x01(\r\x1a\x32\n\x0cRROSubObject\x12\x0f\n\x07node_ip\x18\x01 \x01(\t\x12\x11\n\tnode_mask\x18\x02 \x01(\r') + + + + +_LSP_LSPOBJECT = _descriptor.Descriptor( + name='LSPObject', + full_name='mplspce.LSP.LSPObject', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='plsp_id', full_name='mplspce.LSP.LSPObject.plsp_id', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='delegated', full_name='mplspce.LSP.LSPObject.delegated', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='administrative', full_name='mplspce.LSP.LSPObject.administrative', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='operational', full_name='mplspce.LSP.LSPObject.operational', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=242, + serialized_end=334, +) + +_LSP_LSPATTRIBUTEOBJECT = _descriptor.Descriptor( + name='LSPAttributeObject', + full_name='mplspce.LSP.LSPAttributeObject', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='setup_prio', full_name='mplspce.LSP.LSPAttributeObject.setup_prio', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hold_prio', full_name='mplspce.LSP.LSPAttributeObject.hold_prio', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='local_protection', full_name='mplspce.LSP.LSPAttributeObject.local_protection', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=336, + serialized_end=421, +) + +_LSP_EROSUBOBJECT = _descriptor.Descriptor( + name='EROSubObject', + full_name='mplspce.LSP.EROSubObject', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='loose', full_name='mplspce.LSP.EROSubObject.loose', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='node_ip', full_name='mplspce.LSP.EROSubObject.node_ip', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='node_mask', full_name='mplspce.LSP.EROSubObject.node_mask', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=423, + serialized_end=488, +) + +_LSP_RROSUBOBJECT = _descriptor.Descriptor( + name='RROSubObject', + full_name='mplspce.LSP.RROSubObject', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node_ip', full_name='mplspce.LSP.RROSubObject.node_ip', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='node_mask', full_name='mplspce.LSP.RROSubObject.node_mask', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=490, + serialized_end=540, +) + +_LSP = _descriptor.Descriptor( + name='LSP', + full_name='mplspce.LSP', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='pcc_ip', full_name='mplspce.LSP.pcc_ip', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lsp_obj', full_name='mplspce.LSP.lsp_obj', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lspa_obj', full_name='mplspce.LSP.lspa_obj', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ero', full_name='mplspce.LSP.ero', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='rro', full_name='mplspce.LSP.rro', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bandwidth', full_name='mplspce.LSP.bandwidth', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LSP_LSPOBJECT, _LSP_LSPATTRIBUTEOBJECT, _LSP_EROSUBOBJECT, _LSP_RROSUBOBJECT, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=28, + serialized_end=540, +) + +_LSP_LSPOBJECT.containing_type = _LSP; +_LSP_LSPATTRIBUTEOBJECT.containing_type = _LSP; +_LSP_EROSUBOBJECT.containing_type = _LSP; +_LSP_RROSUBOBJECT.containing_type = _LSP; +_LSP.fields_by_name['lsp_obj'].message_type = _LSP_LSPOBJECT +_LSP.fields_by_name['lspa_obj'].message_type = _LSP_LSPATTRIBUTEOBJECT +_LSP.fields_by_name['ero'].message_type = _LSP_EROSUBOBJECT +_LSP.fields_by_name['rro'].message_type = _LSP_RROSUBOBJECT +DESCRIPTOR.message_types_by_name['LSP'] = _LSP + +class LSP(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + + class LSPObject(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LSP_LSPOBJECT + + # @@protoc_insertion_point(class_scope:mplspce.LSP.LSPObject) + + class LSPAttributeObject(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LSP_LSPATTRIBUTEOBJECT + + # @@protoc_insertion_point(class_scope:mplspce.LSP.LSPAttributeObject) + + class EROSubObject(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LSP_EROSUBOBJECT + + # @@protoc_insertion_point(class_scope:mplspce.LSP.EROSubObject) + + class RROSubObject(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LSP_RROSUBOBJECT + + # @@protoc_insertion_point(class_scope:mplspce.LSP.RROSubObject) + DESCRIPTOR = _LSP + + # @@protoc_insertion_point(class_scope:mplspce.LSP) + + +# @@protoc_insertion_point(module_scope) diff --git a/pce_controller.py b/pce_controller.py index 7d4da66..85b8bd6 100755 --- a/pce_controller.py +++ b/pce_controller.py @@ -2,6 +2,7 @@ import gevent import socket import pcep +import te_controller import time from gevent import monkey monkey.patch_socket() @@ -16,7 +17,7 @@ def send_ka(pcep_context, sock): sock.send(pcep_context.generate_ka_msg()) gevent.sleep(pcep_context._ka_timer) -def pcc_handler(clsock,sid): +def pcc_handler(clsock,sid,controller): pcep_context = pcep.PCEP(open_sid = sid) print(clsock[1]) msg=clsock[0].recv(1000) @@ -25,18 +26,20 @@ def pcc_handler(clsock,sid): ka_greenlet = gevent.spawn(send_ka,pcep_context,clsock[0]) while True: msg=clsock[0].recv(1000) - pcep_context.parse_rcved_msg(msg) + parsed_msg = pcep_context.parse_rcved_msg(msg) + controller.handle_pce_message(clsock[1],parsed_msg) #time.sleep(100) clsock[0].close() def main(): CURRENT_SID = 0 + controller = te_controller.TEController() servsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) servsock.bind((SERVADDR,SERVPORT)) servsock.listen(MAXCLIENTS) while True: client = servsock.accept() - gevent.spawn(pcc_handler,client,CURRENT_SID) + gevent.spawn(pcc_handler,client,CURRENT_SID,controller) CURRENT_SID += 1 if __name__ == '__main__': diff --git a/pcep.py b/pcep.py index 574c279..a067ad0 100644 --- a/pcep.py +++ b/pcep.py @@ -128,7 +128,7 @@ def parse_rcved_msg(self, msg): self.parse_open_msg(common_hdr, msg) elif common_hdr[1] == 2: print('ka msg recved') - self.parse_ka_msg(common_hdr, msg) + return self.parse_ka_msg(common_hdr, msg) elif common_hdr[1] == 3: print('pcreq msg recved') elif common_hdr[1] == 4: @@ -141,11 +141,11 @@ def parse_rcved_msg(self, msg): elif common_hdr[1] == 7: print('close msg recved') elif common_hdr[1] == 10: - self.parse_state_report_msg(common_hdr,msg) print('pcc state report msg recved') + return self.parse_state_report_msg(common_hdr,msg) elif common_hdr[1] == 11: print('pcc update msg recved') - + return ('NotImplemented',None) """ The format of the OPEN object body is as follows: @@ -577,6 +577,6 @@ def generate_ka_msg(self): return common_hdr def parse_ka_msg(self,common_hdr,msg): - pass + return ('ka_msg',) diff --git a/te_controller.py b/te_controller.py new file mode 100644 index 0000000..926c12e --- /dev/null +++ b/te_controller.py @@ -0,0 +1,58 @@ +import socket +import mpls_lsp_pb2 +import struct + +class TEController(object): + def __init__(self): + self.lsp_dict = dict() + + def ip2int(self, addr): + return struct.unpack_from("!I", socket.inet_aton(addr))[0] + def int2ip(self, addr): + return socket.inet_ntoa(struct.pack("!I", addr)) + + def handle_pce_message(self, pcc_ip, message): + if message[0] == 'state_report': + self.handle_state_report(pcc_ip, message) + + def handle_state_report(self, pcc_ip, message): + lsp = mpls_lsp_pb2.LSP() + first_lsp = 1 + for report_object in message[1]: + if report_object[0] == 'lsp_obj': + if first_lsp != 1: + lsp_dict_index = (self.ip2int(pcc_ip[0]),lsp.lsp_obj.plsp_id) + new_lsp = mpls_lsp_pb2.LSP() + new_lsp.CopyFrom(lsp) + self.lsp_dict[lsp_dict_index] = new_lsp + else: + first_lsp = 0 + lsp.Clear() + lsp.pcc_ip = pcc_ip[0] + lsp.lsp_obj.plsp_id = report_object[1][0] + lsp.lsp_obj.delegated = report_object[1][1] + lsp.lsp_obj.administrative = report_object[1][4] + lsp.lsp_obj.operational = report_object[1][5] + if report_object[0] == 'bw': + lsp.bandwidth = report_object[1][0] + if report_object[0] == 'lspa': + lsp.lspa_obj.setup_prio = report_object[1][0] + lsp.lspa_obj.hold_prio = report_object[1][1] + lsp.lspa_obj.local_protection = report_object[1][2] + if report_object[0] == 'ero': + if len(report_object[1]) > 0: + for ero_node in report_object[1]: + ero = lsp.ero.add() + ero.loose = ero_node[1] + ero.node_ip = self.int2ip(ero_node[2][2]) + ero.node_mask = ero_node[2][3] + if report_object[0] == 'rro': + if len(report_object[1]) > 0: + for rro_node in report_object[1]: + rro = lsp.rro.add() + rro.node_ip = self.int2ip(rro_node[1][2]) + rro.node_mask = rro_node[1][3] + lsp_dict_index = (self.ip2int(pcc_ip[0]),lsp.lsp_obj.plsp_id) + self.lsp_dict[lsp_dict_index] = lsp + for lsp in self.lsp_dict: + print(self.lsp_dict[lsp])