BFD protocol layer for scapy
| 117 | |
| 118 | |
| 119 | class BFD(Packet): |
| 120 | """BFD protocol layer for scapy""" |
| 121 | |
| 122 | udp_dport = 3784 #: BFD destination port per RFC 5881 |
| 123 | udp_dport_echo = 3785 # : BFD destination port for ECHO per RFC 5881 |
| 124 | udp_sport_min = 49152 #: BFD source port min value per RFC 5881 |
| 125 | udp_sport_max = 65535 #: BFD source port max value per RFC 5881 |
| 126 | bfd_pkt_len = 24 # : length of BFD pkt without authentication section |
| 127 | sha1_auth_len = 28 # : length of authentication section if SHA1 used |
| 128 | |
| 129 | name = "BFD" |
| 130 | |
| 131 | fields_desc = [ |
| 132 | BitField("version", 1, 3), |
| 133 | BitEnumField("diag", 0, 5, BFDDiagCode.desc_dict), |
| 134 | BitEnumField("state", 0, 2, BFDState.desc_dict), |
| 135 | FlagsField("flags", 0, 6, ["M", "D", "A", "C", "F", "P"]), |
| 136 | XByteField("detect_mult", 0), |
| 137 | BitField("length", bfd_pkt_len, 8), |
| 138 | BitField("my_discriminator", 0, 32), |
| 139 | BitField("your_discriminator", 0, 32), |
| 140 | BitField("desired_min_tx_interval", 0, 32), |
| 141 | BitField("required_min_rx_interval", 0, 32), |
| 142 | BitField("required_min_echo_rx_interval", 0, 32), |
| 143 | ConditionalField( |
| 144 | BitEnumField("auth_type", 0, 8, BFDAuthType.desc_dict), bfd_is_auth_used |
| 145 | ), |
| 146 | ConditionalField(BitField("auth_len", 0, 8), bfd_is_auth_used), |
| 147 | ConditionalField(BitField("auth_key_id", 0, 8), bfd_is_auth_used), |
| 148 | ConditionalField(BitField("auth_reserved", 0, 8), bfd_is_md5_or_sha1_used), |
| 149 | ConditionalField(BitField("auth_seq_num", 0, 32), bfd_is_md5_or_sha1_used), |
| 150 | MultipleTypeField( |
| 151 | [ |
| 152 | (StrField("auth_key_hash", "0" * 16), bfd_is_md5_used), |
| 153 | (StrField("auth_key_hash", "0" * 20), bfd_is_sha1_used), |
| 154 | ], |
| 155 | StrField("auth_key_hash", ""), |
| 156 | ), |
| 157 | ] |
| 158 | |
| 159 | def mysummary(self): |
| 160 | return self.sprintf( |
| 161 | "BFD(my_disc=%BFD.my_discriminator%, your_disc=%BFD.your_discriminator%)" |
| 162 | ) |
| 163 | |
| 164 | |
| 165 | # glue the BFD packet class to scapy parser |