Commit 0f8b3c5c authored by Binh Nguyen's avatar Binh Nguyen

Listener parsed OSPFv3 Update, DB desc, ACK msg

parent fd2fccd1
OSPFv3 Monitor.
-----------------------------------------------------------------
This program listens to OSPFv3 messages and obtain LSA information to monitor topology changes.
-----------------------------------------------------------------
This program is built based on the Pyrt code (https://github.com/mor1/pyrt.git), with the extra support for OSPFv3.
## PyRT: Python Routeing Toolkit ## OSPFv3 monitor
## mutils: various miscellaneous functions for dealing with IP ## mutils: various miscellaneous functions for dealing with IP
## addresses, prefixes, etc. ## addresses, prefixes, etc.
## Copyright (C) 2001 Richard Mortier <mort@sprintlabs.com>, Sprint ATL ## Copyright (C) 2017 Binh Nguyen <binh@cs.utah.edu>, University of Utah
## This program is free software; you can redistribute it and/or ## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as ## modify it under the terms of the GNU General Public License as
...@@ -243,7 +243,7 @@ def int2bin(int): ...@@ -243,7 +243,7 @@ def int2bin(int):
ret = "" ; bit = 0 ret = "" ; bit = 0
while int != 0: while int != 0:
if bit % 8 == 0: ret = '.' + ret if bit % 8 == 0: ret = '.' + ret
ret = `int%2` + ret ret = ("%s" % (int % 2)) + ret
int = int >> 1 int = int >> 1
bit += 1 bit += 1
...@@ -272,6 +272,10 @@ def int2hex(i): ...@@ -272,6 +272,10 @@ def int2hex(i):
def str2ipv6(s): def str2ipv6(s):
return ipaddress.IPv6Address(s) return ipaddress.IPv6Address(s)
def int2ipv6(i1, i2, i3, i4):
s = u"%02X:%04X:%04X:%04X:%02X:%02X:%02X:%02X" % ((i1&(0XFFFF<<(8*2)))>>(8*2), i1&0XFFFF, (i2&(0XFFFF<<(8*2)))>>(8*2), i2&0XFFFF, (i3&(0XFFFF<<(8*2)))>>(8*2), i3&0XFFFF, (i4&(0XFFFF<<(8*2)))>>(8*2), i4&0XFFFF)
return ipaddress.IPv6Address(s)
################################################################################ ################################################################################
################################################################################ ################################################################################
...@@ -57,6 +57,8 @@ class HelloV3(dpkt.Packet): ...@@ -57,6 +57,8 @@ class HelloV3(dpkt.Packet):
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Instance ID | 0X00 | | Checksum | Instance ID | 0X00 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Interface ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Router Prio | Options | |Router Prio | Options |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HelloInterval | Router Dead Interval | | HelloInterval | Router Dead Interval |
...@@ -65,13 +67,14 @@ class HelloV3(dpkt.Packet): ...@@ -65,13 +67,14 @@ class HelloV3(dpkt.Packet):
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Backup Designated Router | | Backup Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor | | Neighbor ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... | | ... |
""" """
__hdr__ = ( __hdr__ = (
('interfaceid', 'I', 0),
('routerpriority', 'B', 0), ('routerpriority', 'B', 0),
('options', '3s', 10), ('options', '3s', 10),
('hellointerval', 'H', 0), ('hellointerval', 'H', 0),
...@@ -324,6 +327,41 @@ class LinkLSAV3(dpkt.Packet): ...@@ -324,6 +327,41 @@ class LinkLSAV3(dpkt.Packet):
) )
class IntraPrefixLSAV3(dpkt.Packet):
"""
Intra Prefix LSA v3 Structure
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Num of prefixes | Referenced LS type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Referenced LS ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Referenced Adv Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix len | Prefix opt | Metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Address Prefix |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix len | Prefix opt | Metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Address Prefix |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
"""
__hdr__ = (
('routerpriority', 'B', 0),
('options', '3s', 0),
('linklocalprefix', 'LLLL', 0),
('numofprefix', 'L', 0),
)
class Hello(dpkt.Packet): class Hello(dpkt.Packet):
......
This diff is collapsed.
# !/usr/bin/env python
import sys, select
sys.path.insert(0, '/users/binh/sripv6-linux/ospf_monitor/lib')
from ospfv3 import *
def consume_ospf(ospf):
# !/usr/bin/env python # !/usr/bin/env python
import sys, select import sys, select
sys.path.insert(0, '/users/binh/ospf_monitor/lib') sys.path.insert(0, '/users/binh/sripv6-linux/ospf_monitor/lib')
from ospfv3 import * from ospfv3 import *
if __name__ == "__main__": if __name__ == "__main__":
...@@ -10,7 +10,7 @@ if __name__ == "__main__": ...@@ -10,7 +10,7 @@ if __name__ == "__main__":
global VERBOSE, DUMP_MRTD, ADDRESS global VERBOSE, DUMP_MRTD, ADDRESS
VERBOSE = 3 VERBOSE = 1
DUMP_MRTD = 0 DUMP_MRTD = 0
ADDRESS = "::" ADDRESS = "::"
...@@ -28,8 +28,9 @@ if __name__ == "__main__": ...@@ -28,8 +28,9 @@ if __name__ == "__main__":
#rfds, _, _ = select.select([ospf._sock], [], [], timeout) #rfds, _, _ = select.select([ospf._sock], [], [], timeout)
rv = ospf.parseMsg(VERBOSE, 0) rv = ospf.parseMsg(VERBOSE, 0)
if rv: #consume_ospf(rv)
print rv["T"] #if rv:
# print rv["T"]
#if len(rfds) > 0: #if len(rfds) > 0:
# print "receive OSPF" # print "receive OSPF"
# rv = ospf.parseMsg(VERBOSE, 0) # rv = ospf.parseMsg(VERBOSE, 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment