Skip to content

Commit

Permalink
[NET]: Introducing socket mark socket option.
Browse files Browse the repository at this point in the history
A userspace program may wish to set the mark for each packets its send
without using the netfilter MARK target. Changing the mark can be used
for mark based routing without netfilter or for packet filtering.

It requires CAP_NET_ADMIN capability.

Signed-off-by: Laszlo Attila Toth <panther@balabit.hu>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
LA-Toth authored and davem330 committed Feb 1, 2008
1 parent 036c2e2 commit 4a19ec5
Show file tree
Hide file tree
Showing 27 changed files with 65 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/asm-alpha/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,6 @@
#define SO_SECURITY_ENCRYPTION_TRANSPORT 20
#define SO_SECURITY_ENCRYPTION_NETWORK 21

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-arm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-avr32/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* __ASM_AVR32_SOCKET_H */
3 changes: 3 additions & 0 deletions include/asm-blackfin/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,7 @@
#define SO_PASSSEC 34
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-cris/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */


2 changes: 2 additions & 0 deletions include/asm-frv/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,7 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */

2 changes: 2 additions & 0 deletions include/asm-h8300/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-ia64/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_IA64_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-m32r/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_M32R_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-m68k/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-mips/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#ifdef __KERNEL__

/** sock_type - Socket types
Expand Down
2 changes: 2 additions & 0 deletions include/asm-parisc/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_PEERSEC 0x401d
#define SO_PASSSEC 0x401e

#define SO_MARK 0x401f

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-powerpc/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_POWERPC_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-s390/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-sh/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* __ASM_SH_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-sparc/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
#define SO_TIMESTAMPNS 0x0021
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 0x0022

/* Security levels - as per NRL IPv6 - don't actually do anything */
#define SO_SECURITY_AUTHENTICATION 0x5001
#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
Expand Down
1 change: 1 addition & 0 deletions include/asm-sparc64/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,5 @@
#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
#define SO_SECURITY_ENCRYPTION_NETWORK 0x5004

#define SO_MARK 0x0022
#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-v850/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* __V850_SOCKET_H__ */
2 changes: 2 additions & 0 deletions include/asm-x86/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _ASM_SOCKET_H */
2 changes: 2 additions & 0 deletions include/asm-xtensa/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,6 @@
#define SO_TIMESTAMPNS 35
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS

#define SO_MARK 36

#endif /* _XTENSA_SOCKET_H */
2 changes: 2 additions & 0 deletions include/net/route.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <net/dst.h>
#include <net/inetpeer.h>
#include <net/flow.h>
#include <net/sock.h>
#include <linux/in_route.h>
#include <linux/rtnetlink.h>
#include <linux/route.h>
Expand Down Expand Up @@ -149,6 +150,7 @@ static inline int ip_route_connect(struct rtable **rp, __be32 dst,
int flags)
{
struct flowi fl = { .oif = oif,
.mark = sk->sk_mark,
.nl_u = { .ip4_u = { .daddr = dst,
.saddr = src,
.tos = tos } },
Expand Down
2 changes: 2 additions & 0 deletions include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,8 @@ struct sock {
__u32 sk_sndmsg_off;
int sk_write_pending;
void *sk_security;
__u32 sk_mark;
/* XXX 4 bytes hole on 64 bit */
void (*sk_state_change)(struct sock *sk);
void (*sk_data_ready)(struct sock *sk, int bytes);
void (*sk_write_space)(struct sock *sk);
Expand Down
11 changes: 11 additions & 0 deletions net/core/sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
else
clear_bit(SOCK_PASSSEC, &sock->flags);
break;
case SO_MARK:
if (!capable(CAP_NET_ADMIN))
ret = -EPERM;
else {
sk->sk_mark = val;
}
break;

/* We implement the SO_SNDLOWAT etc to
not be settable (1003.1g 5.3) */
Expand Down Expand Up @@ -836,6 +843,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
case SO_PEERSEC:
return security_socket_getpeersec_stream(sock, optval, optlen, len);

case SO_MARK:
v.val = sk->sk_mark;
break;

default:
return -ENOPROTOOPT;
}
Expand Down
3 changes: 3 additions & 0 deletions net/ipv4/ip_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
}

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;

/* Send it out. */
return ip_local_out(skb);
Expand Down Expand Up @@ -385,6 +386,7 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
(skb_shinfo(skb)->gso_segs ?: 1) - 1);

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;

return ip_local_out(skb);

Expand Down Expand Up @@ -1286,6 +1288,7 @@ int ip_push_pending_frames(struct sock *sk)
iph->daddr = rt->rt_dst;

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;
skb->dst = dst_clone(&rt->u.dst);

if (iph->protocol == IPPROTO_ICMP)
Expand Down
2 changes: 2 additions & 0 deletions net/ipv4/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
skb_reserve(skb, hh_len);

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;
skb->dst = dst_clone(&rt->u.dst);

skb_reset_network_header(skb);
Expand Down Expand Up @@ -544,6 +545,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,

{
struct flowi fl = { .oif = ipc.oif,
.mark = sk->sk_mark,
.nl_u = { .ip4_u =
{ .daddr = daddr,
.saddr = saddr,
Expand Down
2 changes: 2 additions & 0 deletions net/ipv6/ip6_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
ipv6_addr_copy(&hdr->daddr, first_hop);

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;

mtu = dst_mtu(dst);
if ((skb->len <= mtu) || ipfragok || skb_is_gso(skb)) {
Expand Down Expand Up @@ -1439,6 +1440,7 @@ int ip6_push_pending_frames(struct sock *sk)
ipv6_addr_copy(&hdr->daddr, final_dst);

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;

skb->dst = dst_clone(&rt->u.dst);
IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS);
Expand Down
3 changes: 3 additions & 0 deletions net/ipv6/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
skb_reserve(skb, hh_len);

skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;
skb->dst = dst_clone(&rt->u.dst);

skb_put(skb, length);
Expand Down Expand Up @@ -767,6 +768,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
*/
memset(&fl, 0, sizeof(fl));

fl.mark = sk->sk_mark;

if (sin6) {
if (addr_len < SIN6_LEN_RFC2133)
return -EINVAL;
Expand Down

0 comments on commit 4a19ec5

Please sign in to comment.