summaryrefslogtreecommitdiffstats
path: root/src/vnet/ip/reass
AgeCommit message (Collapse)AuthorFilesLines
2019-12-16vppinfra: bihash walk cb typedef and continue/stop controlsNeale Ranns4-4/+8
Type: feature Change-Id: I28f7a658be3f3beec9ea32635b60d1d3a10d9b06 Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-12-13ip: SVR: fix wrong return valueKlement Sekera2-2/+2
Type: fix Change-Id: I9498b660bf2045bb6aac96d19bb9456a14b35847 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-10-28ip: reassembly fix sanity checksKlement Sekera2-5/+5
use correct value for sanity checks Type: fix Change-Id: If33db5ce3e4a26f7876c2a67832ca2947563e211 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-10-28ip: reassembly: fix use-after-freeBenoît Ganne2-5/+10
When processing the last buffer of a reassembled packet, the current buffer will be freed and must be reloaded using the updated index. Type: fix Change-Id: Ib39e29e60eb527b4cd4828a3aa37d82c8dddd709 Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-10-11ip: reassembly: trace ip headers over worker handoffsKlement Sekera2-7/+66
This change adds tracing of IP headers when doing a handoff between worker threads. This eases debugging. Type: feature Change-Id: I2195b070a364cba13a658ec1cee5154fc4c3a8b0 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-10-09map: use ip6-full-reassembly instead of own codeKlement Sekera4-0/+70
Remove map's implementation of reassembly and use common ip6-full-reassembly functionality. This makes it easier to maintain by removing duplicate code/functionality. Type: refactor Change-Id: I430e888b704e28c100a9ce075d1460cb529e4676 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-10-07ip: remove dead code in ip6-svrKlement Sekera1-27/+0
Type: fix Fixes: de34c35fc73226943538149fae9dbc5cfbdc6e75 Change-Id: Ia714c2e46627864091d3f686dbced4cdd9c1a773 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-10-07ip: reassembly add missing gotoKlement Sekera1-0/+1
Type: fix Fixes: de34c35fc73226943538149fae9dbc5cfbdc6e75 Change-Id: I256ef153b3b27a1f7ab7daa45015a2ec4bc84076 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-10-07ip: reassembly remove dead codeKlement Sekera1-8/+0
Type: fix Fixes: de34c35fc73226943538149fae9dbc5cfbdc6e75 Change-Id: I79589f648f4c75762e5277fb94636a91fa36ccdd Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-09-30ip: svr: fix feature refcountsKlement Sekera2-14/+20
Reference counts need to be per-interface as opposed to global. This allows configuring the feature on more than one interface correctly. Type: fix Fixes: de34c35fc73226943538149fae9dbc5cfbdc6e75 Change-Id: I05534ac59fa86e67290737ec6c61df2c19acab48 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-09-26ip: fix use-after-free in reassemblyBenoît Ganne2-6/+8
- ip{4,6}_reass_finalize() frees the reassembly context: do not access it after the call. - traces access reassembly context: free it after and not before tracing. Type: fix Change-Id: Ia3aaea9c7b74932e249e013be04b9bd7298fd187 Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-09-26ip: add shallow virtual reassembly functionalityKlement Sekera6-52/+2664
Type: feature Change-Id: Ibc8334e26c7e6f6120696c3e313b6e11d73dab99 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-09-25ip: respect buffer boundary when searching for ipv6 headersKlement Sekera1-4/+7
Type: fix Change-Id: I5a5461652f8115fa1270e20f748178fb5f5450f2 Signed-off-by: Klement Sekera <ksekera@cisco.com>
2019-09-25ip: refactor reassemblyKlement Sekera4-0/+3738
this is a preparation step for introducing other reassembly types Type: refactor Change-Id: I197e299dbd729b00eead31667913b8ceff915d63 Signed-off-by: Klement Sekera <ksekera@cisco.com>
8' href='#n208'>208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
# Copyright (c) 2021 Cisco and/or its affiliates.
#
# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
#
# Licensed under the Apache License 2.0 or
# GNU General Public License v2.0 or later;  you may not use this file
# except in compliance with one of these Licenses. You
# may obtain a copy of the Licenses at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
#
# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
# must be under GPLv2+.  If at any point in the future it is no longer linked
# with Scapy (or other GPLv2+ licensed software), you are free to choose
# Apache 2.
#
# 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.

"""Stream profile for T-rex traffic generator.

Stream profile:
 - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
 - Packet: ETH / DOT1Q / IP / VXLAN / ETH / IP
 - Direction 0 --> 1:
   - VLAN range:                       100
   - Source IP address:                172.17.[0..9].2
   - Destination IP address:           172.16.0.1
   - Source UDP port:                  random([1024..65535])
   - Destination UDP port:             4789
   - VXLAN VNI:                        [0..9]
   - Payload source MAC address:       00:aa:aa:00:00:[00..ff]
   - Payload source IP address:        10.0.[0..255].2
   - Payload destination MAC address:  00:bb:bb:00:00:[00..ff]
   - Payload destination IP address:   10.0.[0..255].1
 - Direction 1 --> 0:
   - VLAN range:                       200
   - Source IP address:                172.27.[0..9].2
   - Destination IP address:           172.26.0.1
   - Source UDP port:                  random([1024..65535])
   - Destination UDP port:             4789
   - VXLAN VNI:                        [0..9]
   - Payload source MAC address:       00:bb:bb:00:00:[00..ff]
   - Payload source IP address:        10.0.[0..255].1
   - Payload destination MAC address:  00:aa:aa:00:00:[00..ff]
   - Payload destination IP address:   10.0.[0..255].2
"""

