.. _streams: Traffic Streams =============== Traffic streams allow doing various forwarding verification and QoS tests using BNG Blaster. .. image:: images/bbl_streams.png :alt: Interactive Streams Traffic streams are divided into bounded and RAW streams. The first one is bound to an access configuration and derives addresses dynamically from the sessions. RAW streams are supported from :ref:`network interfaces ` only. Configuration ~~~~~~~~~~~~~ Following a simple PPPoE example with streams. .. code-block:: json { "interfaces": { "network": { "interface": "eth2", "address": "10.0.0.1/24", "gateway": "10.0.0.2", "address-ipv6": "fc66:1337:7331::1/64", "gateway-ipv6": "fc66:1337:7331::2" }, "access": [ { "interface": "eth1", "outer-vlan-min": 1001, "outer-vlan-max": 2000, "inner-vlan-min": 7, "inner-vlan-max": 7, "type": "pppoe", "stream-group-id": 1 }, { "interface": "eth1", "outer-vlan-min": 2001, "outer-vlan-max": 4000, "inner-vlan": 7, "type": "pppoe", "stream-group-id": 2 } ] }, "streams": [ { "name": "BestEffort", "stream-group-id": 1, "type": "ipv4", "direction": "both", "pps": 1000 }, { "name": "Voice", "stream-group-id": 1, "type": "ipv4", "direction": "downstream", "priority": 128, "vlan-priority": 2, "network-ipv4-address": "10.0.0.10", "pps": 100 }, { "name": "BestEffort", "stream-group-id": 2, "type": "ipv4", "direction": "both", "pps": 1 } ] } .. include:: configuration/streams.rst Stream Configuration File ~~~~~~~~~~~~~~~~~~~~~~~~~ The command line argument ``-T `` allows the include of streams defined in a separate file. The format is equal to streams defined in the actual configuration file. Such stream configuration files could be generated by scripts and easily merged with the base configuration. .. code-block:: json { "streams": [] } Stream Commands ~~~~~~~~~~~~~~~ The ``session-streams`` command returns detailed stream statistics per session. ``$ sudo bngblaster-cli run.sock session-streams session-id 1`` .. code-block:: json { "status": "ok", "code": 200, "session-streams": { "session-id": 1, "rx-packets": 59670, "tx-packets": 54610, "rx-accounting-packets": 59655, "tx-accounting-packets": 54594, "rx-pps": 1100, "tx-pps": 1000, "rx-bps-l2": 9028800, "tx-bps-l2": 8240000, "rx-mbps-l2": 9.0288, "tx-mbps-l2": 8.24, "streams": [ { "name": "BestEffort", "direction": "upstream", "flow-id": 1, "rx-first-seq": 362, "rx-last-seq": 54593, "rx-tos-tc": 0, "rx-outer-vlan-pbit": 0, "rx-inner-vlan-pbit": 0, "rx-len": 1014, "tx-len": 1030, "rx-packets": 54232, "tx-packets": 54594, "rx-loss": 0, "rx-delay-us-min": 37, "rx-delay-us-max": 98595, "rx-pps": 1000, "tx-pps": 1000, "tx-bps-l2": 8240000, "rx-bps-l2": 8112000, "rx-bps-l3": 8000000, "tx-mbps-l2": 8.24, "rx-mbps-l2": 8.112, "rx-mbps-l3": 8.0 }, { "name": "BestEffort", "direction": "downstream", "flow-id": 2, "rx-first-seq": 362, "rx-last-seq": 54593, "rx-tos-tc": 0, "rx-outer-vlan-pbit": 0, "rx-inner-vlan-pbit": 0, "rx-len": 1026, "tx-len": 1014, "rx-packets": 54232, "tx-packets": 54594, "rx-loss": 0, "rx-delay-us-min": 43, "rx-delay-us-max": 98903, "rx-pps": 1000, "tx-pps": 1000, "tx-bps-l2": 8112000, "rx-bps-l2": 8208000, "rx-bps-l3": 8000000, "tx-mbps-l2": 8.112, "rx-mbps-l2": 8.208, "rx-mbps-l3": 8.0 }, { "name": "Voice", "direction": "downstream", "flow-id": 3, "rx-first-seq": 37, "rx-last-seq": 5458, "rx-tos-tc": 128, "rx-outer-vlan-pbit": 0, "rx-inner-vlan-pbit": 0, "rx-len": 1026, "tx-len": 1014, "rx-packets": 5422, "tx-packets": 5458, "rx-loss": 0, "rx-delay-us-min": 41, "rx-delay-us-max": 96548, "rx-pps": 100, "tx-pps": 100, "tx-bps-l2": 811200, "rx-bps-l2": 820800, "rx-bps-l3": 800000, "tx-mbps-l2": 0.8112, "rx-mbps-l2": 0.8208, "rx-mbps-l3": 0.8 } ] } } The ``rx-outer-vlan-pbit`` might be wrong depending on the network interface driver and optional VLAN offloading. The measured ``rx-delay-us-min/max`` shows the minimum and maximum calculated delay in microseconds. The delay is calculated by subtracting the send and receive timestamp. The send timestamp is stored in the BBL header (see section Traffic). This calculated result depends also on the actual test environment, configured rx-interval and host IO delay. Traffic streams will start as soon as the session is established using the rate as configured starting with sequence number 1 for each flow. The attribute ``rx-first-seq`` stores the first sequence number received. Assuming the first sequence number received for a given flow is 1000 combined with a rate of 1000 PPS would mean that it took around 1 second until forwarding is working. After the first packet is received for a given flow, for every further packet it checks if there is a gap between the last and new sequence number which is then reported as a loss. The ``rx/tx-accounting-packets`` are all packets that should be counted in the session volume accounting of the BNG, meaning session RX/TX packets excluding control traffic. Each flow can be queried separately using jsonpath expression with name and direction or flow-id. .. code-block:: none $ sudo bngblaster-cli run.sock session-streams session-id 1 | jq '."session-streams".streams[] | select(.name == "BE" and .direction == "downstream" )' .. code-block:: json { "name": "BE", "direction": "downstream", "flow-id": 2, "rx-first-seq": 33, "rx-last-seq": 27040, "rx-tos-tc": 213, "rx-outer-vlan-pbit": 0, "rx-inner-vlan-pbit": 0, "rx-len": 126, "tx-len": 114, "rx-packets": 27008, "tx-packets": 27040, "rx-loss": 0, "rx-delay-us-min": 50, "rx-delay-us-max": 10561, "rx-pps": 99, "tx-pps": 99, "tx-bps-l2": 90288, "rx-bps-l2": 99792, "rx-bps-l3": 79200, "tx-mbps-l2": 0.090288, "rx-mbps-l2": 0.099792, "rx-mbps-l3": 0.0792 } RAW Streams ~~~~~~~~~~~ Streams with default ``stream-group-id`` set to zero are considered raw streams not bound to any session which is supported downstream only. For those streams, the destination address must be explicitly set. RAW streams can be used for traffic between two or network interfaces but also to send traffic from network to access interfaces. .. code-block:: json { "streams": [ { "name": "RAW", "type": "ipv4", "direction": "downstream", "priority": 128, "network-ipv4-address": "10.0.0.20", "destination-ipv4-address": "1.1.1.1", "length": 256, "pps": 1 } ] } If ``destination-ipv4-address`` is set to a multicast IP address (224.0.0.0 - 239.255.255.255), the BNG Blaster will set the destination MAC address to the corresponding multicast MAC address automatically. For unicast traffic the network gateway MAC address is used. Start/Stop Session Stream Traffic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Session stream traffic can be started/stopped dynamically using the commands ``stream-traffic-enabled`` and ``stream-traffic-disabled``. ``$ sudo bngblaster-cli run.sock stream-traffic-disabled session-id 1`` Those commands start/stop the traffic for all sessions if invoked without session identifier. ``$ sudo bngblaster-cli run.sock stream-traffic-disabled`` Alternatively, all the session and stream traffic (including RAW streams) can be started or stopped globally using the ``traffic-start`` and ``traffic-stop`` commands. .. _bbl_header: BNG Blaster Traffic ~~~~~~~~~~~~~~~~~~~ *Blaster Header and Fast Decode Signature* The 48 Byte fixed size BNG Blaster Header is added to all data packets for traffic validation and fast decoding. The header is expected on the last 48 bytes of the packet. The type is set to 1 for all unicast session traffic and 2 for IPv4 multicast traffic. Unicast Session Traffic ^^^^^^^^^^^^^^^^^^^^^^^ The 64-bit session key is used for all traffic from access (upstream) and to access (downstream) interfaces to identify the corresponding session which has sent or should receive the packet. .. code-block:: none 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | BNG Blaster Magic Sequence | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Sub-Type | Direction | TX TOS | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Session Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Session Access Interface Index | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Session Outer VLAN | Session Inner VLAN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flow Identifier | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flow Sequence Number | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Nanosecond Send Timestamp | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ .. image:: images/bbl_header.png :alt: BNG Blaster Header Multicast Traffic ^^^^^^^^^^^^^^^^^ .. code-block:: none 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | BNG Blaster Magic Sequence | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Sub-Type | Direction | TX TOS | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Group | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flow Identifier | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flow Sequence Number | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Nanosecond Send Timestamp | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ .. note:: All attributes except IP addresses in the Blaster Header are stored in host byte order for faster processing (LE or BE depending on the test system). BNG Blaster Magic Sequence ^^^^^^^^^^^^^^^^^^^^^^^^^^ The 64-bit magic sequence is the word ``RtBrick!`` decoded as ASCII: .. code-block:: none 0x5274427269636b21 Storing the magic number on a fixed offset allows fast identification of blaster traffic. Flow Identifier ^^^^^^^^^^^^^^^ The 64-bit flow identifier is a globally unique number that identifies the flow. Flow Sequence Number ^^^^^^^^^^^^^^^^^^^^ The 64-bit flow sequence number is a sequential number starting with 1 and incremented per packet primary used to identify packet loss. This number 0 means that sequencing is disabled. Nanosecond Send Timestamps ^^^^^^^^^^^^^^^^^^^^^^^^^^ The 64-bit nanoseconds send timestamp is used for optional latency and jitter calculations. .. code-block:: none 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Seconds | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Nano Seconds | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ The timestamp 0 means that timestamps are disabled.