Merge tag 'rproc-v5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc...
[linux-2.6-microblaze.git] / net / netfilter / nfnetlink_queue.c
index 64a6acb..a364f8e 100644 (file)
@@ -392,6 +392,7 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
        bool csum_verify;
        char *secdata = NULL;
        u32 seclen = 0;
+       ktime_t tstamp;
 
        size = nlmsg_total_size(sizeof(struct nfgenmsg))
                + nla_total_size(sizeof(struct nfqnl_msg_packet_hdr))
@@ -402,11 +403,13 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
                + nla_total_size(sizeof(u_int32_t))     /* ifindex */
 #endif
                + nla_total_size(sizeof(u_int32_t))     /* mark */
+               + nla_total_size(sizeof(u_int32_t))     /* priority */
                + nla_total_size(sizeof(struct nfqnl_msg_packet_hw))
                + nla_total_size(sizeof(u_int32_t))     /* skbinfo */
                + nla_total_size(sizeof(u_int32_t));    /* cap_len */
 
-       if (entskb->tstamp)
+       tstamp = skb_tstamp_cond(entskb, false);
+       if (tstamp)
                size += nla_total_size(sizeof(struct nfqnl_msg_packet_timestamp));
 
        size += nfqnl_get_bridge_size(entry);
@@ -559,6 +562,10 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
            nla_put_be32(skb, NFQA_MARK, htonl(entskb->mark)))
                goto nla_put_failure;
 
+       if (entskb->priority &&
+           nla_put_be32(skb, NFQA_PRIORITY, htonl(entskb->priority)))
+               goto nla_put_failure;
+
        if (indev && entskb->dev &&
            skb_mac_header_was_set(entskb) &&
            skb_mac_header_len(entskb) != 0) {
@@ -577,9 +584,9 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
        if (nfqnl_put_bridge(entry, skb) < 0)
                goto nla_put_failure;
 
-       if (entry->state.hook <= NF_INET_FORWARD && entskb->tstamp) {
+       if (entry->state.hook <= NF_INET_FORWARD && tstamp) {
                struct nfqnl_msg_packet_timestamp ts;
-               struct timespec64 kts = ktime_to_timespec64(entskb->tstamp);
+               struct timespec64 kts = ktime_to_timespec64(tstamp);
 
                ts.sec = cpu_to_be64(kts.tv_sec);
                ts.usec = cpu_to_be64(kts.tv_nsec / NSEC_PER_USEC);
@@ -1020,11 +1027,13 @@ static const struct nla_policy nfqa_verdict_policy[NFQA_MAX+1] = {
        [NFQA_CT]               = { .type = NLA_UNSPEC },
        [NFQA_EXP]              = { .type = NLA_UNSPEC },
        [NFQA_VLAN]             = { .type = NLA_NESTED },
+       [NFQA_PRIORITY]         = { .type = NLA_U32 },
 };
 
 static const struct nla_policy nfqa_verdict_batch_policy[NFQA_MAX+1] = {
        [NFQA_VERDICT_HDR]      = { .len = sizeof(struct nfqnl_msg_verdict_hdr) },
        [NFQA_MARK]             = { .type = NLA_U32 },
+       [NFQA_PRIORITY]         = { .type = NLA_U32 },
 };
 
 static struct nfqnl_instance *
@@ -1105,6 +1114,9 @@ static int nfqnl_recv_verdict_batch(struct sk_buff *skb,
                if (nfqa[NFQA_MARK])
                        entry->skb->mark = ntohl(nla_get_be32(nfqa[NFQA_MARK]));
 
+               if (nfqa[NFQA_PRIORITY])
+                       entry->skb->priority = ntohl(nla_get_be32(nfqa[NFQA_PRIORITY]));
+
                nfqnl_reinject(entry, verdict);
        }
        return 0;
@@ -1231,6 +1243,9 @@ static int nfqnl_recv_verdict(struct sk_buff *skb, const struct nfnl_info *info,
        if (nfqa[NFQA_MARK])
                entry->skb->mark = ntohl(nla_get_be32(nfqa[NFQA_MARK]));
 
+       if (nfqa[NFQA_PRIORITY])
+               entry->skb->priority = ntohl(nla_get_be32(nfqa[NFQA_PRIORITY]));
+
        nfqnl_reinject(entry, verdict);
        return 0;
 }