-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 112106 b: refs/heads/master c: 9ad2d74 h: refs/heads/master v: v3
- Loading branch information
KOVACS Krisztian
authored and
Patrick McHardy
committed
Oct 8, 2008
1 parent
23ab5e1
commit 2f39638
Showing
5 changed files
with
147 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 73e4022f78acdbe420e8c24a7afbd90f4c8f5077 | ||
refs/heads/master: 9ad2d745a23853927a19789b034d9eb2e62d78ee |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#ifndef _NF_TPROXY_CORE_H | ||
#define _NF_TPROXY_CORE_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/in.h> | ||
#include <linux/skbuff.h> | ||
#include <net/sock.h> | ||
#include <net/inet_sock.h> | ||
#include <net/tcp.h> | ||
|
||
/* look up and get a reference to a matching socket */ | ||
extern struct sock * | ||
nf_tproxy_get_sock_v4(struct net *net, const u8 protocol, | ||
const __be32 saddr, const __be32 daddr, | ||
const __be16 sport, const __be16 dport, | ||
const struct net_device *in, bool listening); | ||
|
||
static inline void | ||
nf_tproxy_put_sock(struct sock *sk) | ||
{ | ||
/* TIME_WAIT inet sockets have to be handled differently */ | ||
if ((sk->sk_protocol == IPPROTO_TCP) && (sk->sk_state == TCP_TIME_WAIT)) | ||
inet_twsk_put(inet_twsk(sk)); | ||
else | ||
sock_put(sk); | ||
} | ||
|
||
/* assign a socket to the skb -- consumes sk */ | ||
int | ||
nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/* | ||
* Transparent proxy support for Linux/iptables | ||
* | ||
* Copyright (c) 2006-2007 BalaBit IT Ltd. | ||
* Author: Balazs Scheidler, Krisztian Kovacs | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
*/ | ||
|
||
#include <linux/version.h> | ||
#include <linux/module.h> | ||
|
||
#include <linux/net.h> | ||
#include <linux/if.h> | ||
#include <linux/netdevice.h> | ||
#include <net/udp.h> | ||
#include <net/netfilter/nf_tproxy_core.h> | ||
|
||
struct sock * | ||
nf_tproxy_get_sock_v4(struct net *net, const u8 protocol, | ||
const __be32 saddr, const __be32 daddr, | ||
const __be16 sport, const __be16 dport, | ||
const struct net_device *in, bool listening_only) | ||
{ | ||
struct sock *sk; | ||
|
||
/* look up socket */ | ||
switch (protocol) { | ||
case IPPROTO_TCP: | ||
if (listening_only) | ||
sk = __inet_lookup_listener(net, &tcp_hashinfo, | ||
daddr, ntohs(dport), | ||
in->ifindex); | ||
else | ||
sk = __inet_lookup(net, &tcp_hashinfo, | ||
saddr, sport, daddr, dport, | ||
in->ifindex); | ||
break; | ||
case IPPROTO_UDP: | ||
sk = udp4_lib_lookup(net, saddr, sport, daddr, dport, | ||
in->ifindex); | ||
break; | ||
default: | ||
WARN_ON(1); | ||
sk = NULL; | ||
} | ||
|
||
pr_debug("tproxy socket lookup: proto %u %08x:%u -> %08x:%u, listener only: %d, sock %p\n", | ||
protocol, ntohl(saddr), ntohs(sport), ntohl(daddr), ntohs(dport), listening_only, sk); | ||
|
||
return sk; | ||
} | ||
EXPORT_SYMBOL_GPL(nf_tproxy_get_sock_v4); | ||
|
||
static void | ||
nf_tproxy_destructor(struct sk_buff *skb) | ||
{ | ||
struct sock *sk = skb->sk; | ||
|
||
skb->sk = NULL; | ||
skb->destructor = NULL; | ||
|
||
if (sk) | ||
nf_tproxy_put_sock(sk); | ||
} | ||
|
||
/* consumes sk */ | ||
int | ||
nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk) | ||
{ | ||
if (inet_sk(sk)->transparent) { | ||
skb->sk = sk; | ||
skb->destructor = nf_tproxy_destructor; | ||
return 1; | ||
} else | ||
nf_tproxy_put_sock(sk); | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL_GPL(nf_tproxy_assign_sock); | ||
|
||
static int __init nf_tproxy_init(void) | ||
{ | ||
pr_info("NF_TPROXY: Transparent proxy support initialized, version 4.1.0\n"); | ||
pr_info("NF_TPROXY: Copyright (c) 2006-2007 BalaBit IT Ltd.\n"); | ||
return 0; | ||
} | ||
|
||
module_init(nf_tproxy_init); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Krisztian Kovacs"); | ||
MODULE_DESCRIPTION("Transparent proxy support core routines"); |