| 148 | |
| 149 | |
| 150 | class VTP(Packet): |
| 151 | name = "VTP" |
| 152 | fields_desc = [ |
| 153 | ByteField("ver", 2), |
| 154 | ByteEnumField("code", 1, _VTP_Types), |
| 155 | ConditionalField(ByteField("followers", 1), |
| 156 | lambda pkt:pkt.code == 1), |
| 157 | ConditionalField(ByteField("seq", 1), |
| 158 | lambda pkt:pkt.code == 2), |
| 159 | ConditionalField(ByteField("reserved", 0), |
| 160 | lambda pkt:pkt.code == 3), |
| 161 | ByteField("domnamelen", None), |
| 162 | StrFixedLenField("domname", "manbearpig", 32), |
| 163 | ConditionalField(SignedIntField("rev", 0), |
| 164 | lambda pkt:pkt.code == 1 or |
| 165 | pkt.code == 2), |
| 166 | # updater identity |
| 167 | ConditionalField(IPField("uid", "192.168.0.1"), |
| 168 | lambda pkt:pkt.code == 1), |
| 169 | ConditionalField(VTPTimeStampField("timestamp", '930301000000'), |
| 170 | lambda pkt:pkt.code == 1), |
| 171 | ConditionalField(StrFixedLenField("md5", b"\x00" * 16, 16), |
| 172 | lambda pkt:pkt.code == 1), |
| 173 | ConditionalField( |
| 174 | PacketListField("vlaninfo", [], VTPVlanInfo), |
| 175 | lambda pkt: pkt.code == 2), |
| 176 | ConditionalField(ShortField("startvalue", 0), |
| 177 | lambda pkt:pkt.code == 3) |
| 178 | ] |
| 179 | |
| 180 | def post_build(self, p, pay): |
| 181 | if self.domnamelen is None: |
| 182 | domnamelen = len(self.domname.strip(b"\x00")) |
| 183 | p = p[:3] + chb(domnamelen & 0xff) + p[4:] |
| 184 | |
| 185 | p += pay |
| 186 | |
| 187 | return p |
| 188 | |
| 189 | |
| 190 | bind_layers(SNAP, VTP, code=0x2003) |
nothing calls this directly
no test coverage detected