]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
userguide: explain rule types and categorization 12492/head
authorJuliana Fajardini <jufajardini@gmail.com>
Wed, 6 Nov 2024 01:54:50 +0000 (22:54 -0300)
committerVictor Julien <victor@inliniac.net>
Tue, 28 Jan 2025 08:32:49 +0000 (09:32 +0100)
Add documentation about the rule types introduced by commit
2696fda04168cb82.

Add doc tags around code definitions that are referenced in the docs.

Task #https://redmine.openinfosecfoundation.org/issues/7031

14 files changed:
doc/userguide/configuration/suricata-yaml.rst
doc/userguide/devguide/extending/app-layer/transactions.rst
doc/userguide/rules/index.rst
doc/userguide/rules/rule-types.rst [new file with mode: 0644]
doc/userguide/rules/rule-types/APP_Layer-Packet-TX-Stream.png [new file with mode: 0644]
doc/userguide/rules/rule-types/IP-Only.png [new file with mode: 0644]
doc/userguide/rules/rule-types/OverallAlgoHorizontal.png [new file with mode: 0644]
doc/userguide/rules/rule-types/PD-only.png [new file with mode: 0644]
doc/userguide/rules/rule-types/RawFlowcharts/APP_Layer-Packet-TX-Stream.drawio [new file with mode: 0644]
doc/userguide/rules/rule-types/RawFlowcharts/IP-Only.drawio [new file with mode: 0644]
doc/userguide/rules/rule-types/RawFlowcharts/OverallAlgoHorizontal.drawio [new file with mode: 0644]
doc/userguide/rules/rule-types/RawFlowcharts/PD-only.drawio [new file with mode: 0644]
src/detect-engine.c
src/detect.h

index f6b0a7cb4b1fad0f0f9064d246377f626ae1d50b..77eaa32423bd03e602c8be433eeaf649543a2c9e 100644 (file)
@@ -2636,6 +2636,8 @@ Engine analysis and profiling
 Suricata offers several ways of analyzing performance of rules and the
 engine itself.
 
+.. _config:engine-analysis:
+
 Engine-analysis
 ~~~~~~~~~~~~~~~
 
index 1105aad9712873cdbc797bb1bcfce7dd95e70085..180f2d96540ad747095ec9d7cdd788c4ce289cf0 100644 (file)
@@ -1,3 +1,5 @@
+.. _transactions:
+
 ************
 Transactions
 ************
index efe3d83137d8a5d829cad5ade81f363950ad9fe1..57e9f20eb7ac2b677163c001866884c8f7c5e20b 100644 (file)
@@ -51,3 +51,4 @@ Suricata Rules
    tag
    vlan-keywords
    ldap-keywords
