radius_attribute_type = {
        1:  "User-Name",
        2:  "User-Password",
        3:  "CHAP-Password",
        4:  "NAS-IP-Address",
        5:  "NAS-Port",
        6:  "Service-Type",
        7:  "Framed-Protocol",
        8:  "Framed-IP-Address",
        9:  "Framed-IP-Netmask",
        10: "Framed-Routing",
        11: "Filter-Id",
        12: "Framed-MTU",
        13: "Framed-Compression",
        14: "Login-IP-Host",
        15: "Login-Service",
        16: "Login-TCP-Port",
        17: "unassigned",
        18: "Reply-Message",
        19: "Callback-Number",
        20: "Callback-Id",
        21: "unassigned",
        22: "Framed-Route",
        23: "Framed-IPX-Network",
        24: "State",
        25: "Class",
        26: "Vendor-Specific",
        27: "Session-Timeout",
        28: "Idle-Timeout",
        29: "Termination-Action",
        30: "Called-Station-Id",
        31: "Calling-Station-Id",
        32: "NAS-Identifier",
        33: "Proxy-State",
        34: "Login-LAT-Service",
        35: "Login-LAT-Node",
        36: "Login-LAT-Group",
        37: "Framed-AppleTalk-Link",
        38: "Framed-AppleTalk-Network",
        39: "Framed-AppleTalk-Zone",
        60: "CHAP-Challenge",
        61: "NAS-Port-Type",
        62: "Port-Limit",
        63: "Login-LAT-Port",
        70: "ARAP-Password",
        75: "Password-Retry",
        79: "EAP-Message",
        80: "Message-Authenticator",
        94: "Originating-Line-Info",
        101:"Error-Cause"
        }

class RadiusAttr(Packet):
    name = "Radius Attribute"
    fields_desc = [ ByteEnumField("type", 1, radius_attribute_type),
                    FieldLenField("len", None, "value", "B", adjust=lambda pkt,x: x+2),
                    StrLenField("value", "", length_from=lambda pkt: pkt.len-2)
                    ]
bind_layers( UDP,           Radius,         sport=1812)
bind_layers( UDP,           Radius,         dport=1812)
bind_layers( UDP,           Radius,         dport=1813)
bind_layers( UDP,           Radius,         sport=1813)
bind_layers( Radius,        RadiusAttr,     )
bind_layers( RadiusAttr,    RadiusAttr,     )