from trex.stl.api import *
from profile_trex_stateless_base_class import TrafficStreamsBaseClass

# RFC 7348 - Virtual eXtensible Local Area Network (VXLAN):
# A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks
# http://tools.ietf.org/html/rfc7348
_VXLAN_FLAGS = list(u"R"*24 + u"RRRIRRRRR")


class VXLAN(Packet):
    name=u"VXLAN"
    fields_desc = [
        FlagsField(u"flags", 0x08000000, 32, _VXLAN_FLAGS),
        ThreeBytesField(u"vni", 0),
        XByteField(u"reserved", 0x00)
    ]

    def mysummary(self):
        return self.sprintf(u"VXLAN (vni=%VXLAN.vni%)")


bind_layers(UDP, VXLAN, dport=4789)
bind_layers(VXLAN, Ether)


class TrafficStreams(TrafficStreamsBaseClass):
    """Stream profile."""

    def __init__(self):
        """Initialization and setting of streams' parameters."""

        super(TrafficStreamsBaseClass, self).__init__()

        self.nf_chains = 10

    def define_packets(self):
        """Defines the packets to be sent from the traffic generator.

        Packet definition: | ETH | DOT1Q | IP | VXLAN | ETH | IP

        :returns: Packets to be sent from the traffic generator.
        :rtype: tuple
        """

        # Direction 0 --> 1
        base_pkt_a = (
            Ether()/
            Dot1Q(
                vlan=100
            ) /
            IP(
                src=u"172.17.0.2",
                dst=u"172.16.0.1"
            )/
            UDP(
                sport=1024,
                dport=4789
            )/
            VXLAN(
                vni=0
            )/
            Ether(
                src=u"00:aa:aa:00:00:00",
                dst=u"00:bb:bb:00:00:00"
            )/
            IP(
                src=u"10.0.0.2",
                dst=u"10.0.0.1",
                proto=61
            )
        )

        # Direction 1 --> 0
        base_pkt_b = (
            Ether()/
            Dot1Q(
                vlan=200
            ) /
            IP(
                src=u"172.27.0.2",
                dst=u"172.26.0.1"
            )/
            UDP(
                sport=1024,
                dport=4789
            )/
            VXLAN(
                vni=0
            )/
            Ether(
                src=u"00:bb:bb:00:00:00",
                dst=u"00:aa:aa:00:00:00"
            )/
            IP(
                src=u"10.0.0.1",
                dst=u"10.0.0.2",
                proto=61
            )
        )

        # Direction 0 --> 1
        vm1 = STLScVmRaw(
            [
                STLVmFlowVar(
                    name=u"nf_id",
                    size=1,
                    op=u"inc",
                    min_value=0,
                    max_value=self.nf_chains - 1
                ),
                STLVmFlowVar(
                    name=u"in_mac",
                    size=2,
                    op=u"inc",
                    min_value=0,
                    max_value=255
                ),
                STLVmFlowVar(
                    name=u"in_ip",
                    size=1,
                    op=u"inc",
                    min_value=0,
                    max_value=255
                ),
                STLVmFlowVar(
                    name=u"src_port",
                    size=2,
                    op=u"random",
                    min_value=1024,
                    max_value=65535
                ),
                STLVmWrFlowVar(
                    fv_name=u"nf_id",
                    pkt_offset=32
                ),
                STLVmWrFlowVar(
                    fv_name=u"src_port",
                    pkt_offset=u"UDP.sport"
                ),
                STLVmWrFlowVar(
                    fv_name=u"nf_id",
                    pkt_offset=52
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_mac",
                    pkt_offset=58
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_mac",
                    pkt_offset=64
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_ip",
                    pkt_offset=82
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_ip",
                    pkt_offset=86
                ),
                STLVmFixChecksumHw(
                    l3_offset="IP:{}".format(0),
                    l4_offset="UDP:{}".format(0),
                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
                )
            ]
        )

        # Direction 1 --> 0
        vm2 = STLScVmRaw(
            [
                STLVmFlowVar(
                    name=u"nf_id",
                    size=1,
                    op=u"inc",
                    min_value=0,
                    max_value=self.nf_chains - 1
                ),
                STLVmFlowVar(
                    name=u"in_mac",
                    size=2, op=u"inc",
                    min_value=0,
                    max_value=255
                ),
                STLVmFlowVar(
                    name=u"in_ip",
                    size=1,
                    op=u"inc",
                    min_value=0,
                    max_value=255
                ),
                STLVmFlowVar(
                    name=u"src_port",
                    size=2,
                    op=u"random",
                    min_value=1024,
                    max_value=65535
                ),
                STLVmWrFlowVar(
                    fv_name=u"nf_id",
                    pkt_offset=32
                ),
                STLVmWrFlowVar(
                    fv_name=u"src_port",
                    pkt_offset=u"UDP.sport"
                ),
                STLVmWrFlowVar(
                    fv_name=u"nf_id",
                    pkt_offset=52
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_mac",
                    pkt_offset=58
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_mac",
                    pkt_offset=64
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_ip",
                    pkt_offset=82
                ),
                STLVmWrFlowVar(
                    fv_name=u"in_ip",
                    pkt_offset=86
                ),
                STLVmFixChecksumHw(
                    l3_offset="IP:{}".format(0),
                    l4_offset="UDP:{}".format(0),
                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
                )
            ]
        )

        return base_pkt_a, base_pkt_b, vm1, vm2

def register():
    """Register this traffic profile to T-rex.

    Do not change this function.

    :return: Traffic streams.
    :rtype: Object
    """
    return TrafficStreams()