ipv4: Implement IP_TRANSPARENT socket option
This patch introduces the IP_TRANSPARENT socket option: enabling that will make the IPv4 routing omit the non-local source address check on output. Setting IP_TRANSPARENT requires NET_ADMIN capability. Signed-off-by: KOVACS Krisztian <hidden@sch.bme.hu> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a210d01ae3
commit
f5715aea45
@@ -419,7 +419,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
|
||||
(1<<IP_TTL) | (1<<IP_HDRINCL) |
|
||||
(1<<IP_MTU_DISCOVER) | (1<<IP_RECVERR) |
|
||||
(1<<IP_ROUTER_ALERT) | (1<<IP_FREEBIND) |
|
||||
(1<<IP_PASSSEC))) ||
|
||||
(1<<IP_PASSSEC) | (1<<IP_TRANSPARENT))) ||
|
||||
optname == IP_MULTICAST_TTL ||
|
||||
optname == IP_MULTICAST_LOOP) {
|
||||
if (optlen >= sizeof(int)) {
|
||||
@@ -878,6 +878,16 @@ static int do_ip_setsockopt(struct sock *sk, int level,
|
||||
err = xfrm_user_policy(sk, optname, optval, optlen);
|
||||
break;
|
||||
|
||||
case IP_TRANSPARENT:
|
||||
if (!capable(CAP_NET_ADMIN)) {
|
||||
err = -EPERM;
|
||||
break;
|
||||
}
|
||||
if (optlen < 1)
|
||||
goto e_inval;
|
||||
inet->transparent = !!val;
|
||||
break;
|
||||
|
||||
default:
|
||||
err = -ENOPROTOOPT;
|
||||
break;
|
||||
@@ -1130,6 +1140,9 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
|
||||
case IP_FREEBIND:
|
||||
val = inet->freebind;
|
||||
break;
|
||||
case IP_TRANSPARENT:
|
||||
val = inet->transparent;
|
||||
break;
|
||||
default:
|
||||
release_sock(sk);
|
||||
return -ENOPROTOOPT;
|
||||
|
Reference in New Issue
Block a user