summaryrefslogtreecommitdiff
path: root/common/lib/scammer/cc.py
blob: a5936de88425f39d4d965217c57a764fe74dfe04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/usr/bin/python

#############################################################################
#  Copyright (C) 2011 Spidcom
#############################################################################

from scapy.all import Packet
from scapy.fields import *
from commonfields import *
from common import HPAV_CCO_LEVEL, HPAV_RESULT
from scammer import MMEPayload

class CC_WHO_RU_REQ (MMEPayload):
    """Handles the CC_WHO_RU.REQ MME."""
    name = "HomePlug AV CC_WHO_RU.REQ"""
    fields_desc = [
            HPAVNIDField ("nid", 0),
            ]

class CC_WHO_RU_CNF (MMEPayload):
    """Handles the CC_WHO_RU.CNF MME."""
    name = "HomePlug AV CC_WHO_RU.CNF"""
    fields_desc = [
            HPAVNIDField ("nid", 0),
            MACField ("mac", ETHER_ANY),
            StrFixedLenField ("hfid", 0, 64),
            ]

class CC_LEAVE_REQ (MMEPayload):
    """Handles the CC_LEAVE.REQ MME."""
    name = "HomePlug AV CC_LEAVE.REQ"""
    fields_desc = [
            ByteEnumField ("reason", 0, {
                0: "USER_REQUEST",
                1: "POWER_DOWN",
                }),
            ]

class CC_LEAVE_CNF (MMEPayload):
    """Handles the CC_LEAVE.CNF MME."""
    name = "HomePlug AV CC_LEAVE.CNF"""
    fields_desc = [
            ]

class CC_LEAVE_IND (MMEPayload):
    """Handles the CC_LEAVE.IND MME."""
    name = "HomePlug AV CC_LEAVE.IND"""
    fields_desc = [
            XByteField ("reason", 0),
            HPAVNIDField ("nid", 0),
            ]

class CC_LEAVE_RSP (MMEPayload):
    """Handles the CC_LEAVE.RSP MME."""
    name = "HomePlug AV CC_LEAVE.RSP"""
    fields_desc = [
            ]

class CC_HANDOVER_REQ (MMEPayload):
    """Handles the CC_HANDOVER.REQ MME."""
    name = "HomePlug AV CC_HANDOVER.REQ"""
    fields_desc = [
            ByteEnumField ("soft_hard", 0, {
                0: "SOFT",
                1: "HARD",
                }),
            ByteEnumField ("reason", 0, {
                0x00: "USER_APPOINTED",
                0x01: "CCO_SELECTION",
                0x02: "CCO_LEAVING",
                }),
            ]

class CC_HANDOVER_CNF (MMEPayload):
    """Handles the CC_HANDOVER.CNF MME."""
    name = "HomePlug AV CC_HANDOVER.CNF"""
    fields_desc = [
            ByteEnumField ("result", 0,
                {
                    0: "ACCEPT",
                    1: "REJECT_SOFT_HANDOVER",
                    2: "REJECT_ANY_HANDOVER",
                }),
            ]

class CC_HANDOVER_INFO_IND_sta_info (Packet):
    """Handles the CC_HANDOVER_INFO.IND MME."""
    name = "HomePlug AV CC_HANDOVER_INFO.IND."
    fields_desc = [
            ByteField ("tei", 0),
            MACField ("mac", 0),
            ByteEnumField ("status", 0,
                {
                    0: "ASSOCIATED",
                    1: "AUTHENTICATED",
                }),
            ByteField ("ptei", 0),
            ]

    def extract_padding(self, s):
        return "",s

class CC_HANDOVER_INFO_IND (MMEPayload):
    """Handles the CC_HANDOVER_INFO.IND MME."""
    name = "HomePlug AV CC_HANDOVER_INFO.IND"
    fields_desc = [
            ByteEnumField ("rsc", 0,
                {
                    0: "HOIP",
                    1: "UPDATE_BCCO",
                }),
            ByteField ("backupcco", 0),
            FieldLenField("num", None, count_of="stas",fmt="B"),
            PacketListField ("stas", None, CC_HANDOVER_INFO_IND_sta_info,
                count_from=lambda p: p.num),
            ]

class CC_HANDOVER_INFO_RSP (MMEPayload):
    """Handles the CC_HANDOVER_INFO.RSP MME."""
    name = "HomePlug AV CC_HANDOVER_INFO.RSP"
    fields_desc = [
            ]

class CC_SET_TEI_MAP_REQ (MMEPayload):
    """Handles the CC_SET_TEI_MAP.REQ MME."""
    name = "HomePlug AV CC_SET_TEI_MAP.REQ"
    fields_desc = [
            ]

class CC_SET_TEI_MAP_IND_station (Packet):
    """Handle the station description within the CC_SET_TEI_MAP.IND."""
    fields_desc = [
            ByteField ("tei", 0),
            MACField ("mac", 0),
            ByteEnumField ("status", 0,
                {
                    0: "ASSOCIATED",
                    1: "AUTHENTICATED",
                    2: "DISASSOCIATED",
                }),
            ]

    def extract_padding(self, s):
        return "",s

class CC_SET_TEI_MAP_IND (MMEPayload):
    """Handles the CC_SET_TEI_MAP.IND MME."""
    name = "HomePlug AV CC_SET_TEI_MAP.IND"
    fields_desc = [
            ByteEnumField ("mode", 0,
                {
                    0: "UPDATE",
                    1: "ADD",
                    2: "DELETE",
                }),
            FieldLenField("num", None, count_of="stations",fmt="B"),
            PacketListField ("stations", None, CC_SET_TEI_MAP_IND_station,
                count_from = lambda p: p.num),
            ]

class CC_ASSOC_REQ (MMEPayload):
    """Handles the CC_ASSOC.REQ MME."""
    name = "HomePlug AV CC_ASSOC.REQ"
    fields_desc = [
            ByteEnumField ("reqtype", 0, {
                0: "NEW",
                1: "RENEW",
                }),
            HPAVNIDField ("nid", 0),
            ByteEnumField ("cco_cap", 0, HPAV_CCO_LEVEL),
            ByteField ("proxy_cap", 0)
            ]

class CC_ASSOC_CNF (MMEPayload):
    """Handles the CC_ASSOC.CNF MME."""
    name = "HomePlug AV CC_ASSOC.CNF"
    fields_desc = [
            ByteEnumField ("result", 0, HPAV_RESULT),
            HPAVNIDField ("nid", 0),
            ByteField ("snid", 0),
            ByteField ("stei", 0),
            LEShortField ("tei_lease", 0),
            ]

if __name__ == '__main__':
    m = CC_WHO_RU_REQ (nid = 0x03c3ffdd7d22d5)
    hexdump (str (m))
    s = CC_WHO_RU_REQ (str (m))
    print hex (s.nid)