1ed91ae7fSBjoern A. Zeeb#!/usr/bin/env python 2ed91ae7fSBjoern A. Zeeb#- 3ed91ae7fSBjoern A. Zeeb# SPDX-License-Identifier: BSD-2-Clause 4ed91ae7fSBjoern A. Zeeb# 5ed91ae7fSBjoern A. Zeeb# Copyright (c) 2019 Netflix, Inc. 6ed91ae7fSBjoern A. Zeeb# 7ed91ae7fSBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without 8ed91ae7fSBjoern A. Zeeb# modification, are permitted provided that the following conditions 9ed91ae7fSBjoern A. Zeeb# are met: 10ed91ae7fSBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright 11ed91ae7fSBjoern A. Zeeb# notice, this list of conditions and the following disclaimer. 12ed91ae7fSBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright 13ed91ae7fSBjoern A. Zeeb# notice, this list of conditions and the following disclaimer in the 14ed91ae7fSBjoern A. Zeeb# documentation and/or other materials provided with the distribution. 15ed91ae7fSBjoern A. Zeeb# 16ed91ae7fSBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17ed91ae7fSBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18ed91ae7fSBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19ed91ae7fSBjoern A. Zeeb# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20ed91ae7fSBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21ed91ae7fSBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22ed91ae7fSBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23ed91ae7fSBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24ed91ae7fSBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25ed91ae7fSBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ed91ae7fSBjoern A. Zeeb# SUCH DAMAGE. 27ed91ae7fSBjoern A. Zeeb# 28ed91ae7fSBjoern A. Zeeb# 29ed91ae7fSBjoern A. Zeeb 30ed91ae7fSBjoern A. Zeebimport argparse 31*a26e895fSKristof Provostimport logging 32*a26e895fSKristof Provostlogging.getLogger("scapy").setLevel(logging.CRITICAL) 33ed91ae7fSBjoern A. Zeebimport scapy.all as sp 34ed91ae7fSBjoern A. Zeebimport socket 35ed91ae7fSBjoern A. Zeebimport sys 36ed91ae7fSBjoern A. Zeeb 37ed91ae7fSBjoern A. Zeebdef main(): 38ed91ae7fSBjoern A. Zeeb parser = argparse.ArgumentParser("scapyi386.py", 39ed91ae7fSBjoern A. Zeeb description="IPv6 Ethernet Dest MAC test") 40ed91ae7fSBjoern A. Zeeb parser.add_argument('--sendif', nargs=1, 41ed91ae7fSBjoern A. Zeeb required=True, 42ed91ae7fSBjoern A. Zeeb help='The interface through which the packet will be sent') 43ed91ae7fSBjoern A. Zeeb parser.add_argument('--recvif', nargs=1, 44ed91ae7fSBjoern A. Zeeb required=True, 45ed91ae7fSBjoern A. Zeeb help='The interface on which to check for the packet') 46ed91ae7fSBjoern A. Zeeb parser.add_argument('--src', nargs=1, 47ed91ae7fSBjoern A. Zeeb required=True, 48ed91ae7fSBjoern A. Zeeb help='The source IP address') 49ed91ae7fSBjoern A. Zeeb parser.add_argument('--to', nargs=1, 50ed91ae7fSBjoern A. Zeeb required=True, 51ed91ae7fSBjoern A. Zeeb help='The destination IP address') 52ed91ae7fSBjoern A. Zeeb parser.add_argument('--debug', 53ed91ae7fSBjoern A. Zeeb required=False, action='store_true', 54ed91ae7fSBjoern A. Zeeb help='Enable test debugging') 55ed91ae7fSBjoern A. Zeeb 56ed91ae7fSBjoern A. Zeeb args = parser.parse_args() 57ed91ae7fSBjoern A. Zeeb 58ed91ae7fSBjoern A. Zeeb ######################################################################## 59ed91ae7fSBjoern A. Zeeb # 60ed91ae7fSBjoern A. Zeeb # A test case to check that IPv6 packets are sent with a proper 61ed91ae7fSBjoern A. Zeeb # (resolved) Ethernet Destination MAC address instead of the BCAST one. 62ed91ae7fSBjoern A. Zeeb # This was needed as test cases did not work properly on i386 due to a 63ed91ae7fSBjoern A. Zeeb # scapy BPF parsing bug. (See PR 239380 and duplicates). 64ed91ae7fSBjoern A. Zeeb # 65ed91ae7fSBjoern A. Zeeb bcmac = sp.Ether(dst="ff:ff:ff:ff:ff:ff").dst 66ed91ae7fSBjoern A. Zeeb data = "6" * 88 67ed91ae7fSBjoern A. Zeeb pkt = sp.Ether() / \ 68ed91ae7fSBjoern A. Zeeb sp.IPv6(src=args.src[0], dst=args.to[0]) / \ 69ed91ae7fSBjoern A. Zeeb sp.UDP(dport=3456, sport=6543) / \ 70ed91ae7fSBjoern A. Zeeb data 71ed91ae7fSBjoern A. Zeeb sp.sendp(pkt, iface=args.sendif[0], verbose=False) 72ed91ae7fSBjoern A. Zeeb 73ed91ae7fSBjoern A. Zeeb eth = pkt.getlayer(sp.Ether) 74ed91ae7fSBjoern A. Zeeb if eth is None: 75ed91ae7fSBjoern A. Zeeb print("No Ether in packet") 76ed91ae7fSBjoern A. Zeeb pkt.display() 77ed91ae7fSBjoern A. Zeeb sys.exit(1) 78ed91ae7fSBjoern A. Zeeb if eth.dst == bcmac: 79ed91ae7fSBjoern A. Zeeb print("Broadcast dMAC on packet") 80ed91ae7fSBjoern A. Zeeb eth.display() 81ed91ae7fSBjoern A. Zeeb sys.exit(1) 82ed91ae7fSBjoern A. Zeeb 83ed91ae7fSBjoern A. Zeeb sys.exit(0) 84ed91ae7fSBjoern A. Zeeb 85ed91ae7fSBjoern A. Zeebif __name__ == '__main__': 86ed91ae7fSBjoern A. Zeeb main() 87