net: ipa: drop packet if status has valid tag
authorAlex Elder <elder@linaro.org>
Tue, 26 Jan 2021 18:57:00 +0000 (12:57 -0600)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Jan 2021 04:23:26 +0000 (20:23 -0800)
Introduce ipa_endpoint_status_tag(), which returns true if received
status indicates its tag field is valid.  The endpoint parameter is
not yet used.

Call this from ipa_status_drop_packet(), and drop the packet if the
status indicates the tag was valid.  Pass the endpoint pointer to
ipa_status_drop_packet(), and rename it ipa_endpoint_status_drop().
The endpoint will be used in the next patch.

Signed-off-by: Alex Elder <elder@linaro.org>
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ipa/ipa_endpoint.c

index c552421..68970a3 100644 (file)
@@ -69,8 +69,11 @@ struct ipa_status {
 };
 
 /* Field masks for struct ipa_status structure fields */
+#define IPA_STATUS_MASK_TAG_VALID_FMASK                GENMASK(4, 4)
+#define IPA_STATUS_SRC_IDX_FMASK               GENMASK(4, 0)
 #define IPA_STATUS_DST_IDX_FMASK               GENMASK(4, 0)
 #define IPA_STATUS_FLAGS1_RT_RULE_ID_FMASK     GENMASK(31, 22)
+#define IPA_STATUS_FLAGS2_TAG_FMASK            GENMASK_ULL(63, 16)
 
 #ifdef IPA_VALIDATE
 
@@ -1172,11 +1175,22 @@ static bool ipa_endpoint_status_skip(struct ipa_endpoint *endpoint,
        return false;   /* Don't skip this packet, process it */
 }
 
+static bool ipa_endpoint_status_tag(struct ipa_endpoint *endpoint,
+                                   const struct ipa_status *status)
+{
+       return !!le16_get_bits(status->mask, IPA_STATUS_MASK_TAG_VALID_FMASK);
+}
+
 /* Return whether the status indicates the packet should be dropped */
-static bool ipa_status_drop_packet(const struct ipa_status *status)
+static bool ipa_endpoint_status_drop(struct ipa_endpoint *endpoint,
+                                    const struct ipa_status *status)
 {
        u32 val;
 
+       /* If the status indicates a tagged transfer, we'll drop the packet */
+       if (ipa_endpoint_status_tag(endpoint, status))
+               return true;
+
        /* Deaggregation exceptions we drop; all other types we consume */
        if (status->exception)
                return status->exception == IPA_STATUS_EXCEPTION_DEAGGR;
@@ -1225,7 +1239,7 @@ static void ipa_endpoint_status_parse(struct ipa_endpoint *endpoint,
                if (endpoint->data->checksum)
                        len += sizeof(struct rmnet_map_dl_csum_trailer);
 
-               if (!ipa_status_drop_packet(status)) {
+               if (!ipa_endpoint_status_drop(endpoint, status)) {
                        void *data2;
                        u32 extra;
                        u32 len2;