+   rule-types
diff --git a/doc/userguide/rules/rule-types.rst b/doc/userguide/rules/rule-types.rst
new file mode 100644 (file)
index 0000000..7b8cfdd
--- /dev/null
@@ -0,0 +1,1161 @@
+.. role:: example-rule-action
+.. role:: example-rule-header
+.. role:: example-rule-options
+.. role:: example-rule-emphasis
+
+Rule Types and Categorization
+=============================
+
+Once parsed, Suricata rules are categorized for performance and further
+processing (as different rule types will be handled by specific engine modules).
+The signature types are defined in `src/detect.h
+<https://github.com/OISF/suricata/blob/master/src/detect.h>`_:
+
+.. literalinclude:: ../../../src/detect.h
+    :caption: src/detect.h
+    :language: c
+    :start-after: // rule types documentation tag start: SignatureType
+    :end-before: // rule types documentation tag end: SignatureType
+
+In more human readable terms:
+
+.. list-table:: Suricata Rule Types, and their Engine Analysis Term
+    :header-rows: 1
+
+    * - Rule Type
+      - Code Symbol
+      - Engine-Analysis Representation
+    * - Decoder Events Only
+      - ``SIG_TYPE_DEONLY``
+      - ``de_only``
+    * - Packet
+      - ``SIG_TYPE_PKT``
+      - ``pkt``
+    * - IP Only
+      - ``SIG_TYPE_IPONLY``
+      - ``ip_only``
+    * - IP Only (contains negated address(es))
+      - ``SIG_TYPE_LIKE_IPONLY``
+      - ``like_ip_only``
+    * -  Protocol Detection Only
+      - ``SIG_TYPE_PDONLY``
+      - ``pd_only``
+    * - Packet-Stream
+      - ``SIG_TYPE_PKT_STREAM``
+      - ``pkt_stream``
+    * - Stream
+      - ``SIG_TYPE_STREAM``
+      - ``stream``
+    * - Application Layer Protocol
+      - ``SIG_TYPE_APPLAYER``
+      - ``app_layer``
+    * - Application Layer Protocol Transactions
+      - ``SIG_TYPE_APP_TX``
+      - ``app_tx``
+
+The rule type will impact:
+
+  - To what does the signature action apply, in case of a match (`Action Scope`)
+  - When is the rule matched against traffic (`Inspection Hook`)
+  - Against what the rule matches (`Data Exposed`)
+
+This categorization is done taking into consideration the presence or absence of
+certain rule elements, as well as the type of keywords used. The categorization
+currently takes place in `src/detect-engine-build.c:void SignatureSetType()
+<https://github.com/OISF/suricata/blob/master/src/detect-engine-build.c#L1642-L1704>`_.
+
+The ``SignatureSetType()`` overall flow is described below:
+
+.. image:: rule-types/OverallAlgoHorizontal.png
+    :align: center
+    :width: 600
+    :alt: A flowchart representing the SignatureSetType function.
+
+Flowcharts expanding uncovered functions or portions of the overall algorithm
+above are shown in the :ref:`detailed-flowcharts-sig-type` section.
+
+The following table lists all Suricata signature types, and how they impact the
+aspects aforementioned.
+
+.. list-table:: Suricata Rule Types
+    :widths: 10 17 22 29 26
+    :header-rows: 1
+
+    * - Type
+      - Action Scope
+      - Inspection Hook
+      - Data Exposed
+      - Keyword Examples
+
+        (non-exhaustive)
+    * - :ref:`Decoder Events Only <de-only-rule-type>`
+
+        (``de_only``)
+      - Packet
+      - Per-broken/ invalid packet
+      - Decoding events
+      - ``decode-event``
+    * - :ref:`Packet <pkt-rule-type>`
+
+        (``pkt``)
+      - Packet
+      - Per-packet basis
+      - Packet-level info (e.g.: header info)
+      - ``tcp-pkt``, ``itype``, ``tcp.hdr``, ``tcp.seq``, ``ttl`` etc.
+    * - :ref:`IP Only <ip-only-rule-type>`
+
+        (``ip_only``)
+      - Flow (if existing). Packets (if not part of a flow)
+      - Once per direction
+      - IP addresses on the flow
+      - Source/ Destination field of a rule
+    * - :ref:`IP Only (contains negated address) <like-ip-only-rule-type>` :sup:`2`
+
+        (``like_ip_only``)
+      - Flow
+      - All packets
+      - IP addresses on the flow
+      - Source/ Destination field of a rule containing negated address
+    * - :ref:`Protocol Detection Only <pd-only-rule-type>`
+
+        (``pd_only``)
+      - Flow
+      - Once per direction, when protocol detection is done
+      - Protocol detected for the flow
+      - ``app-layer-protocol``
+    * - :ref:`Packet-Stream <pkt-stream-rule-type>`
+
+        (``pkt_stream``)
+      - Flow, if stateful :sup:`1`
+      - Per stream chunk, if stateful, per-packet if not
+
+        (stream payload AND packet payload)
+      - The reassembled stream and/or payload data
+      - ``content`` with ``startswith`` or ``depth``
+    * - :ref:`Stream <stream-rule-type>`
+
+        (``stream``)
+      - Flow, if stateful :sup:`1`
+      - Stream chunks, if stateful, just packets if not
+      - Stream reassembled payload or packet payload data
+      - ``tcp-stream`` in protocol field; simple ``content``; ``byte_extract``
+    * - :ref:`Application Layer Protocol <app-layer-rule-type>`
+
+        (``app_layer``)
+      - Flow
+      - Per-packet basis
+      - 'protocol' field in a rule
+      - `Protocol field <https://suri-rtd-test.readthedocs.io/en/doc-sigtypes-et-properties-v5/rules/intro.html#protocol>`_ of a rule
+    * - :ref:`Application Layer Protocol Transactions <app-tx-rule-type>`
+
+        (``app_tx``)
+      - Flow
+      - Per :ref:`transaction <transactions>` update
+      - Buffer keywords
+      - Application layer protocol-related, e.g. ``http.host``, ``rfb.secresult``,
+        ``dcerpc.stub_data``, ``frame`` keywords
+
+.. note:: Action Scope: `Flow, if stateful`
+
+    (1) Apply to the flow. If a segment isn't accepted into a stream for any
+    reason (such as packet anomalies, errors, memcap reached etc), the rule will
+    be applied on a packet level.
+
+.. warning::
+
+    Although both are related to matching on application layer protocols, as the
+    table suggests, since Suricata 7 a Protocol Detection rule (that uses the
+    ``app-layer-protocol`` keyword) is not internally classified the same as a
+    rule simply matching on the application layer protocol on the ``protocol``
+    field.
+
+Signature Properties
+--------------------
+
+The `Action Scope` mentioned above relates to the Signature Properties, as seen in
+`src/detect-engine.c <https://github.com/OISF/suricata/blob/master/src/detect-engine.c>`_:
+
+.. literalinclude:: ../../../src/detect-engine.c
+    :caption: src/detect-engine.c
+    :language: c
+    :start-after: // rule types documentation tag start: SignatureProperties
+    :end-before: // rule types documentation tag end: SignatureProperties
+
+Signature: Require Real Packet
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Aside from the scope of action of a signature, certain rule conditions will
+require that it matches against a *real packet* (as opposed to a *pseudo packet*).
+These rules are flagged with ``SIG_MASK_REQUIRE_REAL_PKT`` by the engine, and
+will have ``real_pkt`` listed as one of the rule's ``requirements``. (See
+``engine-analysis`` example output for the :ref:`pkt-rule-type` rule type.)
+
+A *pseudo packet* is an internal resource used by the engine when a flow is over
+but there is still data to be processed, such as when there is a flow timeout.
+A fake packet is then injected in the flow to finish up processing before ending it.
+
+Those two types will be more documented soon (tracking
+`#7424 <https://redmine.openinfosecfoundation.org/issues/7424>`_).
+
+.. _variable-like-keywords-sig-type:
+
+Signature Types and Variable-like Keywords
+------------------------------------------
+
+Keywords such as flow variables (``flowint``, ``flowbits``), ``datasets``,
+and similar ones can alter the rule type, if present in a signature.
+
+That happens because the variable condition can change per packet. Thus, the
+Signature is categorized as a `packet` rule.
+
+This affects rule types:
+
+    - Application Layer (``app_layer``)
+    - Protocol Detection Only (``pd_only``)
+    - Decoder Events Only (``de_only``)
+    - IP Only (``ip_only``) :sup:`3`
+    - Like IP Only (``like_ip_only``) :sup:`3`
+
+The rule examples provided further cover some such cases, but the table below
+lists those keywords with more details:
+
+.. list-table:: Variable-like Keywords
+    :header-rows: 1
+
+    * - Keyword
+      - Keyword Option
+      - Rule Type change?
+    * - ``flow``
+      - ``to_server``, ``to_client``
+      - no type changes :sup:`3`
+    * - ``flow``
+      - ``established``, ``not_established``
+      - to `packet`
+    * - ``flowbits``, ``xbits``, ``hostbits``
+      - ``isset``, ``isnotset``
+      - to `packet`
+    * - ``flowbits``, ``xbits``, ``hostbits``
+      - ``set``, ``unset``, ``toggle``
+      - no type change
+    * - ``flowint``
+      - ``isset``, ``notset``, all operators
+      - to `packet`
+    * - ``flowint``
+      - defining the variable; unseting;
+      - no type change
+    * - ``iprep``
+      - ``isset``, ``notset``, all operators
+      - to `packet`
+
+.. note:: IP Only and Like IP Only
+
+    (3) Unlike the other affected types, signatures that would otherwise be
+    classified as ``ip_only`` or ``like_ip_only`` become Packet rules if the
+    ``flow`` keyword is used, regardless of option.
+
+.. note::
+
+    ``dataset``, while may look similar to the keywords above, doesn't pertain
+    to this list as it can only be used with sticky buffer keywords, thus being
+    only available to Application Layer Transaction rules (`app_tx`), which are
+    not affected by this.
+
+Flowbits: ``isset``
+^^^^^^^^^^^^^^^^^^^
+
+If a non-stateful rule (e.g. a ``pkt`` rule) checks if a flowbit is set (like in
+*flowbits:fb6,isset*) and the rule that sets that variable is a stateful one,
+such as an ``app_tx`` rule, the engine will set a flag to indicate that that
+rule is also stateful - without altering its signature type. This flag is
+currently ``SIG_FLAG_INIT_STATE_MATCH`` (cf. ticket `#7483
+<https://redmine.openinfosecfoundation.org/issues/7483>`_).
+
+There is a work-in-progress to add information about this to the ``engine-analysis``
+report (ticket `#7456 <https://redmine.openinfosecfoundation.org/issues/7456>`_).
+
+
+Signatures per Type
+-------------------
+
+This section offers brief descriptions for each rule type, and illustrates what
+signatures of each type may look like. It is possible to learn the type of a
+signature, as well as other important information, by running Suricata in
+:ref:`engine analysis <config:engine-analysis>` mode.
+
+For each rule type, there is also a sample of the Engine Analysis report
+for one or more of rule(s) shown.
+
+.. _de-only-rule-type:
+
+Decoder Events Only
+^^^^^^^^^^^^^^^^^^^
+
+Signatures the inspect broken or invalid packets. They expose Suricata decoding
+events.
+
+For more examples check https://github.com/OISF/suricata/blob/master/rules/decoder-events.rules.
+
+Example
+"""""""
+
+.. container:: example-rule
+
+    alert pkthdr any any -> any any (msg:"SURICATA IPv6 duplicated Hop-By-Hop Options extension header"; :example-rule-emphasis:`decode-event:ipv6.exthdr_dupl_hh;` classtype:protocol-command-decode; sid:1101;)
+
+.. container:: example-rule
+
+    drop pkthdr any any -> any any (msg:"SURICATA IPv4 invalid option length"; `:example-rule-emphasis:`decode-event:ipv4.opt_invalid_len;` classtype:protocol-command-decode; sid:2200005; rev:2;)
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert pkthdr any any -> any any (msg:\"SURICATA IPv6 duplicated Hop-By-Hop Options extension header\"; decode-event:ipv6.exthdr_dupl_hh; classtype:protocol-command-decode; sid:1101;)",
+      "id": 1101,
+      "gid": 1,
+      "rev": 0,
+      "msg": "SURICATA IPv6 duplicated Hop-By-Hop Options extension header",
+      "app_proto": "unknown",
+      "requirements": [
+        "engine_event"
+      ],
+      "type": "de_only",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "toserver",
+        "toclient"
+      ],
+      "pkt_engines": [
+        {
+          "name": "packet",
+          "is_mpm": false
+        }
+      ],
+      "frame_engines": [],
+      "lists": {
+        "packet": {
+          "matches": [
+            {
+              "name": "decode-event"
+            }
+          ]
+        }
+      }
+    }
+
+
+.. _pkt-rule-type:
+
+Packet
+^^^^^^
+
+Rules that expose/ inspect information on a packet-level (for instance, the
+header). Certain flow keywords may also turn a rule into a ``pkt`` rule, if
+they require per-packet inspection (cf. :ref:`variable-like-keywords-sig-type`).
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+    alert :example-rule-emphasis:`tcp-pkt` any any -> any any (msg:"tcp-pkt, anchored content"; :example-rule-emphasis:`content:"abc"; startswith;` sid:203;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any any (msg:"ttl"; :example-rule-emphasis:`ttl:123;` sid:701;)
+
+.. container:: example-rule
+
+    alert udp any any -> any any (msg:"UDP with flow direction"; flow:to_server; sid:1001;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any 443 (flow: to_server; flowbits:set,tls_error; sid:1604; msg:"Allow TLS error handling (outgoing packet) - non-stateful rule";)
+
+.. container:: example-rule
+
+    alert tcp-pkt any any -> any any (msg:"Flowbit isset"; :example-rule-emphasis:`flowbits:isset,fb6; flowbits:isset,fb7;` sid:1919;)
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert tcp-pkt any any -> any any (msg:\"tcp-pkt, anchored content\"; content:\"abc\"; startswith; sid:203;)",
+      "id": 203,
+      "gid": 1,
+      "rev": 0,
+      "msg": "tcp-pkt, anchored content",
+      "app_proto": "unknown",
+      "requirements": [
+        "payload",
+        "real_pkt"
+      ],
+      "type": "pkt",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "need_packet",
+        "toserver",
+        "toclient",
+        "prefilter"
+      ],
+      "pkt_engines": [
+        {
+          "name": "payload",
+          "is_mpm": true
+        }
+      ],
+      "frame_engines": [],
+      "lists": {
+        "payload": {
+          "matches": [
+            {
+              "name": "content",
+              "content": {
+                "pattern": "abc",
+                "length": 3,
+                "nocase": false,
+                "negated": false,
+                "starts_with": true,
+                "ends_with": false,
+                "is_mpm": true,
+                "no_double_inspect": false,
+                "depth": 3,
+                "fast_pattern": false,
+                "relative_next": false
+              }
+            }
+          ]
+        }
+      },
+      "mpm": {
+        "buffer": "payload",
+        "pattern": "abc",
+        "length": 3,
+        "nocase": false,
+        "negated": false,
+        "starts_with": true,
+        "ends_with": false,
+        "is_mpm": true,
+        "no_double_inspect": false,
+        "depth": 3,
+        "fast_pattern": false,
+        "relative_next": false
+      }
+    }
+
+.. _ip-only-rule-type:
+
+IP Only
+^^^^^^^
+
+The IP ONLY rule type is used when rules match only on source and destination
+IP addresses, and not on any other flow or content modifier.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+    alert tcp-stream :example-rule-emphasis:`any` any -> :example-rule-emphasis:`any` any (msg:"tcp-stream, no content"; sid:101;)
+
+.. container:: example-rule
+
+    alert tcp-pkt :example-rule-emphasis:`[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]` any -> :example-rule-emphasis:`any` any (msg:"tcp-pkt, no content"; sid:201;)
+
+.. container:: example-rule
+
+    alert ip :example-rule-emphasis:`any` any -> :example-rule-emphasis:`any` any (:example-rule-emphasis:`hostbits:set,myflow2;` sid:1505;)
+
+.. container:: example-rule
+
+    alert udp :example-rule-emphasis:`any` any -> :example-rule-emphasis:`any` any (msg:"UDP with flow direction"; sid:1601;)
+
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert ip any any -> any any (hostbits:set,myflow2; sid:1505;)",
+      "id": 1505,
+      "gid": 1,
+      "rev": 0,
+      "app_proto": "unknown",
+      "requirements": [],
+      "type": "ip_only",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "toserver",
+        "toclient"
+      ],
+      "pkt_engines": [],
+      "frame_engines": [],
+      "lists": {
+        "postmatch": {
+          "matches": [
+            {
+              "name": "hostbits"
+            }
+          ]
+        }
+      }
+    }
+
+.. _like-ip-only-rule-type:
+
+IP Only (contains negated address)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A rule that inspects IP only properties, but contains negated IP addresses.
+
+IP Only signatures with negated addresses are `like` IP-only signatures, but
+currently handled differently due to limitations of the algorithm processing
+IP Only rules. Impactful differences from a user-perspective are listed on the
+Signature Types table.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+    alert tcp 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12 any -> :example-rule-emphasis:`![192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]` any (msg:"tcp, has negated IP address"; sid:304;)
+
+.. container:: example-rule
+
+    alert tcp :example-rule-emphasis:`[10.0.0.0/8,!10.10.10.10]` any -> :example-rule-emphasis:`[10.0.0.0/8,!10.10.10.10]` any (msg:"tcp, has negated IP address"; sid:305;)
+
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert tcp [10.0.0.0/8,!10.10.10.10] any -> [10.0.0.0/8,!10.10.10.10] any (msg:\"tcp, has negated IP address\"; sid:305;)",
+      "id": 305,
+      "gid": 1,
+      "rev": 0,
+      "msg": "tcp, has negated IP address",
+      "app_proto": "unknown",
+      "requirements": [],
+      "type": "like_ip_only",
+      "flags": [
+        "sp_any",
+        "dp_any",
+        "toserver",
+        "toclient"
+      ],
+      "pkt_engines": [],
+      "frame_engines": [],
+      "lists": {}
+    }
+
+.. _pd-only-rule-type:
+
+Protocol Detection Only
+^^^^^^^^^^^^^^^^^^^^^^^
+
+When a signature checks for the application layer protocol but there is no need
+for a per-packet inspection, protocol detection can be done with the
+``app-layer-protocol`` keyword. Check the `keyword documentation
+<https://docs.suricata.io/en/latest/rules/app-layer.html#app-layer-protocol>`_
+full for usage.
+
+See :ref:`Protocol Detection Only <flowchart-pd-only-sig-type>` for a flowchart
+representing how the type is defined.
+
+See :ref:`app-layer-rule-type` for a packet-based inspection.
+
+.. warning::
+
+    Since Suricata 7, a Protocol Detection rule (that uses the
+    ``app-layer-protocol`` keyword) is not internally classified the same as a
+    rule simply matching on the application layer protocol on the ``protocol``
+    field.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+    alert tcp any any -> any any (msg:"tcp, pd negated"; :example-rule-emphasis:`app-layer-protocol:!http;` sid:401;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any any (msg:"tcp, pd positive"; :example-rule-emphasis:`app-layer-protocol:http;` sid:402;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any any (msg:"tcp, pd positive dns"; :example-rule-emphasis:`app-layer-protocol:dns;` sid:403;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any any (msg:"tcp, pd positive, dns, flow:to_server"; :example-rule-emphasis:`app-layer-protocol:dns;` flow:to_server; sid:405;)
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert tcp any any -> any any (msg:\"tcp, pd positive dns\"; app-layer-protocol:dns; sid:403;)",
+      "id": 403,
+      "gid": 1,
+      "rev": 0,
+      "msg": "tcp, pd positive dns",
+      "app_proto": "unknown",
+      "requirements": [],
+      "type": "pd_only",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "toserver",
+        "toclient"
+      ],
+      "pkt_engines": [
+        {
+          "name": "packet",
+          "is_mpm": false
+        }
+      ],
+      "frame_engines": [],
+      "lists": {
+        "packet": {
+          "matches": [
+            {
+              "name": "app-layer-protocol"
+            }
+          ]
+        }
+      }
+    }
+
+.. _pkt-stream-rule-type:
+
+Packet-Stream
+^^^^^^^^^^^^^
+
+A rule is categorized as such when it inspects on traffic in specific portions
+of the packet payload, using ``content`` buffer with the ``startswith`` or
+``depth`` keywords.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+   alert tcp any any -> any any (msg:"tcp, anchored content"; :example-rule-emphasis:`content:"abc"; startswith;` sid:303;)
+
+.. container:: example-rule
+
+   alert http any any -> any any (msg:"http, anchored content"; :example-rule-emphasis:`content:"abc"; depth:30;` sid:603;)
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert http any any -> any any (msg:\"http, anchored content\"; content:\"abc\"; depth:30; sid:603;)",
+      "id": 603,
+      "gid": 1,
+      "rev": 0,
+      "msg": "http, anchored content",
+      "app_proto": "http_any",
+      "requirements": [
+        "payload",
+        "flow"
+      ],
+      "type": "pkt_stream",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "applayer",
+        "need_packet",
+        "need_stream",
+        "toserver",
+        "toclient",
+        "prefilter"
+      ],
+      "pkt_engines": [
+        {
+          "name": "payload",
+          "is_mpm": true
+        }
+      ],
+      "frame_engines": [],
+      "lists": {
+        "payload": {
+          "matches": [
+            {
+              "name": "content",
+              "content": {
+                "pattern": "abc",
+                "length": 3,
+                "nocase": false,
+                "negated": false,
+                "starts_with": false,
+                "ends_with": false,
+                "is_mpm": true,
+                "no_double_inspect": false,
+                "depth": 30,
+                "fast_pattern": false,
+                "relative_next": false
+              }
+            }
+          ]
+        }
+      },
+      "mpm": {
+        "buffer": "payload",
+        "pattern": "abc",
+        "length": 3,
+        "nocase": false,
+        "negated": false,
+        "starts_with": false,
+        "ends_with": false,
+        "is_mpm": true,
+        "no_double_inspect": false,
+        "depth": 30,
+        "fast_pattern": false,
+        "relative_next": false
+      }
+    }
+
+.. _stream-rule-type:
+
+Stream
+^^^^^^
+
+A rule that matches payload traffic without regards to its position, that is,
+on an unanchored ``content`` buffer, uses byte extraction or matches on
+``tcp-stream`` is classified a stream rule.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+   alert :example-rule-emphasis:`tcp-stream` any any -> any any (msg:"tcp-stream, simple content"; :example-rule-emphasis:`content:"abc";` sid:102;)
+
+.. container:: example-rule
+
+   alert :example-rule-emphasis:`http` any any -> any any (msg:"http, simple content"; :example-rule-emphasis:`content:"abc";` sid:602;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any 443 (:example-rule-emphasis:`flow: to_server; content:"abc";` flowbits:set,tls_error; sid:1605; msg:"Allow TLS error handling (outgoing packet) with simple content - Stream rule";)
+
+.. container:: example-rule
+
+    alert tcp any any -> any 443 (:example-rule-emphasis:`flow: to_server; content:"abc";` sid:160401; msg:"Allow TLS error handling (outgoing packet) - stream rule";)
+
+.. container:: example-rule
+
+    alert tcp any any -> any 443 (:example-rule-emphasis:`content:"abc";` sid:160402; msg:"Allow TLS error handling (outgoing packet) - stream rule";)
+
+.. container:: example-rule
+
+   alert :example-rule-emphasis:`tcp` any any -> any any (msg:"byte_extract with dce"; :example-rule-emphasis:`byte_extract:4,0,var,dce; byte_test:4,>,var,4,little;` sid:901;)
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert tcp any any -> any any (msg:\"byte_extract with dce\"; byte_extract:4,0,var,dce; byte_test:4,>,var,4,little; sid:901;)",
+      "id": 901,
+      "gid": 1,
+      "rev": 0,
+      "msg": "byte_extract with dce",
+      "app_proto": "dcerpc",
+      "requirements": [
+        "payload",
+        "flow"
+      ],
+      "type": "stream",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "applayer",
+        "need_stream",
+        "toserver",
+        "toclient"
+      ],
+      "pkt_engines": [
+        {
+          "name": "payload",
+          "is_mpm": false
+        }
+      ],
+      "frame_engines": [],
+      "lists": {
+        "payload": {
+          "matches": [
+            {
+              "name": "byte_extract"
+            },
+            {
+              "name": "byte_test",
+              "byte_test": {
+                "nbytes": 4,
+                "offset": 4,
+                "base": "unset",
+                "flags": [
+                  "little_endian"
+                ]
+              }
+            }
+          ]
+        }
+      }
+    }
+
+.. _app-layer-rule-type:
+
+Application Layer Protocol
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+For a packet-based inspection of the application layer protocol, a rule should
+use the `protocol <https://suri-rtd-test.readthedocs.io/en/doc-sigtypes-et-properties-v5/rules/intro.html#protocol>`_ field for the matches.
+
+.. warning::
+
+    Since Suricata 7, a simple rule matching traffic on the ``protocol`` field
+    is not internally classified the same as a rule using the ``app-layer-protocol``
+    keyword).
+
+.. warning::
+
+    As per Suricata 7, if ``flow:established`` or ``flow:not_established`` is added
+    to a base Application Layer Protocol rule, that signature will become a
+    :ref:`pkt-rule-type` rule.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+    alert :example-rule-emphasis:`dns` any any -> any any (msg:"app-layer, dns"; sid:404;)
+
+.. container:: example-rule
+
+   alert :example-rule-emphasis:`http` any any -> any any (msg:"http, no content"; sid:601;)
+
+.. container:: example-rule
+
+    alert :example-rule-emphasis:`tls` any any -> any any (msg:"tls, pkt or app-layer?"; flowint:tls_error_int,=,0; sid:613;)
+
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert dns any any -> any any (msg:\"app-layer, dns\"; sid:404;)",
+      "id": 404,
+      "gid": 1,
+      "rev": 0,
+      "msg": "app-layer, dns",
+      "app_proto": "dns",
+      "requirements": [
+        "flow"
+      ],
+      "type": "app_layer",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "applayer",
+        "toserver",
+        "toclient"
+      ],
+      "pkt_engines": [],
+      "frame_engines": [],
+      "lists": {}
+    }
+
+.. _app-tx-rule-type:
+
+Application Layer Protocol Transactions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Rules inspecting traffic using keywords related to application layer protocols
+are classified with this signature type. This also includes `frame` keywords.
+
+Examples
+""""""""
+
+.. container:: example-rule
+
+   alert tcp any any -> any any (msg:"http, pos event"; :example-rule-emphasis:`app-layer-event:http.file_name_too_long;` sid:501;)
+
+.. container:: example-rule
+
+   alert http any any -> any any (msg:"Test"; flow:established,to_server; :example-rule-emphasis:`http.method; content:"GET"; http.uri; content:".exe";` endswith; :example-rule-emphasis:`http.host; content:!".google.com";` endswith; sid:1102;)
+
+.. container:: example-rule
+
+   alert udp any any -> any any (msg:"DNS UDP Frame"; flow:to_server; :example-rule-emphasis:`frame:dns.pdu;` content:"\|01 20 00 01\|"; offset:2; content:"suricata"; offset:13; sid:1402; rev:1;)
+
+.. container:: example-rule
+
+    alert tcp any any -> any any (msg:"byte_extract with dce"; :example-rule-emphasis:`dcerpc.stub_data;` content:"abc"; byte_extract:4,0,var,relative; byte_test:4,>,var,4,little; sid:902;)
+
+Engine-Analysis Report
+""""""""""""""""""""""
+.. code-block:: json
+
+    {
+      "raw": "alert tcp any any -> any any (msg:\"byte_extract with dce\"; dcerpc.stub_data; content:\"abc\"; byte_extract:4,0,var,relative; byte_test:4,>,var,4,little; sid:902;)",
+      "id": 902,
+      "gid": 1,
+      "rev": 0,
+      "msg": "byte_extract with dce",
+      "app_proto": "dcerpc",
+      "requirements": [
+        "flow"
+      ],
+      "type": "app_tx",
+      "flags": [
+        "src_any",
+        "dst_any",
+        "sp_any",
+        "dp_any",
+        "applayer",
+        "toserver",
+        "toclient",
+        "prefilter"
+      ],
+      "pkt_engines": [],
+      "frame_engines": [],
+      "engines": [
+        {
+          "name": "dce_stub_data",
+          "direction": "toclient",
+          "is_mpm": true,
+          "app_proto": "dcerpc",
+          "progress": 0,
+          "matches": [
+            {
+              "name": "content",
+              "content": {
+                "pattern": "abc",
+                "length": 3,
+                "nocase": false,
+                "negated": false,
+                "starts_with": false,
+                "ends_with": false,
+                "is_mpm": true,
+                "no_double_inspect": false,
+                "fast_pattern": false,
+                "relative_next": true
+              }
+            },
+            {
+              "name": "byte_extract"
+            },
+            {
+              "name": "byte_test",
+              "byte_test": {
+                "nbytes": 4,
+                "offset": 4,
+                "base": "unset",
+                "flags": [
+                  "little_endian"
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "dce_stub_data",
+          "direction": "toserver",
+          "is_mpm": true,
+          "app_proto": "dcerpc",
+          "progress": 0,
+          "matches": [
+            {
+              "name": "content",
+              "content": {
+                "pattern": "abc",
+                "length": 3,
+                "nocase": false,
+                "negated": false,
+                "starts_with": false,
+                "ends_with": false,
+                "is_mpm": true,
+                "no_double_inspect": false,
+                "fast_pattern": false,
+                "relative_next": true
+              }
+            },
+            {
+              "name": "byte_extract"
+            },
+            {
+              "name": "byte_test",
+              "byte_test": {
+                "nbytes": 4,
+                "offset": 4,
+                "base": "unset",
+                "flags": [
+                  "little_endian"
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "dce_stub_data",
+          "direction": "toclient",
+          "is_mpm": true,
+          "app_proto": "smb",
+          "progress": 0,
+          "matches": [
+            {
+              "name": "content",
+              "content": {
+                "pattern": "abc",
+                "length": 3,
+                "nocase": false,
+                "negated": false,
+                "starts_with": false,
+                "ends_with": false,
+                "is_mpm": true,
+                "no_double_inspect": false,
+                "fast_pattern": false,
+                "relative_next": true
+              }
+            },
+            {
+              "name": "byte_extract"
+            },
+            {
+              "name": "byte_test",
+              "byte_test": {
+                "nbytes": 4,
+                "offset": 4,
+                "base": "unset",
+                "flags": [
+                  "little_endian"
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "dce_stub_data",
+          "direction": "toserver",
+          "is_mpm": true,
+          "app_proto": "smb",
+          "progress": 0,
+          "matches": [
+            {
+              "name": "content",
+              "content": {
+                "pattern": "abc",
+                "length": 3,
+                "nocase": false,
+                "negated": false,
+                "starts_with": false,
+                "ends_with": false,
+                "is_mpm": true,
+                "no_double_inspect": false,
+                "fast_pattern": false,
+                "relative_next": true
+              }
+            },
+            {
+              "name": "byte_extract"
+            },
+            {
+              "name": "byte_test",
+              "byte_test": {
+                "nbytes": 4,
+                "offset": 4,
+                "base": "unset",
+                "flags": [
+                  "little_endian"
+                ]
+              }
+            }
+          ]
+        }
+      ],
+      "lists": {},
+      "mpm": {
+        "buffer": "dce_stub_data",
+        "pattern": "abc",
+        "length": 3,
+        "nocase": false,
+        "negated": false,
+        "starts_with": false,
+        "ends_with": false,
+        "is_mpm": true,
+        "no_double_inspect": false,
+        "fast_pattern": false,
+        "relative_next": true
+      }
+    }
+
+.. _detailed-flowcharts-sig-type:
+
+Detailed Flowcharts
+-------------------
+
+A look into the illustrated overall representation of functions or paths that
+determine signature types.
+
+.. _flowchart-ip-only-sig-type:
+
+IP Only and IP Only with negated addresses
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``ip_only`` and ``like_ip_only`` flows.
+
+.. image:: rule-types/IP-Only.png
+    :align: center
+    :alt: A flowchart representing the SignatureIsIPOnly function.
+
+.. _flowchart-pd-only-sig-type:
+
+Protocol Detection Only
+^^^^^^^^^^^^^^^^^^^^^^^
+
+``pd_only`` flow.
+
+.. image:: rule-types/PD-only.png
+    :align: center
+    :width: 400
+    :alt: A flowchart representing the SignatureIsPDOnly function.
+
+.. _flowchart-app-layer-packet-app-tx-stream-sig-types:
+
+Application Layer Protocol, Transaction, Packet, Stream and Stream-Packet rules
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``app_layer``, ``app_tx``, ``pkt``, ``stream`` and ``stream-pkt`` flows.
+
+``REQUIRE_PACKET_`` and ``REQUIRE_STREAM`` can be seen as flags ``need_packet``
+and ``need_stream`` in the ``engine-analysis`` output.
+
+.. image:: rule-types/APP_Layer-Packet-TX-Stream.png
+    :align: center
+    :alt: A flowchart representing the portion of SignatureSetType function
+        that handles app_layer, app_tx, stream, pkt_stream and pkt rules.
diff --git a/doc/userguide/rules/rule-types/APP_Layer-Packet-TX-Stream.png b/doc/userguide/rules/rule-types/APP_Layer-Packet-TX-Stream.png
new file mode 100644 (file)
index 0000000..0be76dd
Binary files /dev/null and b/doc/userguide/rules/rule-types/APP_Layer-Packet-TX-Stream.png differ
diff --git a/doc/userguide/rules/rule-types/IP-Only.png b/doc/userguide/rules/rule-types/IP-Only.png
new file mode 100644 (file)
index 0000000..b19c075
Binary files /dev/null and b/doc/userguide/rules/rule-types/IP-Only.png differ
diff --git a/doc/userguide/rules/rule-types/OverallAlgoHorizontal.png b/doc/userguide/rules/rule-types/OverallAlgoHorizontal.png
new file mode 100644 (file)
index 0000000..c273a13
Binary files /dev/null and b/doc/userguide/rules/rule-types/OverallAlgoHorizontal.png differ
diff --git a/doc/userguide/rules/rule-types/PD-only.png b/doc/userguide/rules/rule-types/PD-only.png
new file mode 100644 (file)
index 0000000..75e81d8
Binary files /dev/null and b/doc/userguide/rules/rule-types/PD-only.png differ
diff --git a/doc/userguide/rules/rule-types/RawFlowcharts/APP_Layer-Packet-TX-Stream.drawio b/doc/userguide/rules/rule-types/RawFlowcharts/APP_Layer-Packet-TX-Stream.drawio
new file mode 100644 (file)
index 0000000..e3a4b74
--- /dev/null
@@ -0,0 +1,187 @@
+<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0" version="26.0.5">
+  <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
+    <mxGraphModel dx="1434" dy="792" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+      <root>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-2" value="" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;exitX=0;exitY=0.5;exitDx=0;exitDy=0;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="0s5H1ICuEW0THiAgHV-k-6" target="WIyWlLk6GJQsqaUBKTNV-6" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="499" y="108" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-5" value="Yes" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=15;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-6" target="WIyWlLk6GJQsqaUBKTNV-7" edge="1">
+          <mxGeometry y="10" relative="1" as="geometry">
+            <mxPoint as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="eGOkAom5l4kSlUUYHeej-0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-6" target="WIyWlLk6GJQsqaUBKTNV-10">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="eGOkAom5l4kSlUUYHeej-1" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" vertex="1" connectable="0" parent="eGOkAom5l4kSlUUYHeej-0">
+          <mxGeometry x="0.0556" y="3" relative="1" as="geometry">
+            <mxPoint x="9" y="-3" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-6" value="&lt;div&gt;buffer&lt;/div&gt;&lt;div&gt;packet_engine?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;shadow=1;fontFamily=Helvetica;fontSize=15;align=center;strokeWidth=1;spacing=6;spacingTop=-4;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="89.38" y="187" width="156.25" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-7" value="Packet" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;glass=0;strokeWidth=1;shadow=1;fillColor=#FFCC99;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="813" y="222" width="120" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-9" value="Yes" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=15;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-10" target="WIyWlLk6GJQsqaUBKTNV-12" edge="1">
+          <mxGeometry y="10" relative="1" as="geometry">
+            <mxPoint as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-10" target="xHfLyH90HpsRTlA_s4lh-1" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-4" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-2" vertex="1" connectable="0">
+          <mxGeometry x="0.2508" y="-1" relative="1" as="geometry">
+            <mxPoint x="14" y="-4" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-10" value="&lt;div style=&quot;font-size: 15px;&quot;&gt;buffer&lt;br&gt;frame_engine OR buffer app_engine?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;shadow=1;fontFamily=Helvetica;fontSize=15;align=center;strokeWidth=1;spacing=6;spacingTop=-4;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="50" y="330" width="235" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-11" value="Application Layer Protocol" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;glass=0;strokeWidth=1;shadow=1;fillColor=#B9E0A5;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="304" y="765" width="170" height="50" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-12" value="Application Layer Protocol Transaction" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;glass=0;strokeWidth=1;shadow=1;fillColor=#67AB9F;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="808" y="350" width="130" height="70" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-1" target="xHfLyH90HpsRTlA_s4lh-8" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="167.4999999999999" y="740" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-7" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-6" vertex="1" connectable="0">
+          <mxGeometry x="-0.2257" y="2" relative="1" as="geometry">
+            <mxPoint x="11" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-1" target="xHfLyH90HpsRTlA_s4lh-11" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="352.5" y="600" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-10" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-9" vertex="1" connectable="0">
+          <mxGeometry x="-0.0137" y="3" relative="1" as="geometry">
+            <mxPoint x="-2" y="-9" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-1" value="&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Payload&amp;nbsp;&lt;/div&gt;&lt;div&gt;and/or&lt;br&gt;Stream match?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;shadow=1;fontFamily=Helvetica;fontSize=15;align=center;strokeWidth=1;spacing=6;spacingTop=-4;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="71.25" y="472.5" width="192.5" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-8" target="ePn_FxX4DdHERsb3t1WL-1" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="502.5" y="135" as="targetPoint" />
+            <mxPoint x="312.5" y="795" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-27" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-26" vertex="1" connectable="0">
+          <mxGeometry x="-0.9663" y="-1" relative="1" as="geometry">
+            <mxPoint x="65" y="-16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-8" target="xHfLyH90HpsRTlA_s4lh-29" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="167.4999999999999" y="900" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-30" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-28" vertex="1" connectable="0">
+          <mxGeometry x="-0.0063" y="1" relative="1" as="geometry">
+            <mxPoint x="15" y="-5" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-8" value="&lt;div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Non-payload&lt;/div&gt;&lt;div&gt;per-packet match?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;shadow=1;fontFamily=Helvetica;fontSize=15;align=center;strokeWidth=1;spacing=6;spacingTop=-4;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="71.25" y="620" width="192.5" height="100" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-11" target="ePn_FxX4DdHERsb3t1WL-0" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="692.5" y="185" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="IUO5ygfKNNC4OAWbKBHn-0" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-13" vertex="1" connectable="0">
+          <mxGeometry x="-0.3438" y="-1" relative="1" as="geometry">
+            <mxPoint y="-16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-11" target="xHfLyH90HpsRTlA_s4lh-17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="657.5" y="720" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-21" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-16" vertex="1" connectable="0">
+          <mxGeometry x="-0.3914" y="1" relative="1" as="geometry">
+            <mxPoint x="13" y="-19" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-11" value="&lt;div style=&quot;font-size: 15px;&quot;&gt;flag&lt;br&gt;REQUIRE_PACKET&lt;br&gt;and not flag&lt;br&gt;REQUIRE_STREAM&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;labelBackgroundColor=none;textShadow=0;shadow=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="315" y="456.25" width="247" height="142.5" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-20" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-17" target="xHfLyH90HpsRTlA_s4lh-19" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-23" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-20" vertex="1" connectable="0">
+          <mxGeometry x="0.2675" y="2" relative="1" as="geometry">
+            <mxPoint x="-14" y="-12" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-17" target="xHfLyH90HpsRTlA_s4lh-25" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="680.5" y="940" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-35" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-24" vertex="1" connectable="0">
+          <mxGeometry x="-0.2" y="1" relative="1" as="geometry">
+            <mxPoint x="25" y="-11" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-17" value="&lt;div style=&quot;font-size: 15px;&quot;&gt;flag&lt;br&gt;REQUIRE_STREAM&lt;br&gt;and not flag&lt;br&gt;REQUIRE_PACKET&lt;/div&gt;&lt;div style=&quot;font-size: 15px;&quot;&gt;&lt;br&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;labelBackgroundColor=none;textShadow=0;shadow=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="535" y="560" width="220" height="155" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-19" value="Stream" style="whiteSpace=wrap;html=1;rounded=1;fillColor=#FF9999;fontSize=15;labelBackgroundColor=none;textShadow=0;shadow=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="813" y="607.5" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-25" value="Packet-Stream" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E09F63;fontSize=15;labelBackgroundColor=none;textShadow=0;shadow=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="809.5" y="730" width="127" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-29" target="WIyWlLk6GJQsqaUBKTNV-11" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-32" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-31" vertex="1" connectable="0">
+          <mxGeometry x="0.0571" relative="1" as="geometry">
+            <mxPoint x="-10" y="-12" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endArrow=blockThin;endFill=1;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="xHfLyH90HpsRTlA_s4lh-29" target="ePn_FxX4DdHERsb3t1WL-2" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-34" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;labelBackgroundColor=none;textShadow=0;" parent="xHfLyH90HpsRTlA_s4lh-33" vertex="1" connectable="0">
+          <mxGeometry x="-0.9653" y="2" relative="1" as="geometry">
+            <mxPoint x="10" y="16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="xHfLyH90HpsRTlA_s4lh-29" value="&lt;div style=&quot;font-size: 15px;&quot;&gt;APP LAYER ?&lt;br style=&quot;font-size: 15px;&quot;&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;labelBackgroundColor=none;textShadow=0;shadow=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="98.75" y="755" width="137.5" height="70" as="geometry" />
+        </mxCell>
+        <mxCell id="ePn_FxX4DdHERsb3t1WL-0" value="Packet" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;glass=0;strokeWidth=1;shadow=1;fillColor=#FFCC99;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="813" y="507.5" width="120" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="ePn_FxX4DdHERsb3t1WL-1" value="Packet" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;glass=0;strokeWidth=1;shadow=1;fillColor=#FFCC99;labelBackgroundColor=none;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="813" y="833" width="120" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="ePn_FxX4DdHERsb3t1WL-2" value="Packet" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;glass=0;strokeWidth=1;shadow=1;fillColor=#FFCC99;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="329" y="851" width="120" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="ePn_FxX4DdHERsb3t1WL-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;textShadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ePn_FxX4DdHERsb3t1WL-2" target="ePn_FxX4DdHERsb3t1WL-2" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="0s5H1ICuEW0THiAgHV-k-6" value="Signature" style="shape=parallelogram;html=1;strokeWidth=1;perimeter=parallelogramPerimeter;whiteSpace=wrap;rounded=1;arcSize=12;size=0.23;fontSize=15;textShadow=0;shadow=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="474" y="126" width="150" height="60" as="geometry" />
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>
diff --git a/doc/userguide/rules/rule-types/RawFlowcharts/IP-Only.drawio b/doc/userguide/rules/rule-types/RawFlowcharts/IP-Only.drawio
new file mode 100644 (file)
index 0000000..56d75d6
--- /dev/null
@@ -0,0 +1,305 @@
+<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0" version="26.0.5">
+  <diagram name="Page-1" id="0w9xQVbQPSFQAx9yTVe1">
+    <mxGraphModel dx="1936" dy="932" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+      <root>
+        <mxCell id="0" />
+        <mxCell id="1" parent="0" />
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-2" target="0AOyOH4djSygT5G8EftG-2" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1736" y="433" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-3" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-6" vertex="1" connectable="0">
+          <mxGeometry x="-0.0364" y="-1" relative="1" as="geometry">
+            <mxPoint x="15" y="-2" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-2" target="HzgoOLMbdf1Lhczd7Y_U-1" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1327" y="859" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="D7SFLykBpT77EkUcGLZz-3" value="&lt;div&gt;Yes&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-3" vertex="1" connectable="0">
+          <mxGeometry x="-0.2" relative="1" as="geometry">
+            <mxPoint x="-3" y="-16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-2" value="&lt;div&gt;ALPROTO&lt;/div&gt;&lt;div&gt;UNKNOWN?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="636" y="697" width="185" height="90" as="geometry" />
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-9" target="LDplG8UmEiPDtL-p8i6A-12" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1230" y="750" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-7" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-13" vertex="1" connectable="0">
+          <mxGeometry x="0.0618" y="-2" relative="1" as="geometry">
+            <mxPoint x="-3" y="-16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-9" target="0AOyOH4djSygT5G8EftG-5" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-7" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="0AOyOH4djSygT5G8EftG-6" vertex="1" connectable="0">
+          <mxGeometry x="0.1538" y="1" relative="1" as="geometry">
+            <mxPoint x="19" y="9" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-9" value="APP LAYER?" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1136" y="702" width="175" height="80" as="geometry" />
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-12" target="0AOyOH4djSygT5G8EftG-8" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1044" y="940" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-15" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-14" vertex="1" connectable="0">
+          <mxGeometry x="-0.3802" y="2" relative="1" as="geometry">
+            <mxPoint x="21" y="-9" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="LDplG8UmEiPDtL-p8i6A-12" target="LDplG8UmEiPDtL-p8i6A-16" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1549" y="740" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-8" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-18" vertex="1" connectable="0">
+          <mxGeometry x="-0.2857" relative="1" as="geometry">
+            <mxPoint x="-14" y="24" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-12" value="&lt;div&gt;&lt;span&gt;Flow direction&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set?&lt;/span&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1357.75" y="705.25" width="177.5" height="73.75" as="geometry" />
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-16" target="0AOyOH4djSygT5G8EftG-21" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1719" y="764" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-20" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-17" vertex="1" connectable="0">
+          <mxGeometry x="-0.6767" relative="1" as="geometry">
+            <mxPoint x="20" y="20" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-16" target="n4viz4upnR27VTd0IMI--3" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1280" y="1070" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-9" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-16" vertex="1" connectable="0">
+          <mxGeometry x="-0.7663" y="-1" relative="1" as="geometry">
+            <mxPoint x="-22" y="-13" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-16" value="&lt;div&gt;Buffer&lt;/div&gt;&lt;div&gt;inspection?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1362.5" y="834" width="168" height="80" as="geometry" />
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="LDplG8UmEiPDtL-p8i6A-20" target="HzgoOLMbdf1Lhczd7Y_U-23" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="477.5" y="1321" as="sourcePoint" />
+            <mxPoint x="331" y="1321" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-11" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-24" vertex="1" connectable="0">
+          <mxGeometry x="0.0333" y="-2" relative="1" as="geometry">
+            <mxPoint x="-13" y="-16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-20" target="0AOyOH4djSygT5G8EftG-12" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-14" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="0AOyOH4djSygT5G8EftG-13" vertex="1" connectable="0">
+          <mxGeometry x="-0.1333" y="-1" relative="1" as="geometry">
+            <mxPoint x="19" y="-2" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-20" value="&lt;div&gt;Flowbits&lt;br&gt;AND NOT&lt;/div&gt;&lt;div&gt;flowbits:set&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="660" y="823" width="153" height="102" as="geometry" />
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-26" target="HzgoOLMbdf1Lhczd7Y_U-11" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1577.75" y="900" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-29" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-28" vertex="1" connectable="0">
+          <mxGeometry x="-0.3683" y="2" relative="1" as="geometry">
+            <mxPoint x="16" y="2" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-26" target="LDplG8UmEiPDtL-p8i6A-31" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1309" y="1130" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-13" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-14" vertex="1" connectable="0">
+          <mxGeometry x="0.0133" y="-1" relative="1" as="geometry">
+            <mxPoint y="-15" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-26" value="Post Match:&lt;br&gt;&lt;div&gt;Flowbits&amp;nbsp;&lt;/div&gt;&lt;div&gt;AND NOT flowbits:set&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="853.5" y="1068" width="251" height="124" as="geometry" />
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;" parent="1" target="0AOyOH4djSygT5G8EftG-23" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1485.5" y="1150" as="targetPoint" />
+            <mxPoint x="1324" y="1130" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-12" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-33" vertex="1" connectable="0">
+          <mxGeometry x="0.3875" y="2" relative="1" as="geometry">
+            <mxPoint x="-18" y="-12" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="LDplG8UmEiPDtL-p8i6A-31" target="0AOyOH4djSygT5G8EftG-25" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1266.5" y="1230" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-13" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="LDplG8UmEiPDtL-p8i6A-36" vertex="1" connectable="0">
+          <mxGeometry x="-0.0667" y="-1" relative="1" as="geometry">
+            <mxPoint x="18" y="-2" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="LDplG8UmEiPDtL-p8i6A-31" value="&lt;div&gt;Contains negated&lt;/div&gt;&lt;div&gt;IP address?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1161.5" y="1065" width="168.5" height="130" as="geometry" />
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;fontSize=15;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;" parent="1" source="HzgoOLMbdf1Lhczd7Y_U-1" target="0AOyOH4djSygT5G8EftG-4" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="1457" y="389" as="targetPoint" />
+            <mxPoint x="1327" y="589" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-5" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-4" vertex="1" connectable="0">
+          <mxGeometry x="-0.8787" y="4" relative="1" as="geometry">
+            <mxPoint x="22" y="-17" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="HzgoOLMbdf1Lhczd7Y_U-1" target="LDplG8UmEiPDtL-p8i6A-9" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="878.5" y="1176" as="sourcePoint" />
+            <mxPoint x="1144" y="740" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-15" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-8" vertex="1" connectable="0">
+          <mxGeometry x="0.4426" y="-1" relative="1" as="geometry">
+            <mxPoint x="-18" y="-15" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-1" value="&lt;div&gt;Payload&lt;/div&gt;&lt;div&gt;and&lt;br&gt;&lt;/div&gt;&lt;div&gt;stream match?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="867" y="687" width="215" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="0AOyOH4djSygT5G8EftG-1" target="LDplG8UmEiPDtL-p8i6A-2" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="541" y="743" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-11" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="919" y="1240" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="HzgoOLMbdf1Lhczd7Y_U-15" target="LDplG8UmEiPDtL-p8i6A-20" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="519.5" y="999" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-10" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-17" vertex="1" connectable="0">
+          <mxGeometry x="-0.4493" y="1" relative="1" as="geometry">
+            <mxPoint x="-16" y="-17" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="HzgoOLMbdf1Lhczd7Y_U-15" target="0AOyOH4djSygT5G8EftG-15" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="880" y="920" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-17" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="0AOyOH4djSygT5G8EftG-16" vertex="1" connectable="0">
+          <mxGeometry x="-0.2" y="1" relative="1" as="geometry">
+            <mxPoint x="14" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-15" value="&lt;div&gt;IP_Only&lt;/div&gt;&lt;div&gt;compatible?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="890" y="829" width="139" height="89" as="geometry" />
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="HzgoOLMbdf1Lhczd7Y_U-23" target="LDplG8UmEiPDtL-p8i6A-26" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="825" y="805" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zVmsChvBqX3Bo2thPNO_-12" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="HzgoOLMbdf1Lhczd7Y_U-25" vertex="1" connectable="0">
+          <mxGeometry x="-0.38" y="-2" relative="1" as="geometry">
+            <mxPoint x="6" y="-15" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="HzgoOLMbdf1Lhczd7Y_U-23" target="n4viz4upnR27VTd0IMI--8" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="716.9411764705883" y="1240" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-11" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="0AOyOH4djSygT5G8EftG-10" vertex="1" connectable="0">
+          <mxGeometry x="-0.1333" y="2" relative="1" as="geometry">
+            <mxPoint x="10" y="-1" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="HzgoOLMbdf1Lhczd7Y_U-23" value="Post Match:&lt;br&gt;&lt;div&gt;IP_Only&lt;/div&gt;&lt;div&gt;compatible?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="643.5" y="1065" width="146.5" height="130" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-1" value="Signature" style="shape=parallelogram;html=1;strokeWidth=1;perimeter=parallelogramPerimeter;whiteSpace=wrap;rounded=1;arcSize=12;size=0.23;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="460" y="701" width="140" height="82" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-2" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="668.5" y="582" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-4" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="914.5" y="578" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-5" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1163.5" y="579" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-8" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1386.5" y="579" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-12" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="676.5" y="975" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-15" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="899.5" y="974" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-21" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1381.5" y="974" width="130" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-23" value="&lt;font&gt;Like IP Only&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#cdeb8b;strokeColor=#36393d;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1384" y="1100" width="127.5" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="0AOyOH4djSygT5G8EftG-25" value="IP Only" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#000000;fontSize=15;shadow=1;" parent="1" vertex="1">
+          <mxGeometry x="1186.5" y="1240" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" edge="1" parent="1" source="n4viz4upnR27VTd0IMI--3" target="n4viz4upnR27VTd0IMI--4">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--2" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" vertex="1" connectable="0" parent="n4viz4upnR27VTd0IMI--1">
+          <mxGeometry x="-0.2" y="1" relative="1" as="geometry">
+            <mxPoint x="14" y="-4" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;fontSize=15;" edge="1" parent="1" source="n4viz4upnR27VTd0IMI--3" target="HzgoOLMbdf1Lhczd7Y_U-15">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="973" y="874" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--6" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" vertex="1" connectable="0" parent="n4viz4upnR27VTd0IMI--5">
+          <mxGeometry x="0.0134" y="-1" relative="1" as="geometry">
+            <mxPoint y="-14" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--3" value="&lt;div&gt;Non-payload&lt;/div&gt;&lt;div&gt;per-packet match?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" vertex="1" parent="1">
+          <mxGeometry x="1100" y="816" width="197" height="116" as="geometry" />
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--4" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" vertex="1" parent="1">
+          <mxGeometry x="1138.5" y="974" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="n4viz4upnR27VTd0IMI--8" value="Not IP Only" style="rounded=1;whiteSpace=wrap;html=1;fontSize=15;shadow=1;" vertex="1" parent="1">
+          <mxGeometry x="657" y="1240" width="120" height="60" as="geometry" />
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>
diff --git a/doc/userguide/rules/rule-types/RawFlowcharts/OverallAlgoHorizontal.drawio b/doc/userguide/rules/rule-types/RawFlowcharts/OverallAlgoHorizontal.drawio
new file mode 100644 (file)
index 0000000..b106527
--- /dev/null
@@ -0,0 +1,104 @@
+<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:132.0) Gecko/20100101 Firefox/132.0" version="24.9.1">
+  <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
+    <mxGraphModel dx="2261" dy="792" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+      <root>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-4" value="No" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=16;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=1;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;labelBorderColor=none;textShadow=0;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-6" target="WIyWlLk6GJQsqaUBKTNV-10" edge="1">
+          <mxGeometry y="20" relative="1" as="geometry">
+            <mxPoint as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-5" value="No" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=16;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=1;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2s8PCpyst4B-AYq6nZVi-2" target="WIyWlLk6GJQsqaUBKTNV-7" edge="1">
+          <mxGeometry x="0.0039" y="15" relative="1" as="geometry">
+            <mxPoint as="offset" />
+            <mxPoint x="-120" y="220" as="sourcePoint" />
+            <Array as="points">
+              <mxPoint x="-120" y="195" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="2s8PCpyst4B-AYq6nZVi-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;endArrow=blockThin;endFill=1;fontSize=16;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;shadow=1;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-6" target="2s8PCpyst4B-AYq6nZVi-2" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="-120" y="200" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="-120" y="360" />
+              <mxPoint x="-120" y="360" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="YKtqplUdx_BT4Hee0G-G-2" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;fontStyle=0" vertex="1" connectable="0" parent="2s8PCpyst4B-AYq6nZVi-1">
+          <mxGeometry x="-0.05" y="-3" relative="1" as="geometry">
+            <mxPoint x="17" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-6" value="Is IpOnly" style="rhombus;html=1;shadow=1;fontFamily=Helvetica;fontSize=16;align=center;strokeWidth=1;spacing=5;spacingTop=2;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-170" y="390" width="100" height="80" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-7" value="&lt;span&gt;IP Only&lt;/span&gt;" style="rounded=1;html=1;fontSize=16;glass=0;strokeWidth=1;shadow=1;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="213.5" y="160" width="91" height="70" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-8" value="No" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=16;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=1;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;labelBorderColor=none;textShadow=0;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-10" target="WIyWlLk6GJQsqaUBKTNV-11" edge="1">
+          <mxGeometry x="0.3333" y="20" relative="1" as="geometry">
+            <mxPoint as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-9" value="Yes" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=16;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=1;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-10" target="WIyWlLk6GJQsqaUBKTNV-12" edge="1">
+          <mxGeometry x="-0.0769" y="20" relative="1" as="geometry">
+            <mxPoint as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-10" value="Is DEOnly" style="rhombus;html=1;shadow=1;fontFamily=Helvetica;fontSize=16;align=center;strokeWidth=1;spacing=5;spacingTop=2;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry y="390" width="100" height="80" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-11" value="Handle &lt;span&gt;&#39;Packet&#39;&lt;/span&gt;, &lt;span&gt;&#39;Stream&#39;&lt;/span&gt;, &#39;&lt;span&gt;AppLayer&#39;&lt;/span&gt; and &lt;span&gt;&#39;AppLayer Transaction&#39;&lt;/span&gt; rule types" style="rounded=1;html=1;fontSize=16;glass=0;strokeWidth=1;shadow=1;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="163.5" y="375" width="191" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-12" value="&lt;span&gt;Decoder Events Only&lt;/span&gt;" style="rounded=1;html=1;fontSize=16;glass=0;strokeWidth=1;shadow=1;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-30" y="535" width="160" height="55" as="geometry" />
+        </mxCell>
+        <mxCell id="3Z0NyFf9CSu-jNyiQ6yW-0" value="Yes" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=16;endArrow=blockThin;endFill=1;endSize=8;strokeWidth=1;shadow=1;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="3Z0NyFf9CSu-jNyiQ6yW-1" target="3Z0NyFf9CSu-jNyiQ6yW-2" edge="1">
+          <mxGeometry x="-0.0769" y="20" relative="1" as="geometry">
+            <mxPoint as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="3Z0NyFf9CSu-jNyiQ6yW-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;fontSize=16;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;shadow=1;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="3Z0NyFf9CSu-jNyiQ6yW-1" target="WIyWlLk6GJQsqaUBKTNV-6" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="3Z0NyFf9CSu-jNyiQ6yW-4" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;shadow=1;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="3Z0NyFf9CSu-jNyiQ6yW-3" vertex="1" connectable="0">
+          <mxGeometry x="-0.1667" relative="1" as="geometry">
+            <mxPoint y="-20" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="3Z0NyFf9CSu-jNyiQ6yW-1" value="Is IPDOnly" style="rhombus;html=1;shadow=1;fontFamily=Helvetica;fontSize=16;align=center;strokeWidth=1;spacing=5;spacingTop=2;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-340" y="390" width="100" height="80" as="geometry" />
+        </mxCell>
+        <mxCell id="3Z0NyFf9CSu-jNyiQ6yW-2" value="&lt;span&gt;Protocol Detection Only&lt;/span&gt;" style="rounded=1;html=1;fontSize=16;glass=0;strokeWidth=1;shadow=1;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-370" y="535" width="160" height="65" as="geometry" />
+        </mxCell>
+        <mxCell id="3Z0NyFf9CSu-jNyiQ6yW-10" value="&lt;div&gt;&lt;span&gt;Like IP Only&lt;/span&gt;&lt;br&gt;(has negated address(es))&lt;br&gt;&lt;/div&gt;" style="rounded=1;html=1;fontSize=16;glass=0;strokeWidth=1;shadow=1;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="183.5" y="260" width="151" height="70" as="geometry" />
+        </mxCell>
+        <mxCell id="2s8PCpyst4B-AYq6nZVi-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;fontSize=16;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;shadow=1;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2s8PCpyst4B-AYq6nZVi-2" target="3Z0NyFf9CSu-jNyiQ6yW-10" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="2s8PCpyst4B-AYq6nZVi-4" value="&lt;div&gt;Yes&lt;br&gt;&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;shadow=1;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="2s8PCpyst4B-AYq6nZVi-3" vertex="1" connectable="0">
+          <mxGeometry x="-0.4" relative="1" as="geometry">
+            <mxPoint y="-20" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="2s8PCpyst4B-AYq6nZVi-2" value="&lt;div&gt;Contains&lt;/div&gt;&lt;div&gt;Negated&lt;/div&gt;&lt;div&gt;Address?&lt;/div&gt;" style="rhombus;html=1;fontSize=16;whiteSpace=wrap;labelBackgroundColor=none;labelBorderColor=none;textShadow=0;shadow=1;spacingRight=5;spacingBottom=2;spacingLeft=5;spacingTop=2;spacing=5;fontStyle=0" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-190" y="240" width="140" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="YKtqplUdx_BT4Hee0G-G-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;fontSize=16;shadow=1;fontStyle=0" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="YKtqplUdx_BT4Hee0G-G-0" target="3Z0NyFf9CSu-jNyiQ6yW-1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="YKtqplUdx_BT4Hee0G-G-0" value="Signature" style="shape=parallelogram;html=1;strokeWidth=1;perimeter=parallelogramPerimeter;whiteSpace=wrap;rounded=1;arcSize=12;size=0.23;fontSize=16;shadow=1;fontStyle=0" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
+          <mxGeometry x="-345" y="230" width="110" height="60" as="geometry" />
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>
diff --git a/doc/userguide/rules/rule-types/RawFlowcharts/PD-only.drawio b/doc/userguide/rules/rule-types/RawFlowcharts/PD-only.drawio
new file mode 100644 (file)
index 0000000..956f94d
--- /dev/null
@@ -0,0 +1,225 @@
+<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0" version="26.0.5">
+  <diagram name="Page-1" id="Huy6zuTNKuhlR82RVxZD">
+    <mxGraphModel dx="1434" dy="792" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+      <root>
+        <mxCell id="0" />
+        <mxCell id="1" parent="0" />
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-7" target="SssYP0pVQeMwz5sfJHV3-8" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-5" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-4" vertex="1" connectable="0">
+          <mxGeometry x="0.511" y="1" relative="1" as="geometry">
+            <mxPoint x="-46" y="-11" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-7" target="SssYP0pVQeMwz5sfJHV3-10" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="345" y="600" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-1" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-6" vertex="1" connectable="0">
+          <mxGeometry x="-0.333" relative="1" as="geometry">
+            <mxPoint x="13" y="1" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-7" value="&lt;div&gt;ALPROTO&lt;/div&gt;&lt;div&gt;UNKNOWN?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="201.88" y="440" width="148.75" height="120" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-8" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="473.13000000000005" y="467.13" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-10" target="SssYP0pVQeMwz5sfJHV3-19" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="277.25" y="960" as="targetPoint" />
+            <mxPoint x="277.29999999999995" y="819.9744360902255" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-2" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-9" vertex="1" connectable="0">
+          <mxGeometry x="-0.5283" y="1" relative="1" as="geometry">
+            <mxPoint x="12" y="7" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-10" value="&lt;div&gt;Payload&lt;br&gt;and/or&lt;br&gt;Stream match list?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="176.26" y="612" width="200" height="130" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-10" target="mP8Eb71_Q6LACfifqw_b-11" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-12" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-11" vertex="1" connectable="0">
+          <mxGeometry x="-0.3513" y="1" relative="1" as="geometry">
+            <mxPoint x="6" y="-11" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-19" target="mP8Eb71_Q6LACfifqw_b-3" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="701.8000000000002" y="698.04" as="targetPoint" />
+            <mxPoint x="310" y="1112" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-33" value="&lt;div&gt;Yes&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-17" vertex="1" connectable="0">
+          <mxGeometry x="-0.6597" y="-3" relative="1" as="geometry">
+            <mxPoint x="36" y="-17" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-19" value="Buffer inspection?" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="192.25" y="802" width="168" height="80" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-22" target="SssYP0pVQeMwz5sfJHV3-34" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="276.29999999999995" y="1024.9749646239252" as="sourcePoint" />
+            <mxPoint x="276.29999999999995" y="1136.01" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-12" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-35" vertex="1" connectable="0">
+          <mxGeometry x="0.0619" y="3" relative="1" as="geometry">
+            <mxPoint x="14" y="-9" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="mP8Eb71_Q6LACfifqw_b-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-22" target="a3aPwti0dP9LQcNFLp-g-5" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="557" y="991" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-9" value="&lt;font&gt;No&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="mP8Eb71_Q6LACfifqw_b-10" vertex="1" connectable="0">
+          <mxGeometry x="-0.4399" y="3" relative="1" as="geometry">
+            <mxPoint x="15" y="-9" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-22" value="&lt;div&gt;non-payload&lt;/div&gt;&lt;div&gt;per-packet&lt;/div&gt;&lt;div&gt;matches?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="184.39" y="934" width="183.74" height="115" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-30" target="SssYP0pVQeMwz5sfJHV3-32" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="275" y="1786" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WFfWZLXEymwSXmm__kdr-14" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-29" vertex="1" connectable="0">
+          <mxGeometry x="-0.5874" y="-4" relative="1" as="geometry">
+            <mxPoint x="20" y="16" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-30" value="&lt;div&gt;Has keyword&lt;/div&gt;&lt;div&gt;app-layer-protocol?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="150.25" y="1596" width="249.5" height="112" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-32" value="&lt;div&gt;Protocol Detection Only&lt;br&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#000000;rounded=1;shadow=1;fontSize=15;imageAspect=1;" parent="1" vertex="1">
+          <mxGeometry x="214.5" y="1758" width="121" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-34" target="SssYP0pVQeMwz5sfJHV3-39" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="170" y="1599" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-16" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-36" vertex="1" connectable="0">
+          <mxGeometry x="-0.2574" y="-1" relative="1" as="geometry">
+            <mxPoint x="15" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-34" target="a3aPwti0dP9LQcNFLp-g-4" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="726.26" y="1164" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-38" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-37" vertex="1" connectable="0">
+          <mxGeometry x="-0.3341" y="2" relative="1" as="geometry">
+            <mxPoint x="9" y="-10" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-34" value="Flowbits&lt;br&gt;AND NOT&lt;br&gt;flowbits:set" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="184.39000000000001" y="1084" width="181.87" height="110" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-39" target="SssYP0pVQeMwz5sfJHV3-43" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="182.5" y="1831" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-15" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-42" vertex="1" connectable="0">
+          <mxGeometry x="-0.05" y="4" relative="1" as="geometry">
+            <mxPoint x="10" y="-6" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WFfWZLXEymwSXmm__kdr-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-39" target="a3aPwti0dP9LQcNFLp-g-3" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="710" y="1546" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WFfWZLXEymwSXmm__kdr-17" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="WFfWZLXEymwSXmm__kdr-16" vertex="1" connectable="0">
+          <mxGeometry x="-0.7803" y="-4" relative="1" as="geometry">
+            <mxPoint x="22" y="-17" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-39" value="Flow setting&lt;br&gt;AND NOT&lt;br&gt;&lt;div&gt;TOSERVER&lt;/div&gt;&lt;div&gt;or TOCLIENT&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="164.24" y="1246" width="222.17" height="140" as="geometry" />
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-43" target="SssYP0pVQeMwz5sfJHV3-30" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-17" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="SssYP0pVQeMwz5sfJHV3-47" vertex="1" connectable="0">
+          <mxGeometry x="-0.2443" y="2" relative="1" as="geometry">
+            <mxPoint x="13" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="mP8Eb71_Q6LACfifqw_b-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-43" target="a3aPwti0dP9LQcNFLp-g-7" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="730" y="1710" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-14" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="mP8Eb71_Q6LACfifqw_b-9" vertex="1" connectable="0">
+          <mxGeometry x="-0.1489" y="-1" relative="1" as="geometry">
+            <mxPoint x="-13" y="-14" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="SssYP0pVQeMwz5sfJHV3-43" value="&lt;div&gt;Match&lt;/div&gt;&lt;div&gt;IP_Only compatible?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="160.17000000000002" y="1436.5" width="229.67" height="103" as="geometry" />
+        </mxCell>
+        <mxCell id="WFfWZLXEymwSXmm__kdr-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-19" target="SssYP0pVQeMwz5sfJHV3-22" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="300" y="900" as="sourcePoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-10" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="WFfWZLXEymwSXmm__kdr-3" vertex="1" connectable="0">
+          <mxGeometry x="-0.4227" y="3" relative="1" as="geometry">
+            <mxPoint x="11" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WFfWZLXEymwSXmm__kdr-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=15;endArrow=blockThin;endFill=1;" parent="1" source="SssYP0pVQeMwz5sfJHV3-30" target="a3aPwti0dP9LQcNFLp-g-8" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <mxPoint x="459.5" y="1691" as="sourcePoint" />
+            <mxPoint x="735" y="1691" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="WFfWZLXEymwSXmm__kdr-19" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;" parent="WFfWZLXEymwSXmm__kdr-18" vertex="1" connectable="0">
+          <mxGeometry x="-0.7573" y="-5" relative="1" as="geometry">
+            <mxPoint x="16" y="-19" as="offset" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="mP8Eb71_Q6LACfifqw_b-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;fontSize=15;" parent="1" source="mP8Eb71_Q6LACfifqw_b-1" target="SssYP0pVQeMwz5sfJHV3-7" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="mP8Eb71_Q6LACfifqw_b-1" value="Signature" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rounded=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="365" y="350" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="mP8Eb71_Q6LACfifqw_b-3" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="472" y="808.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="mP8Eb71_Q6LACfifqw_b-11" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="469.27" y="643.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-3" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="472" y="1282.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-4" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="472" y="1105.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-5" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="472" y="957.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-7" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="472" y="1454.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+        <mxCell id="a3aPwti0dP9LQcNFLp-g-8" value="Not PD_ONLY" style="whiteSpace=wrap;html=1;aspect=fixed;rotation=0;rounded=1;shadow=1;fontSize=15;" parent="1" vertex="1">
+          <mxGeometry x="469.27" y="1618.5" width="121.82" height="67" as="geometry" />
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>
index d1429f19f3c0130435ab239f8986d9e4a22e3dca..d576e550138aa3d468616a8e6fc6845d31d73b24 100644 (file)
@@ -110,6 +110,7 @@ static DetectEnginePktInspectionEngine *g_pkt_inspect_engines = NULL;
 static DetectEngineFrameInspectionEngine *g_frame_inspect_engines = NULL;
 
 // clang-format off
+// rule types documentation tag start: SignatureProperties
 const struct SignatureProperties signature_properties[SIG_TYPE_MAX] = {
     /* SIG_TYPE_NOT_SET */      { SIG_PROP_FLOW_ACTION_PACKET, },
     /* SIG_TYPE_IPONLY */       { SIG_PROP_FLOW_ACTION_FLOW, },
@@ -122,6 +123,7 @@ const struct SignatureProperties signature_properties[SIG_TYPE_MAX] = {
     /* SIG_TYPE_APPLAYER */     { SIG_PROP_FLOW_ACTION_FLOW, },
     /* SIG_TYPE_APP_TX */       { SIG_PROP_FLOW_ACTION_FLOW, },
 };
+// rule types documentation tag end: SignatureProperties
 // clang-format on
 
 /** \brief register inspect engine at start up time
index 804d3d7b1485f7fa8aa01d84fa6f6efe763c848f..7408ec8edc4e799d10daeb70b0232088cb3368d5 100644 (file)
@@ -59,6 +59,7 @@ struct SCSigOrderFunc_;
 /* Forward declarations for structures from Rust. */
 typedef struct SCDetectRequiresStatus SCDetectRequiresStatus;
 
+// rule types documentation tag start: SignatureType
 enum SignatureType {
     SIG_TYPE_NOT_SET = 0,
     SIG_TYPE_IPONLY,      // rule is handled by IPONLY engine
@@ -76,6 +77,7 @@ enum SignatureType {
 
     SIG_TYPE_MAX,
 };
+// rule types documentation tag end: SignatureType
 
 enum SignaturePropertyFlowAction {
     SIG_PROP_FLOW_ACTION_PACKET,