These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / core / utils.c
index 7b80388..3d17ca8 100644 (file)
@@ -301,22 +301,24 @@ out:
 EXPORT_SYMBOL(in6_pton);
 
 void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
-                             __be32 from, __be32 to, int pseudohdr)
+                             __be32 from, __be32 to, bool pseudohdr)
 {
        if (skb->ip_summed != CHECKSUM_PARTIAL) {
-               *sum = csum_fold(csum_add(csum_sub(~csum_unfold(*sum), from),
-                                to));
+               csum_replace4(sum, from, to);
                if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr)
-                       skb->csum = ~csum_add(csum_sub(~(skb->csum), from), to);
+                       skb->csum = ~csum_add(csum_sub(~(skb->csum),
+                                                      (__force __wsum)from),
+                                             (__force __wsum)to);
        } else if (pseudohdr)
-               *sum = ~csum_fold(csum_add(csum_sub(csum_unfold(*sum), from),
-                                 to));
+               *sum = ~csum_fold(csum_add(csum_sub(csum_unfold(*sum),
+                                                   (__force __wsum)from),
+                                          (__force __wsum)to));
 }
 EXPORT_SYMBOL(inet_proto_csum_replace4);
 
 void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
                               const __be32 *from, const __be32 *to,
-                              int pseudohdr)
+                              bool pseudohdr)
 {
        __be32 diff[] = {
                ~from[0], ~from[1], ~from[2], ~from[3],
@@ -334,51 +336,15 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
 }
 EXPORT_SYMBOL(inet_proto_csum_replace16);
 
-struct __net_random_once_work {
-       struct work_struct work;
-       struct static_key *key;
-};
-
-static void __net_random_once_deferred(struct work_struct *w)
-{
-       struct __net_random_once_work *work =
-               container_of(w, struct __net_random_once_work, work);
-       BUG_ON(!static_key_enabled(work->key));
-       static_key_slow_dec(work->key);
-       kfree(work);
-}
-
-static void __net_random_once_disable_jump(struct static_key *key)
+void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb,
+                                    __wsum diff, bool pseudohdr)
 {
-       struct __net_random_once_work *w;
-
-       w = kmalloc(sizeof(*w), GFP_ATOMIC);
-       if (!w)
-               return;
-
-       INIT_WORK(&w->work, __net_random_once_deferred);
-       w->key = key;
-       schedule_work(&w->work);
-}
-
-bool __net_get_random_once(void *buf, int nbytes, bool *done,
-                          struct static_key *once_key)
-{
-       static DEFINE_SPINLOCK(lock);
-       unsigned long flags;
-
-       spin_lock_irqsave(&lock, flags);
-       if (*done) {
-               spin_unlock_irqrestore(&lock, flags);
-               return false;
+       if (skb->ip_summed != CHECKSUM_PARTIAL) {
+               *sum = csum_fold(csum_add(diff, ~csum_unfold(*sum)));
+               if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr)
+                       skb->csum = ~csum_add(diff, ~skb->csum);
+       } else if (pseudohdr) {
+               *sum = ~csum_fold(csum_add(diff, csum_unfold(*sum)));
        }
-
-       get_random_bytes(buf, nbytes);
-       *done = true;
-       spin_unlock_irqrestore(&lock, flags);
-
-       __net_random_once_disable_jump(once_key);
-
-       return true;
 }
-EXPORT_SYMBOL(__net_get_random_once);
+EXPORT_SYMBOL(inet_proto_csum_replace_by_diff);