Looks good. On Tue, Jun 25, 2013 at 04:00:24PM +0900, watanabe.fumitaka wrote: > Add ICMP sub encoder/decoder class for Destination Unreachable Message. > and, add parser to Time Exceeded Message class. > > > Signed-off-by: WATANABE Fumitaka <[email protected]> > --- > ryu/lib/packet/icmp.py | 113 > +++++++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 107 insertions(+), 6 deletions(-) > > diff --git a/ryu/lib/packet/icmp.py b/ryu/lib/packet/icmp.py > index b049380..7b16ad0 100644 > --- a/ryu/lib/packet/icmp.py > +++ b/ryu/lib/packet/icmp.py > @@ -26,6 +26,11 @@ ICMP_REDIRECT = 5 > ICMP_ECHO_REQUEST = 8 > ICMP_TIME_EXCEEDED = 11 > > +ICMP_ECHO_REPLY_CODE = 0 > +ICMP_HOST_UNREACH_CODE = 1 > +ICMP_PORT_UNREACH_CODE = 3 > +ICMP_TTL_EXPIRED_CODE = 0 > + > > class icmp(packet_base.PacketBase): > """ICMP (RFC 792) header encoder/decoder class. > @@ -42,10 +47,18 @@ class icmp(packet_base.PacketBase): > csum CheckSum \ > (0 means automatically-calculate when encoding) > data Payload. \ > - Either a bytearray or ryu.lib.packet.icmp.echo object. \ > - NOTE: This includes "unused" 16 bits and the following \ > + Either a bytearray, or \ > + ryu.lib.packet.icmp.echo or \ > + ryu.lib.packet.icmp.dest_unreach or \ > + ryu.lib.packet.icmp.TimeExceeded object \ > + NOTE for icmp.echo: \ > + This includes "unused" 16 bits and the following \ > "Internet Header + 64 bits of Original Data Datagram" of \ > - the ICMP header. > + the ICMP header. \ > + NOTE for icmp.dest_unreach and icmp.TimeExceeded: \ > + This includes "unused" 8 or 24 bits and the following \ > + "Internet Header + leading octets of original datagram" \ > + of the original packet. > ============== ==================== > """ > > @@ -124,6 +137,7 @@ class echo(object): > _MIN_LEN = struct.calcsize(_PACK_STR) > > def __init__(self, id_, seq, data=None): > + super(echo, self).__init__() > self.id = id_ > self.seq = seq > self.data = data > @@ -149,16 +163,103 @@ class echo(object): > return hdr > > > [email protected]_icmp_type(ICMP_DEST_UNREACH) > +class dest_unreach(object): > + """ICMP sub encoder/decoder class for Destination Unreachable Message. > + > + This is used with ryu.lib.packet.icmp.icmp for > + ICMP Destination Unreachable Message. > + > + An instance has the following attributes at least. > + Most of them are same to the on-wire counterparts but in host byte order. > + __init__ takes the correspondig args in this order. > + > + [RFC1191] reserves bits for the "Next-Hop MTU" field. > + [RFC4884] introduced 8-bit data length attribute. > + > + ============== ==================== > + Attribute Description > + ============== ==================== > + data_len data length > + mtu Next-Hop MTU \ > + NOTE: This field is required when icmp code is 4 \ > + code 4 = fragmentation needed and DF set > + data Internet Header + leading octets of original datagram > + ============== ==================== > + """ > + > + _PACK_STR = '!xBH' > + _MIN_LEN = struct.calcsize(_PACK_STR) > + > + def __init__(self, data_len=0, mtu=0, data=None): > + super(dest_unreach, self).__init__() > + self.data_len = data_len > + self.mtu = mtu > + self.data = data > + > + @classmethod > + def parser(cls, buf, offset): > + (data_len, mtu) = struct.unpack_from(cls._PACK_STR, > + buf, offset) > + msg = cls(data_len, mtu) > + offset += cls._MIN_LEN > + > + if len(buf) > offset: > + msg.data = buf[offset:] > + > + return msg > + > + def serialize(self): > + hdr = bytearray(struct.pack(dest_unreach._PACK_STR, > + self.data_len, self.mtu)) > + > + if self.data is not None: > + hdr += self.data > + > + return hdr > + > + > @icmp.register_icmp_type(ICMP_TIME_EXCEEDED) > class TimeExceeded(object): > - _PACK_STR = '!4x' > + """ICMP sub encoder/decoder class for Time Exceeded Message. > + > + This is used with ryu.lib.packet.icmp.icmp for > + ICMP Time Exceeded Message. > + > + An instance has the following attributes at least. > + Most of them are same to the on-wire counterparts but in host byte order. > + __init__ takes the correspondig args in this order. > + > + [RFC4884] introduced 8-bit data length attribute. > + > + ============== ==================== > + Attribute Description > + ============== ==================== > + data_len data length > + data Internet Header + leading octets of original datagram > + ============== ==================== > + """ > + > + _PACK_STR = '!xBxx' > _MIN_LEN = struct.calcsize(_PACK_STR) > > - def __init__(self, data=None): > + def __init__(self, data_len=0, data=None): > + self.data_len = data_len > self.data = data > > + @classmethod > + def parser(cls, buf, offset): > + data_len = struct.unpack_from(cls._PACK_STR, buf, offset) > + msg = cls(data_len) > + offset += cls._MIN_LEN > + > + if len(buf) > offset: > + msg.data = buf[offset:] > + > + return msg > + > def serialize(self): > - hdr = bytearray(TimeExceeded._MIN_LEN) > + hdr = bytearray(struct.pack(TimeExceeded._PACK_STR, self.data_len)) > > if self.data is not None: > hdr += self.data > -- 1.7.10.4 > > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by Windows: > > Build for Windows Store. > > http://p.sf.net/sfu/windows-dev2dev > _______________________________________________ > Ryu-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/ryu-devel >
-- yamahata ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
