summaryrefslogtreecommitdiffstats
path: root/.gitignore
AgeCommit message (Expand)AuthorFilesLines
2017-01-13vppctl: new bash completion for vppctl commandsPadraig Connolly1-0/+3
2017-01-01Move java,lua api and remaining plugins to src/Damjan Marion1-5/+5
2016-12-09Add make test code coverage reporting using gcovJuraj Sloboda1-0/+1
2016-11-22GRE tests and fixesNeale Ranns1-0/+3
2016-11-01fix typo in .gitignoreKlement Sekera1-1/+1
2016-10-31add vpp debugging support to test frameworkKlement Sekera1-0/+2
2016-10-25Add generated python bindings to .gitignoreMarek Gradzki1-0/+5
2016-09-21A Protocol Independent Hierarchical FIB (VPP-352)Neale Ranns1-2/+2
2016-08-31VPP-221 CLI auto-documentation infrastructureChris Luke1-0/+3
2016-08-30VPP-364 Add vpp-api/python/build to gitignoreFlorin Coras1-0/+2
2016-08-25VPP Python language binding - plugin supportOle Troan1-2/+2
2016-08-16Create python package for jvpp generation.Ed Warnicke1-0/+3
2016-08-12VPP-237: Checkstyle script to check for new checkstyle breakageEd Warnicke1-0/+3
2016-07-21Updating gitignore for generated plugins folderKeith Burns (alagalah)1-0/+1
2016-06-19gitignore gtagsKeith Burns (alagalah)1-0/+4
2016-06-14gitignore change due to DPDK download suffix changeKeith Burns (alagalah)1-0/+1
2016-05-13VPP-57 Add Doxygen to VPPChris Luke1-0/+3
2016-05-12Generate jvpp sources in build-rootMaros Marsalek1-5/+0
2016-05-02HONEYCOMB-10: jVpp - the new java API. C code and jar file generationMarek Gradzki1-0/+6
2016-04-24Updated .gitignore for Python API generated fileKeith Burns (alagalah)1-0/+1
2016-04-12Add unit test infrastructure for LISP protocolFilip Tehlar1-0/+1
2016-03-25Add build-root/*.rpm to .gitignoreEd Warnicke1-0/+1
2016-03-18add ctags and cscope files to .gitignoreDamjan Marion1-0/+4
2016-03-04gitignoreMaros Marsalek1-0/+5
2016-02-01Add a vpp-dpdk-dev package, enable plugins to use dpdk APIs directlyDave Barach1-0/+1
2016-01-31Git ignore additionsKeith Burns (alagalah)1-0/+5
2015-12-23ylwrap is also autotools autogenerated fileDamjan Marion1-0/+1
2015-12-16Update .gitignore to ignore autotools filesEd Warnicke1-1/+25
2015-12-08Initial commit of vpp code.v1.0.0Ed Warnicke1-0/+15
ight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
#!/usr/bin/env python

# Copyright (c) 2016 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Traffic script for IPv6 Neighbor Solicitation test."""

import sys
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from resources.libraries.python.PacketVerifier import RxQueue, TxQueue
from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6ND_NS
from scapy.layers.inet6 import ICMPv6NDOptDstLLAddr, ICMPv6NDOptSrcLLAddr
from scapy.all import Ether


def main():
    args = TrafficScriptArg(['src_mac', 'dst_mac', 'src_ip', 'dst_ip'])

    rxq = RxQueue(args.get_arg('rx_if'))
    txq = TxQueue(args.get_arg('tx_if'))

    src_mac = args.get_arg('src_mac')
    dst_mac = args.get_arg('dst_mac')
    src_ip = args.get_arg('src_ip')
    dst_ip = args.get_arg('dst_ip')

    sent_packets = []

    # send ICMPv6 neighbor solicitation message
    pkt_send = (Ether(src=src_mac, dst='ff:ff:ff:ff:ff:ff') /
                      IPv6(src=src_ip, dst='ff02::1:ff00:2') /
                      ICMPv6ND_NS(tgt=dst_ip) /
                      ICMPv6NDOptSrcLLAddr(lladdr=src_mac))
    sent_packets.append(pkt_send)
    txq.send(pkt_send)

    # receive ICMPv6 neighbor advertisement message
    ether = rxq.recv(2, sent_packets)
    if ether is None:
        rxq._proc.terminate()
        raise RuntimeError('ICMPv6 echo reply Rx timeout')

    if not ether.haslayer(IPv6):
        rxq._proc.terminate()
        raise RuntimeError('Unexpected packet with no IPv6 received {0}'.format(
            ether.__repr__()))

    ipv6 = ether['IPv6']

    if not ipv6.haslayer(ICMPv6ND_NA):
        rxq._proc.terminate()
        raise RuntimeError(
            'Unexpected packet with no ICMPv6 ND-NA received {0}'.format(
                ipv6.__repr__()))

    icmpv6_na = ipv6['ICMPv6 Neighbor Discovery - Neighbor Advertisement']

    # verify target address
    if icmpv6_na.tgt != dst_ip:
        rxq._proc.terminate()
        raise RuntimeError('Invalid target address {0} should be {1}'.format(
            icmpv6_na.tgt, dst_ip))

    if not icmpv6_na.haslayer(ICMPv6NDOptDstLLAddr):
        rxq._proc.terminate()
        raise RuntimeError(
            'Missing Destination Link-Layer Address option in ICMPv6 ' +
            'Neighbor Advertisement {0}'.format(icmpv6_na.__repr__()))

    option = 'ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address'
    dst_ll_addr = icmpv6_na[option]

    # verify destination link-layer address field
    if dst_ll_addr.lladdr != dst_mac:
        rxq._proc.terminate()
        raise RuntimeError('Invalid lladdr {0} should be {1}'.format(
            dst_ll_addr.lladdr, dst_mac))

    # verify checksum
    cksum = icmpv6_na.cksum
    del icmpv6_na.cksum
    tmp = ICMPv6ND_NA(str(icmpv6_na))
    if tmp.cksum != cksum:
        rxq._proc.terminate()
        raise RuntimeError(
            'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))

    rxq._proc.terminate()
    sys.exit(0)

if __name__ == "__main__":
    main()