blob: 8966e8a652bd4f82903e5eb67628b09fd3d95ee2 [file] [log] [blame]
# $Id: rip.py 23 2006-11-08 15:45:33Z dugsong $
# -*- coding: utf-8 -*-
"""Routing Information Protocol."""
from __future__ import print_function
from __future__ import absolute_import
from . import dpkt
# RIP v2 - RFC 2453
# http://tools.ietf.org/html/rfc2453
REQUEST = 1
RESPONSE = 2
class RIP(dpkt.Packet):
"""Routing Information Protocol.
TODO: Longer class information....
Attributes:
__hdr__: Header fields of RIP.
TODO.
"""
__hdr__ = (
('cmd', 'B', REQUEST),
('v', 'B', 2),
('rsvd', 'H', 0)
)
def unpack(self, buf):
dpkt.Packet.unpack(self, buf)
l_ = []
self.auth = None
while self.data:
rte = RTE(self.data[:20])
if rte.family == 0xFFFF:
self.auth = Auth(self.data[:20])
else:
l_.append(rte)
self.data = self.data[20:]
self.data = self.rtes = l_
def __len__(self):
n = self.__hdr_len__
if self.auth:
n += len(self.auth)
n += sum(map(len, self.rtes))
return n
def __bytes__(self):
auth = b''
if self.auth:
auth = bytes(self.auth)
return self.pack_hdr() + auth + b''.join(map(bytes, self.rtes))
class RTE(dpkt.Packet):
__hdr__ = (
('family', 'H', 2),
('route_tag', 'H', 0),
('addr', 'I', 0),
('subnet', 'I', 0),
('next_hop', 'I', 0),
('metric', 'I', 1)
)
class Auth(dpkt.Packet):
__hdr__ = (
('rsvd', 'H', 0xFFFF),
('type', 'H', 2),
('auth', '16s', 0)
)
def test_creation_with_auth():
from binascii import unhexlify
buf_auth = unhexlify(
'ffff' # rsvd
'0002' # type
'0123456789abcdef' # auth
'0123456789abcdef' # auth
)
auth_direct = Auth(buf_auth)
assert bytes(auth_direct) == buf_auth
buf_rte = unhexlify(
'0002' # family
'0000' # route_tag
'01020300' # addr
'ffffff00' # subnet
'00000000' # next_hop
'00000001' # metric
)
rte = RTE(buf_rte)
assert bytes(rte) == buf_rte
buf_rip = unhexlify(
'02' # cmd
'02' # v
'0000' # rsvd
)
rip = RIP(buf_rip + buf_auth + buf_rte)
assert rip.auth
assert rip.auth.rsvd == 0xffff
assert rip.auth.type == 2
assert rip.auth.auth == unhexlify('0123456789abcdef') * 2
assert len(rip.rtes) == 1
rte = rip.rtes[0]
assert rte.family == 2
assert rte.route_tag == 0
assert rte.metric == 1
assert bytes(rip) == buf_rip + buf_auth + buf_rte
assert len(rip) == len(buf_rip + buf_auth + buf_rte)