Commit 7b2ff18ee7b0ec4bc3162f821e221781aaca48bd

Authored by Jiri Olsa
Committed by David S. Miller
1 parent 01fc3e86c6

net - IP_NODEFRAG option for IPv4 socket

this patch is implementing IP_NODEFRAG option for IPv4 socket.
The reason is, there's no other way to send out the packet with user
customized header of the reassembly part.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 5 changed files with 18 additions and 2 deletions Side-by-side Diff

... ... @@ -85,6 +85,7 @@
85 85 #define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
86 86  
87 87 #define IP_MINTTL 21
  88 +#define IP_NODEFRAG 22
88 89  
89 90 /* IP_MTU_DISCOVER values */
90 91 #define IP_PMTUDISC_DONT 0 /* Never send DF frames */
include/net/inet_sock.h
... ... @@ -137,7 +137,8 @@
137 137 hdrincl:1,
138 138 mc_loop:1,
139 139 transparent:1,
140   - mc_all:1;
  140 + mc_all:1,
  141 + nodefrag:1;
141 142 int mc_index;
142 143 __be32 mc_addr;
143 144 struct ip_mc_socklist *mc_list;
... ... @@ -355,6 +355,8 @@
355 355 inet = inet_sk(sk);
356 356 inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
357 357  
  358 + inet->nodefrag = 0;
  359 +
358 360 if (SOCK_RAW == sock->type) {
359 361 inet->inet_num = protocol;
360 362 if (IPPROTO_RAW == protocol)
net/ipv4/ip_sockglue.c
... ... @@ -465,7 +465,7 @@
465 465 (1<<IP_MTU_DISCOVER) | (1<<IP_RECVERR) |
466 466 (1<<IP_ROUTER_ALERT) | (1<<IP_FREEBIND) |
467 467 (1<<IP_PASSSEC) | (1<<IP_TRANSPARENT) |
468   - (1<<IP_MINTTL))) ||
  468 + (1<<IP_MINTTL) | (1<<IP_NODEFRAG))) ||
469 469 optname == IP_MULTICAST_TTL ||
470 470 optname == IP_MULTICAST_ALL ||
471 471 optname == IP_MULTICAST_LOOP ||
... ... @@ -587,6 +587,13 @@
587 587 break;
588 588 }
589 589 inet->hdrincl = val ? 1 : 0;
  590 + break;
  591 + case IP_NODEFRAG:
  592 + if (sk->sk_type != SOCK_RAW) {
  593 + err = -ENOPROTOOPT;
  594 + break;
  595 + }
  596 + inet->nodefrag = val ? 1 : 0;
590 597 break;
591 598 case IP_MTU_DISCOVER:
592 599 if (val < IP_PMTUDISC_DONT || val > IP_PMTUDISC_PROBE)
net/ipv4/netfilter/nf_defrag_ipv4.c
... ... @@ -66,6 +66,11 @@
66 66 const struct net_device *out,
67 67 int (*okfn)(struct sk_buff *))
68 68 {
  69 + struct inet_sock *inet = inet_sk(skb->sk);
  70 +
  71 + if (inet && inet->nodefrag)
  72 + return NF_ACCEPT;
  73 +
69 74 #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
70 75 #if !defined(CONFIG_NF_NAT) && !defined(CONFIG_NF_NAT_MODULE)
71 76 /* Previously seen (loopback)? Ignore. Do this before