create a BFD packet, reflecting the current state of session
(self)
| 747 | bfd.auth_type = self.auth_type |
| 748 | |
| 749 | def create_packet(self): |
| 750 | """create a BFD packet, reflecting the current state of session""" |
| 751 | if self.sha1_key: |
| 752 | bfd = BFD(flags="A") |
| 753 | bfd.auth_type = self.sha1_key.auth_type |
| 754 | bfd.auth_len = BFD.sha1_auth_len |
| 755 | bfd.auth_key_id = self.bfd_key_id |
| 756 | bfd.auth_seq_num = self.our_seq_number |
| 757 | bfd.length = BFD.sha1_auth_len + BFD.bfd_pkt_len |
| 758 | else: |
| 759 | bfd = BFD() |
| 760 | packet = Ether( |
| 761 | src=self.phy_interface.remote_mac, dst=self.phy_interface.local_mac |
| 762 | ) |
| 763 | if self.tunnel_header: |
| 764 | packet = packet / self.tunnel_header |
| 765 | if self.af == AF_INET6: |
| 766 | packet = ( |
| 767 | packet |
| 768 | / IPv6( |
| 769 | src=self.peer_addr, |
| 770 | dst=self.local_addr, |
| 771 | hlim=255, |
| 772 | ) |
| 773 | / UDP(sport=self.udp_sport, dport=BFD.udp_dport) |
| 774 | / bfd |
| 775 | ) |
| 776 | else: |
| 777 | packet = ( |
| 778 | packet |
| 779 | / IP(src=self.peer_addr, dst=self.local_addr, ttl=255) |
| 780 | / UDP(sport=self.udp_sport, dport=BFD.udp_dport) |
| 781 | / bfd |
| 782 | ) |
| 783 | self.test.logger.debug("BFD: Creating packet") |
| 784 | self.fill_packet_fields(packet) |
| 785 | if self.sha1_key: |
| 786 | hash_material = ( |
| 787 | scapy.compat.raw(packet[BFD])[:32] |
| 788 | + self.sha1_key.key |
| 789 | + b"\0" * (20 - len(self.sha1_key.key)) |
| 790 | ) |
| 791 | self.test.logger.debug( |
| 792 | "BFD: Calculated SHA1 hash: %s" |
| 793 | % hashlib.sha1(hash_material).hexdigest() |
| 794 | ) |
| 795 | packet[BFD].auth_key_hash = hashlib.sha1(hash_material).digest() |
| 796 | return packet |
| 797 | |
| 798 | def send_packet(self, packet=None, interface=None): |
| 799 | """send packet on interface, creating the packet if needed""" |
no test coverage detected