## RSVP layer

# This file is part of Scapy
# Scapy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# any later version.
#
# Scapy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Scapy. If not, see <http://www.gnu.org/licenses/>.

# scapy.contrib.description = RSVP
# scapy.contrib.status = loads

from scapy.packet import *
from scapy.fields import *
from scapy.layers.inet import IP

rsvpmsgtypes = { 0x01 : "Path",
                 0x02 : "Reservation request",
                 0x03 : "Path error",
                 0x04 : "Reservation request error",
                 0x05 : "Path teardown",
                 0x06 : "Reservation teardown",
                 0x07 : "Reservation request acknowledgment"
}
        
class RSVP(Packet):
    name = "RSVP"
    fields_desc = [ BitField("Version",1,4),
                    BitField("Flags",1,4),
                    ByteEnumField("Class",0x01, rsvpmsgtypes),
                    XShortField("chksum", None),
                    ByteField("TTL",1),
                    XByteField("dataofs", 0),
                    ShortField("Length",None)]
    def post_build(self, p, pay):
        p += pay
        if self.Length is None:
            l = len(p)
            p = p[:6]+chr((l>>8)&0xff)+chr(l&0xff)+p[8:]
        if self.chksum is None:
            ck = checksum(p)
            p = p[:2]+chr(ck>>8)+chr(ck&0xff)+p[4:]
        return p
                    
rsvptypes = { 0x01 : "Session",
              0x03 : "HOP",
              0x04 : "INTEGRITY",
              0x05 : "TIME_VALUES",
              0x06 : "ERROR_SPEC",
              0x07 : "SCOPE",
              0x08 :  "STYLE",
              0x09 :  "FLOWSPEC",
              0x0A :  "FILTER_SPEC",
              0x0B :  "SENDER_TEMPLATE",
              0x0C  : "SENDER_TSPEC",
              0x0D   : "ADSPEC",
              0x0E   : "POLICY_DATA",
              0x0F   : "RESV_CONFIRM",
              0x10   : "RSVP_LABEL",
              0x11   : "HOP_COUNT",        
              0x12   : "STRICT_SOURCE_ROUTE",
              0x13   : "LABEL_REQUEST",
              0x14   : "EXPLICIT_ROUTE",
              0x15   : "ROUTE_RECORD",
              0x16   : "HELLO",
              0x17   : "MESSAGE_ID",
              0x18   : "MESSAGE_ID_ACK",
              0x19   : "MESSAGE_ID_LIST",
              0x1E   : "DIAGNOSTIC",
              0x1F   : "ROUTE",
              0x20   : "DIAG_RESPONSE",
              0x21   : "DIAG_SELECT",
              0x22   : "RECOVERY_LABEL",
              0x23   : "UPSTREAM_LABEL",
              0x24   : "LABEL_SET",
              0x25   : "PROTECTION",
              0x26   : "PRIMARY PATH ROUTE",
              0x2A   : "DSBM IP ADDRESS",
              0x2B   : "SBM_PRIORITY",
              0x2C   : "DSBM TIMER INTERVALS",
              0x2D   : "SBM_INFO",
              0x32   : "S2L_SUB_LSP",
              0x3F   : "DETOUR",
              0x40   : "CHALLENGE",
              0x41   : "DIFF-SERV",
              0x42   : "CLASSTYPE",
              0x43   : "LSP_REQUIRED_ATTRIBUTES",
              0x80  : "NODE_CHAR",
              0x81  : "SUGGESTED_LABEL",
              0x82  : "ACCEPTABLE_LABEL_SET",
              0x83  : "RESTART_CA",
              0x84  : "SESSION-OF-INTEREST",
              0x85  : "LINK_CAPABILITY",
              0x86  : "Capability Object", 
              0xA1  : "RSVP_HOP_L2",
              0xA2  : "LAN_NHOP_L2",    
              0xA3  : "LAN_NHOP_L3",    
              0xA4  : "LAN_LOOPBACK",    
              0xA5  : "TCLASS",
              0xC0  : "TUNNEL", 
              0xC1  : "LSP_TUNNEL_INTERFACE_ID",
              0xC2  : "USER_ERROR_SPEC",
              0xC3  : "NOTIFY_REQUEST",
              0xC4  : "ADMIN-STATUS",
              0xC5  : "LSP_ATTRIBUTES",
              0xC6  : "ALARM_SPEC",
              0xC7  : "ASSOCIATION",
              0xC8  : "SECONDARY_EXPLICIT_ROUTE",
              0xC9  : "SECONDARY_RECORD_ROUTE",                
              0xCD  : "FAST_REROUTE",
              0xCF  : "SESSION_ATTRIBUTE",
              0xE1  : "DCLASS",
              0xE2  : "PACKETCABLE EXTENSIONS",
              0xE3  : "ATM_SERVICECLASS",
              0xE4  : "CALL_OPS (ASON)",
              0xE5  : "GENERALIZED_UNI",
              0xE6  : "CALL_ID",
              0xE7  : "3GPP2_Object",
              0xE8  : "EXCLUDE_ROUTE"
}      

class RSVP_Object(Packet):
    name = "RSVP_Object"
    fields_desc = [ ShortField("Length",4),
                  ByteEnumField("Class",0x01, rsvptypes),
                  ByteField("C-Type",1)]
    def guess_payload_class(self, payload):
        if self.Class == 0x03:
            return RSVP_HOP
        elif self.Class == 0x05:
            return RSVP_Time
        elif self.Class == 0x0c:
            return RSVP_SenderTSPEC
        elif self.Class == 0x13:
            return RSVP_LabelReq
        elif self.Class == 0xCF:
            return RSVP_SessionAttrb
        else:
            return RSVP_Data
    
    

class RSVP_Data(Packet):
    name = "Data"
    fields_desc = [StrLenField("Data","",length_from= lambda pkt:pkt.underlayer.Length - 4)]
    def default_payload_class(self, payload):
      return RSVP_Object

class RSVP_HOP(Packet):
    name = "HOP"
    fields_desc = [ IPField("neighbor","0.0.0.0"),
                  BitField("inface",1,32)]
    def default_payload_class(self, payload):
      return RSVP_Object

class RSVP_Time(Packet):
    name = "Time Val"
    fields_desc = [ BitField("refresh",1,32)]
    def default_payload_class(self, payload):
      return RSVP_Object

class RSVP_SenderTSPEC(Packet):
    name = "Sender_TSPEC"
    fields_desc = [ ByteField("Msg_Format",0),
                    ByteField("reserve",0),
                    ShortField("Data_Length",4),
                    ByteField("Srv_hdr",1),
                    ByteField("reserve2",0),
                    ShortField("Srv_Length",4),
                    StrLenField("Tokens","",length_from= lambda pkt:pkt.underlayer.Length - 12) ]
    def default_payload_class(self, payload):
      return RSVP_Object

class RSVP_LabelReq(Packet):
    name = "Lable Req"
    fields_desc = [  ShortField("reserve",1),
                     ShortField("L3PID",1)]
    def default_payload_class(self, payload):
      return RSVP_Object

class RSVP_SessionAttrb(Packet):
    name = "Session_Attribute"
    fields_desc = [  ByteField("Setup_priority",1),
                     ByteField("Hold_priority",1),
                     ByteField("flags",1),
                     ByteField("Name_length",1),
                     StrLenField("Name","",length_from= lambda pkt:pkt.underlayer.Length - 8),
                     ]  
    def default_payload_class(self, payload):
      return RSVP_Object

bind_layers( IP,     RSVP,     { "proto" : 46} )
bind_layers( RSVP, RSVP_Object, {})
