Revert "inet: update the IP ID generation algorithm to higher standards." [Linux 3.16.72]

This Linux kernel change "Revert “inet: update the IP ID generation algorithm to higher standards.”" is included in the Linux 3.16.72 release. This change is authored by Ben Hutchings <ben [at]> on Fri Aug 9 20:09:49 2019 +0100. The commit for this change in Linux stable tree is 05f4b67 (patch).

Revert "inet: update the IP ID generation algorithm to higher standards."

This reverts commit 8b197d3ce585d6777197e0633d71e5af7d98cb35, which
was a stable-specific improvement to IP ID selection.  I will apply
the upstream changes instead.

Signed-off-by: Ben Hutchings <>

There are 7 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 net/ipv4/route.c      | 4 +---
 net/ipv6/ip6_output.c | 3 ---
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 6608481..236c6c6 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -487,15 +487,13 @@ u32 ip_idents_reserve(u32 hash, int segs)
 void __ip_select_ident(struct iphdr *iph, int segs)
    static u32 ip_idents_hashrnd __read_mostly;
-   static u32 ip_idents_hashrnd_extra __read_mostly;
    u32 hash, id;

    net_get_random_once(&ip_idents_hashrnd, sizeof(ip_idents_hashrnd));
-   net_get_random_once(&ip_idents_hashrnd_extra, sizeof(ip_idents_hashrnd_extra));

    hash = jhash_3words((__force u32)iph->daddr,
                (__force u32)iph->saddr,
-               iph->protocol ^ ip_idents_hashrnd_extra,
+               iph->protocol,
    id = ip_idents_reserve(hash, segs);
    iph->id = htons(id);
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index bb98cde..e59b300 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -541,15 +541,12 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
 static void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt)
    static u32 ip6_idents_hashrnd __read_mostly;
-   static u32 ip6_idents_hashrnd_extra __read_mostly;
    u32 hash, id;

    net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd));
-   net_get_random_once(&ip6_idents_hashrnd_extra, sizeof(ip6_idents_hashrnd_extra));

    hash = __ipv6_addr_jhash(&rt->rt6i_dst.addr, ip6_idents_hashrnd);
    hash = __ipv6_addr_jhash(&rt->rt6i_src.addr, hash);
-   hash = jhash_1word(hash, ip6_idents_hashrnd_extra);

    id = ip_idents_reserve(hash, 1);
    fhdr->identification = htonl(id);

Leave a Reply

Your email address will not be published. Required fields are marked *