mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1674 commits)
qlcnic: adding co maintainer
ixgbe: add support for active DA cables
ixgbe: dcb, do not tag tc_prio_control frames
ixgbe: fix ixgbe_tx_is_paused logic
ixgbe: always enable vlan strip/insert when DCB is enabled
ixgbe: remove some redundant code in setting FCoE FIP filter
ixgbe: fix wrong offset to fc_frame_header in ixgbe_fcoe_ddp
ixgbe: fix header len when unsplit packet overflows to data buffer
ipv6: Never schedule DAD timer on dead address
ipv6: Use POSTDAD state
ipv6: Use state_lock to protect ifa state
ipv6: Replace inet6_ifaddr->dead with state
cxgb4: notify upper drivers if the device is already up when they load
cxgb4: keep interrupts available when the ports are brought down
cxgb4: fix initial addition of MAC address
cnic: Return SPQ credit to bnx2x after ring setup and shutdown.
cnic: Convert cnic_local_flags to atomic ops.
can: Fix SJA1000 command register writes on SMP systems
bridge: fix build for CONFIG_SYSFS disabled
ARCNET: Limit com20020 PCI ID matches for SOHARD cards
...
Fix up various conflicts with pcmcia tree drivers/net/
{pcmcia/3c589_cs.c, wireless/orinoco/orinoco_cs.c and
wireless/orinoco/spectrum_cs.c} and feature removal
(Documentation/feature-removal-schedule.txt).
Also fix a non-content conflict due to pm_qos_requirement getting
renamed in the PM tree (now pm_qos_request) in net/mac80211/scan.c
This commit is contained in:
commit
f8965467f3
1455 changed files with 95833 additions and 48202 deletions
|
|
@ -250,6 +250,20 @@ config IP_MROUTE
|
|||
<file:Documentation/networking/multicast.txt>. If you haven't heard
|
||||
about it, you don't need it.
|
||||
|
||||
config IP_MROUTE_MULTIPLE_TABLES
|
||||
bool "IP: multicast policy routing"
|
||||
depends on IP_MROUTE && IP_ADVANCED_ROUTER
|
||||
select FIB_RULES
|
||||
help
|
||||
Normally, a multicast router runs a userspace daemon and decides
|
||||
what to do with a multicast packet based on the source and
|
||||
destination addresses. If you say Y here, the multicast router
|
||||
will also be able to take interfaces and packet marks into
|
||||
account and run multiple instances of userspace daemons
|
||||
simultaneously, each one handling a single table.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config IP_PIMSM_V1
|
||||
bool "IP: PIM-SM version 1 support"
|
||||
depends on IP_MROUTE
|
||||
|
|
@ -587,9 +601,15 @@ choice
|
|||
config DEFAULT_HTCP
|
||||
bool "Htcp" if TCP_CONG_HTCP=y
|
||||
|
||||
config DEFAULT_HYBLA
|
||||
bool "Hybla" if TCP_CONG_HYBLA=y
|
||||
|
||||
config DEFAULT_VEGAS
|
||||
bool "Vegas" if TCP_CONG_VEGAS=y
|
||||
|
||||
config DEFAULT_VENO
|
||||
bool "Veno" if TCP_CONG_VENO=y
|
||||
|
||||
config DEFAULT_WESTWOOD
|
||||
bool "Westwood" if TCP_CONG_WESTWOOD=y
|
||||
|
||||
|
|
@ -610,8 +630,10 @@ config DEFAULT_TCP_CONG
|
|||
default "bic" if DEFAULT_BIC
|
||||
default "cubic" if DEFAULT_CUBIC
|
||||
default "htcp" if DEFAULT_HTCP
|
||||
default "hybla" if DEFAULT_HYBLA
|
||||
default "vegas" if DEFAULT_VEGAS
|
||||
default "westwood" if DEFAULT_WESTWOOD
|
||||
default "veno" if DEFAULT_VENO
|
||||
default "reno" if DEFAULT_RENO
|
||||
default "cubic"
|
||||
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ void inet_sock_destruct(struct sock *sk)
|
|||
WARN_ON(sk->sk_forward_alloc);
|
||||
|
||||
kfree(inet->opt);
|
||||
dst_release(sk->sk_dst_cache);
|
||||
dst_release(rcu_dereference_check(sk->sk_dst_cache, 1));
|
||||
sk_refcnt_debug_dec(sk);
|
||||
}
|
||||
EXPORT_SYMBOL(inet_sock_destruct);
|
||||
|
|
@ -419,6 +419,8 @@ int inet_release(struct socket *sock)
|
|||
if (sk) {
|
||||
long timeout;
|
||||
|
||||
sock_rps_reset_flow(sk);
|
||||
|
||||
/* Applications forget to leave groups before exiting */
|
||||
ip_mc_drop_socket(sk);
|
||||
|
||||
|
|
@ -546,7 +548,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo)
|
|||
{
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
|
||||
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
/* Basic assumption: if someone sets sk->sk_err, he _must_
|
||||
* change state of the socket from TCP_SYN_*.
|
||||
|
|
@ -559,9 +561,9 @@ static long inet_wait_for_connect(struct sock *sk, long timeo)
|
|||
lock_sock(sk);
|
||||
if (signal_pending(current) || !timeo)
|
||||
break;
|
||||
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
|
||||
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
}
|
||||
finish_wait(sk->sk_sleep, &wait);
|
||||
finish_wait(sk_sleep(sk), &wait);
|
||||
return timeo;
|
||||
}
|
||||
|
||||
|
|
@ -720,6 +722,8 @@ int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
|||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
/* We may need to bind the socket. */
|
||||
if (!inet_sk(sk)->inet_num && inet_autobind(sk))
|
||||
return -EAGAIN;
|
||||
|
|
@ -728,12 +732,13 @@ int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
|||
}
|
||||
EXPORT_SYMBOL(inet_sendmsg);
|
||||
|
||||
|
||||
static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
|
||||
size_t size, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
/* We may need to bind the socket. */
|
||||
if (!inet_sk(sk)->inet_num && inet_autobind(sk))
|
||||
return -EAGAIN;
|
||||
|
|
@ -743,6 +748,22 @@ static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
|
|||
return sock_no_sendpage(sock, page, offset, size, flags);
|
||||
}
|
||||
|
||||
int inet_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
||||
size_t size, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
int addr_len = 0;
|
||||
int err;
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
err = sk->sk_prot->recvmsg(iocb, sk, msg, size, flags & MSG_DONTWAIT,
|
||||
flags & ~MSG_DONTWAIT, &addr_len);
|
||||
if (err >= 0)
|
||||
msg->msg_namelen = addr_len;
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(inet_recvmsg);
|
||||
|
||||
int inet_shutdown(struct socket *sock, int how)
|
||||
{
|
||||
|
|
@ -872,7 +893,7 @@ const struct proto_ops inet_stream_ops = {
|
|||
.setsockopt = sock_common_setsockopt,
|
||||
.getsockopt = sock_common_getsockopt,
|
||||
.sendmsg = tcp_sendmsg,
|
||||
.recvmsg = sock_common_recvmsg,
|
||||
.recvmsg = inet_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
.sendpage = tcp_sendpage,
|
||||
.splice_read = tcp_splice_read,
|
||||
|
|
@ -899,7 +920,7 @@ const struct proto_ops inet_dgram_ops = {
|
|||
.setsockopt = sock_common_setsockopt,
|
||||
.getsockopt = sock_common_getsockopt,
|
||||
.sendmsg = inet_sendmsg,
|
||||
.recvmsg = sock_common_recvmsg,
|
||||
.recvmsg = inet_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
.sendpage = inet_sendpage,
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
@ -929,7 +950,7 @@ static const struct proto_ops inet_sockraw_ops = {
|
|||
.setsockopt = sock_common_setsockopt,
|
||||
.getsockopt = sock_common_getsockopt,
|
||||
.sendmsg = inet_sendmsg,
|
||||
.recvmsg = sock_common_recvmsg,
|
||||
.recvmsg = inet_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
.sendpage = inet_sendpage,
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
@ -1302,8 +1323,8 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head,
|
|||
if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
|
||||
goto out_unlock;
|
||||
|
||||
id = ntohl(*(u32 *)&iph->id);
|
||||
flush = (u16)((ntohl(*(u32 *)iph) ^ skb_gro_len(skb)) | (id ^ IP_DF));
|
||||
id = ntohl(*(__be32 *)&iph->id);
|
||||
flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (id ^ IP_DF));
|
||||
id >>= 16;
|
||||
|
||||
for (p = *head; p; p = p->next) {
|
||||
|
|
@ -1316,8 +1337,8 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head,
|
|||
|
||||
if ((iph->protocol ^ iph2->protocol) |
|
||||
(iph->tos ^ iph2->tos) |
|
||||
(iph->saddr ^ iph2->saddr) |
|
||||
(iph->daddr ^ iph2->daddr)) {
|
||||
((__force u32)iph->saddr ^ (__force u32)iph2->saddr) |
|
||||
((__force u32)iph->daddr ^ (__force u32)iph2->daddr)) {
|
||||
NAPI_GRO_CB(p)->same_flow = 0;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1407,10 +1428,10 @@ EXPORT_SYMBOL_GPL(snmp_fold_field);
|
|||
int snmp_mib_init(void __percpu *ptr[2], size_t mibsize)
|
||||
{
|
||||
BUG_ON(ptr == NULL);
|
||||
ptr[0] = __alloc_percpu(mibsize, __alignof__(unsigned long long));
|
||||
ptr[0] = __alloc_percpu(mibsize, __alignof__(unsigned long));
|
||||
if (!ptr[0])
|
||||
goto err0;
|
||||
ptr[1] = __alloc_percpu(mibsize, __alignof__(unsigned long long));
|
||||
ptr[1] = __alloc_percpu(mibsize, __alignof__(unsigned long));
|
||||
if (!ptr[1])
|
||||
goto err1;
|
||||
return 0;
|
||||
|
|
@ -1552,9 +1573,13 @@ static int __init inet_init(void)
|
|||
|
||||
BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb));
|
||||
|
||||
sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL);
|
||||
if (!sysctl_local_reserved_ports)
|
||||
goto out;
|
||||
|
||||
rc = proto_register(&tcp_prot, 1);
|
||||
if (rc)
|
||||
goto out;
|
||||
goto out_free_reserved_ports;
|
||||
|
||||
rc = proto_register(&udp_prot, 1);
|
||||
if (rc)
|
||||
|
|
@ -1653,6 +1678,8 @@ out_unregister_udp_proto:
|
|||
proto_unregister(&udp_prot);
|
||||
out_unregister_tcp_proto:
|
||||
proto_unregister(&tcp_prot);
|
||||
out_free_reserved_ports:
|
||||
kfree(sysctl_local_reserved_ports);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -854,7 +854,7 @@ static int arp_process(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
if (arp->ar_op == htons(ARPOP_REQUEST) &&
|
||||
ip_route_input(skb, tip, sip, 0, dev) == 0) {
|
||||
ip_route_input_noref(skb, tip, sip, 0, dev) == 0) {
|
||||
|
||||
rt = skb_rtable(skb);
|
||||
addr_type = rt->rt_type;
|
||||
|
|
|
|||
|
|
@ -290,8 +290,6 @@ void cipso_v4_cache_invalidate(void)
|
|||
cipso_v4_cache[iter].size = 0;
|
||||
spin_unlock_bh(&cipso_v4_cache[iter].lock);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1096,10 +1096,10 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
|
|||
case NETDEV_DOWN:
|
||||
ip_mc_down(in_dev);
|
||||
break;
|
||||
case NETDEV_BONDING_OLDTYPE:
|
||||
case NETDEV_PRE_TYPE_CHANGE:
|
||||
ip_mc_unmap(in_dev);
|
||||
break;
|
||||
case NETDEV_BONDING_NEWTYPE:
|
||||
case NETDEV_POST_TYPE_CHANGE:
|
||||
ip_mc_remap(in_dev);
|
||||
break;
|
||||
case NETDEV_CHANGEMTU:
|
||||
|
|
|
|||
|
|
@ -213,7 +213,6 @@ static int fib4_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
|
|||
{
|
||||
struct fib4_rule *rule4 = (struct fib4_rule *) rule;
|
||||
|
||||
frh->family = AF_INET;
|
||||
frh->dst_len = rule4->dst_len;
|
||||
frh->src_len = rule4->src_len;
|
||||
frh->tos = rule4->tos;
|
||||
|
|
@ -234,23 +233,6 @@ nla_put_failure:
|
|||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
static u32 fib4_rule_default_pref(struct fib_rules_ops *ops)
|
||||
{
|
||||
struct list_head *pos;
|
||||
struct fib_rule *rule;
|
||||
|
||||
if (!list_empty(&ops->rules_list)) {
|
||||
pos = ops->rules_list.next;
|
||||
if (pos->next != &ops->rules_list) {
|
||||
rule = list_entry(pos->next, struct fib_rule, list);
|
||||
if (rule->pref)
|
||||
return rule->pref - 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t fib4_rule_nlmsg_payload(struct fib_rule *rule)
|
||||
{
|
||||
return nla_total_size(4) /* dst */
|
||||
|
|
@ -263,7 +245,7 @@ static void fib4_rule_flush_cache(struct fib_rules_ops *ops)
|
|||
rt_cache_flush(ops->fro_net, -1);
|
||||
}
|
||||
|
||||
static struct fib_rules_ops fib4_rules_ops_template = {
|
||||
static const struct fib_rules_ops __net_initdata fib4_rules_ops_template = {
|
||||
.family = AF_INET,
|
||||
.rule_size = sizeof(struct fib4_rule),
|
||||
.addr_size = sizeof(u32),
|
||||
|
|
@ -272,7 +254,7 @@ static struct fib_rules_ops fib4_rules_ops_template = {
|
|||
.configure = fib4_rule_configure,
|
||||
.compare = fib4_rule_compare,
|
||||
.fill = fib4_rule_fill,
|
||||
.default_pref = fib4_rule_default_pref,
|
||||
.default_pref = fib_default_rule_pref,
|
||||
.nlmsg_payload = fib4_rule_nlmsg_payload,
|
||||
.flush_cache = fib4_rule_flush_cache,
|
||||
.nlgroup = RTNLGRP_IPV4_RULE,
|
||||
|
|
|
|||
|
|
@ -1022,8 +1022,6 @@ static void trie_rebalance(struct trie *t, struct tnode *tn)
|
|||
|
||||
rcu_assign_pointer(t->trie, (struct node *)tn);
|
||||
tnode_free_flush();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* only used from updater-side */
|
||||
|
|
|
|||
|
|
@ -331,9 +331,10 @@ static void icmp_push_reply(struct icmp_bxm *icmp_param,
|
|||
if (ip_append_data(sk, icmp_glue_bits, icmp_param,
|
||||
icmp_param->data_len+icmp_param->head_len,
|
||||
icmp_param->head_len,
|
||||
ipc, rt, MSG_DONTWAIT) < 0)
|
||||
ipc, rt, MSG_DONTWAIT) < 0) {
|
||||
ICMP_INC_STATS_BH(sock_net(sk), ICMP_MIB_OUTERRORS);
|
||||
ip_flush_pending_frames(sk);
|
||||
else if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
|
||||
} else if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
|
||||
struct icmphdr *icmph = icmp_hdr(skb);
|
||||
__wsum csum = 0;
|
||||
struct sk_buff *skb1;
|
||||
|
|
@ -586,20 +587,20 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
|||
err = __ip_route_output_key(net, &rt2, &fl);
|
||||
else {
|
||||
struct flowi fl2 = {};
|
||||
struct dst_entry *odst;
|
||||
unsigned long orefdst;
|
||||
|
||||
fl2.fl4_dst = fl.fl4_src;
|
||||
if (ip_route_output_key(net, &rt2, &fl2))
|
||||
goto relookup_failed;
|
||||
|
||||
/* Ugh! */
|
||||
odst = skb_dst(skb_in);
|
||||
orefdst = skb_in->_skb_refdst; /* save old refdst */
|
||||
err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src,
|
||||
RT_TOS(tos), rt2->u.dst.dev);
|
||||
|
||||
dst_release(&rt2->u.dst);
|
||||
rt2 = skb_rtable(skb_in);
|
||||
skb_dst_set(skb_in, odst);
|
||||
skb_in->_skb_refdst = orefdst; /* restore old refdst */
|
||||
}
|
||||
|
||||
if (err)
|
||||
|
|
|
|||
|
|
@ -998,7 +998,7 @@ static void ip_mc_filter_add(struct in_device *in_dev, __be32 addr)
|
|||
--ANK
|
||||
*/
|
||||
if (arp_mc_map(addr, buf, dev, 0) == 0)
|
||||
dev_mc_add(dev, buf, dev->addr_len, 0);
|
||||
dev_mc_add(dev, buf);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1011,7 +1011,7 @@ static void ip_mc_filter_del(struct in_device *in_dev, __be32 addr)
|
|||
struct net_device *dev = in_dev->dev;
|
||||
|
||||
if (arp_mc_map(addr, buf, dev, 0) == 0)
|
||||
dev_mc_delete(dev, buf, dev->addr_len, 0);
|
||||
dev_mc_del(dev, buf);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IP_MULTICAST
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@ struct local_ports sysctl_local_ports __read_mostly = {
|
|||
.range = { 32768, 61000 },
|
||||
};
|
||||
|
||||
unsigned long *sysctl_local_reserved_ports;
|
||||
EXPORT_SYMBOL(sysctl_local_reserved_ports);
|
||||
|
||||
void inet_get_local_port_range(int *low, int *high)
|
||||
{
|
||||
unsigned seq;
|
||||
|
|
@ -108,6 +111,8 @@ again:
|
|||
|
||||
smallest_size = -1;
|
||||
do {
|
||||
if (inet_is_reserved_local_port(rover))
|
||||
goto next_nolock;
|
||||
head = &hashinfo->bhash[inet_bhashfn(net, rover,
|
||||
hashinfo->bhash_size)];
|
||||
spin_lock(&head->lock);
|
||||
|
|
@ -130,6 +135,7 @@ again:
|
|||
break;
|
||||
next:
|
||||
spin_unlock(&head->lock);
|
||||
next_nolock:
|
||||
if (++rover > high)
|
||||
rover = low;
|
||||
} while (--remaining > 0);
|
||||
|
|
@ -234,7 +240,7 @@ static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
|
|||
* having to remove and re-insert us on the wait queue.
|
||||
*/
|
||||
for (;;) {
|
||||
prepare_to_wait_exclusive(sk->sk_sleep, &wait,
|
||||
prepare_to_wait_exclusive(sk_sleep(sk), &wait,
|
||||
TASK_INTERRUPTIBLE);
|
||||
release_sock(sk);
|
||||
if (reqsk_queue_empty(&icsk->icsk_accept_queue))
|
||||
|
|
@ -253,7 +259,7 @@ static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
|
|||
if (!timeo)
|
||||
break;
|
||||
}
|
||||
finish_wait(sk->sk_sleep, &wait);
|
||||
finish_wait(sk_sleep(sk), &wait);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -456,6 +456,8 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
|||
local_bh_disable();
|
||||
for (i = 1; i <= remaining; i++) {
|
||||
port = low + (i + offset) % remaining;
|
||||
if (inet_is_reserved_local_port(port))
|
||||
continue;
|
||||
head = &hinfo->bhash[inet_bhashfn(net, port,
|
||||
hinfo->bhash_size)];
|
||||
spin_lock(&head->lock);
|
||||
|
|
|
|||
|
|
@ -112,8 +112,8 @@ int ip_forward(struct sk_buff *skb)
|
|||
|
||||
skb->priority = rt_tos2priority(iph->tos);
|
||||
|
||||
return NF_HOOK(PF_INET, NF_INET_FORWARD, skb, skb->dev, rt->u.dst.dev,
|
||||
ip_forward_finish);
|
||||
return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev,
|
||||
rt->u.dst.dev, ip_forward_finish);
|
||||
|
||||
sr_failed:
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -502,7 +502,6 @@ static void ipgre_err(struct sk_buff *skb, u32 info)
|
|||
t->err_time = jiffies;
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
|
||||
|
|
@ -538,7 +537,6 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||
struct ip_tunnel *tunnel;
|
||||
int offset = 4;
|
||||
__be16 gre_proto;
|
||||
unsigned int len;
|
||||
|
||||
if (!pskb_may_pull(skb, 16))
|
||||
goto drop_nolock;
|
||||
|
|
@ -629,8 +627,6 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||
tunnel->i_seqno = seqno + 1;
|
||||
}
|
||||
|
||||
len = skb->len;
|
||||
|
||||
/* Warning: All skb pointers will be invalidated! */
|
||||
if (tunnel->dev->type == ARPHRD_ETHER) {
|
||||
if (!pskb_may_pull(skb, ETH_HLEN)) {
|
||||
|
|
@ -644,11 +640,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += len;
|
||||
skb->dev = tunnel->dev;
|
||||
skb_dst_drop(skb);
|
||||
nf_reset(skb);
|
||||
skb_tunnel_rx(skb, tunnel->dev);
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
ipgre_ecn_decapsulate(iph, skb);
|
||||
|
|
|
|||
|
|
@ -266,7 +266,7 @@ int ip_local_deliver(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
return NF_HOOK(PF_INET, NF_INET_LOCAL_IN, skb, skb->dev, NULL,
|
||||
return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, skb, skb->dev, NULL,
|
||||
ip_local_deliver_finish);
|
||||
}
|
||||
|
||||
|
|
@ -331,8 +331,8 @@ static int ip_rcv_finish(struct sk_buff *skb)
|
|||
* how the packet travels inside Linux networking.
|
||||
*/
|
||||
if (skb_dst(skb) == NULL) {
|
||||
int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
|
||||
skb->dev);
|
||||
int err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
|
||||
iph->tos, skb->dev);
|
||||
if (unlikely(err)) {
|
||||
if (err == -EHOSTUNREACH)
|
||||
IP_INC_STATS_BH(dev_net(skb->dev),
|
||||
|
|
@ -444,7 +444,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
|
|||
/* Must drop socket now because of tproxy. */
|
||||
skb_orphan(skb);
|
||||
|
||||
return NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, dev, NULL,
|
||||
return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,
|
||||
ip_rcv_finish);
|
||||
|
||||
inhdr_error:
|
||||
|
|
|
|||
|
|
@ -238,7 +238,6 @@ void ip_options_fragment(struct sk_buff * skb)
|
|||
opt->rr_needaddr = 0;
|
||||
opt->ts_needaddr = 0;
|
||||
opt->ts_needtime = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -601,6 +600,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
|
|||
unsigned char *optptr = skb_network_header(skb) + opt->srr;
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
struct rtable *rt2;
|
||||
unsigned long orefdst;
|
||||
int err;
|
||||
|
||||
if (!opt->srr)
|
||||
|
|
@ -624,16 +624,16 @@ int ip_options_rcv_srr(struct sk_buff *skb)
|
|||
}
|
||||
memcpy(&nexthop, &optptr[srrptr-1], 4);
|
||||
|
||||
rt = skb_rtable(skb);
|
||||
orefdst = skb->_skb_refdst;
|
||||
skb_dst_set(skb, NULL);
|
||||
err = ip_route_input(skb, nexthop, iph->saddr, iph->tos, skb->dev);
|
||||
rt2 = skb_rtable(skb);
|
||||
if (err || (rt2->rt_type != RTN_UNICAST && rt2->rt_type != RTN_LOCAL)) {
|
||||
ip_rt_put(rt2);
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
skb_dst_drop(skb);
|
||||
skb->_skb_refdst = orefdst;
|
||||
return -EINVAL;
|
||||
}
|
||||
ip_rt_put(rt);
|
||||
refdst_drop(orefdst);
|
||||
if (rt2->rt_type != RTN_LOCAL)
|
||||
break;
|
||||
/* Superfast 8) loopback forward */
|
||||
|
|
|
|||
|
|
@ -96,8 +96,8 @@ int __ip_local_out(struct sk_buff *skb)
|
|||
|
||||
iph->tot_len = htons(skb->len);
|
||||
ip_send_check(iph);
|
||||
return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev,
|
||||
dst_output);
|
||||
return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL,
|
||||
skb_dst(skb)->dev, dst_output);
|
||||
}
|
||||
|
||||
int ip_local_out(struct sk_buff *skb)
|
||||
|
|
@ -272,8 +272,8 @@ int ip_mc_output(struct sk_buff *skb)
|
|||
) {
|
||||
struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (newskb)
|
||||
NF_HOOK(PF_INET, NF_INET_POST_ROUTING, newskb,
|
||||
NULL, newskb->dev,
|
||||
NF_HOOK(NFPROTO_IPV4, NF_INET_POST_ROUTING,
|
||||
newskb, NULL, newskb->dev,
|
||||
ip_dev_loopback_xmit);
|
||||
}
|
||||
|
||||
|
|
@ -288,12 +288,12 @@ int ip_mc_output(struct sk_buff *skb)
|
|||
if (rt->rt_flags&RTCF_BROADCAST) {
|
||||
struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (newskb)
|
||||
NF_HOOK(PF_INET, NF_INET_POST_ROUTING, newskb, NULL,
|
||||
newskb->dev, ip_dev_loopback_xmit);
|
||||
NF_HOOK(NFPROTO_IPV4, NF_INET_POST_ROUTING, newskb,
|
||||
NULL, newskb->dev, ip_dev_loopback_xmit);
|
||||
}
|
||||
|
||||
return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, NULL, skb->dev,
|
||||
ip_finish_output,
|
||||
return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb, NULL,
|
||||
skb->dev, ip_finish_output,
|
||||
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
||||
}
|
||||
|
||||
|
|
@ -306,22 +306,24 @@ int ip_output(struct sk_buff *skb)
|
|||
skb->dev = dev;
|
||||
skb->protocol = htons(ETH_P_IP);
|
||||
|
||||
return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, NULL, dev,
|
||||
return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb, NULL, dev,
|
||||
ip_finish_output,
|
||||
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
||||
}
|
||||
|
||||
int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
|
||||
int ip_queue_xmit(struct sk_buff *skb)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
struct ip_options *opt = inet->opt;
|
||||
struct rtable *rt;
|
||||
struct iphdr *iph;
|
||||
int res;
|
||||
|
||||
/* Skip all of this if the packet is already routed,
|
||||
* f.e. by something like SCTP.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
rt = skb_rtable(skb);
|
||||
if (rt != NULL)
|
||||
goto packet_routed;
|
||||
|
|
@ -359,7 +361,7 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
|
|||
}
|
||||
sk_setup_caps(sk, &rt->u.dst);
|
||||
}
|
||||
skb_dst_set(skb, dst_clone(&rt->u.dst));
|
||||
skb_dst_set_noref(skb, &rt->u.dst);
|
||||
|
||||
packet_routed:
|
||||
if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
|
||||
|
|
@ -370,7 +372,7 @@ packet_routed:
|
|||
skb_reset_network_header(skb);
|
||||
iph = ip_hdr(skb);
|
||||
*((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff));
|
||||
if (ip_dont_fragment(sk, &rt->u.dst) && !ipfragok)
|
||||
if (ip_dont_fragment(sk, &rt->u.dst) && !skb->local_df)
|
||||
iph->frag_off = htons(IP_DF);
|
||||
else
|
||||
iph->frag_off = 0;
|
||||
|
|
@ -391,9 +393,12 @@ packet_routed:
|
|||
skb->priority = sk->sk_priority;
|
||||
skb->mark = sk->sk_mark;
|
||||
|
||||
return ip_local_out(skb);
|
||||
res = ip_local_out(skb);
|
||||
rcu_read_unlock();
|
||||
return res;
|
||||
|
||||
no_route:
|
||||
rcu_read_unlock();
|
||||
IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
kfree_skb(skb);
|
||||
return -EHOSTUNREACH;
|
||||
|
|
@ -469,6 +474,10 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
|
|||
|
||||
hlen = iph->ihl * 4;
|
||||
mtu = dst_mtu(&rt->u.dst) - hlen; /* Size of data space */
|
||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||
if (skb->nf_bridge)
|
||||
mtu -= nf_bridge_mtu_reduction(skb);
|
||||
#endif
|
||||
IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE;
|
||||
|
||||
/* When frag_list is given, use it. First, check its validity:
|
||||
|
|
|
|||
|
|
@ -287,12 +287,8 @@ int ip_ra_control(struct sock *sk, unsigned char on,
|
|||
void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
|
||||
__be16 port, u32 info, u8 *payload)
|
||||
{
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
struct sock_exterr_skb *serr;
|
||||
|
||||
if (!inet->recverr)
|
||||
return;
|
||||
|
||||
skb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
return;
|
||||
|
|
@ -958,6 +954,22 @@ e_inval:
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ip_queue_rcv_skb - Queue an skb into sock receive queue
|
||||
* @sk: socket
|
||||
* @skb: buffer
|
||||
*
|
||||
* Queues an skb into socket receive queue. If IP_CMSG_PKTINFO option
|
||||
* is not set, we drop skb dst entry now, while dst cache line is hot.
|
||||
*/
|
||||
int ip_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
if (!(inet_sk(sk)->cmsg_flags & IP_CMSG_PKTINFO))
|
||||
skb_dst_drop(skb);
|
||||
return sock_queue_rcv_skb(sk, skb);
|
||||
}
|
||||
EXPORT_SYMBOL(ip_queue_rcv_skb);
|
||||
|
||||
int ip_setsockopt(struct sock *sk, int level,
|
||||
int optname, char __user *optval, unsigned int optlen)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -976,7 +976,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
|
|||
/* Is it a reply for the device we are configuring? */
|
||||
if (b->xid != ic_dev_xid) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_ERR "DHCP/BOOTP: Ignoring delayed packet \n");
|
||||
printk(KERN_ERR "DHCP/BOOTP: Ignoring delayed packet\n");
|
||||
goto drop_unlock;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -374,11 +374,8 @@ static int ipip_rcv(struct sk_buff *skb)
|
|||
skb->protocol = htons(ETH_P_IP);
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
||||
tunnel->dev->stats.rx_packets++;
|
||||
tunnel->dev->stats.rx_bytes += skb->len;
|
||||
skb->dev = tunnel->dev;
|
||||
skb_dst_drop(skb);
|
||||
nf_reset(skb);
|
||||
skb_tunnel_rx(skb, tunnel->dev);
|
||||
|
||||
ipip_ecn_decapsulate(iph, skb);
|
||||
netif_rx(skb);
|
||||
rcu_read_unlock();
|
||||
|
|
|
|||
925
net/ipv4/ipmr.c
925
net/ipv4/ipmr.c
File diff suppressed because it is too large
Load diff
|
|
@ -17,7 +17,7 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
|||
const struct iphdr *iph = ip_hdr(skb);
|
||||
struct rtable *rt;
|
||||
struct flowi fl = {};
|
||||
struct dst_entry *odst;
|
||||
unsigned long orefdst;
|
||||
unsigned int hh_len;
|
||||
unsigned int type;
|
||||
|
||||
|
|
@ -51,14 +51,14 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
|||
if (ip_route_output_key(net, &rt, &fl) != 0)
|
||||
return -1;
|
||||
|
||||
odst = skb_dst(skb);
|
||||
orefdst = skb->_skb_refdst;
|
||||
if (ip_route_input(skb, iph->daddr, iph->saddr,
|
||||
RT_TOS(iph->tos), rt->u.dst.dev) != 0) {
|
||||
dst_release(&rt->u.dst);
|
||||
return -1;
|
||||
}
|
||||
dst_release(&rt->u.dst);
|
||||
dst_release(odst);
|
||||
refdst_drop(orefdst);
|
||||
}
|
||||
|
||||
if (skb_dst(skb)->error)
|
||||
|
|
|
|||
|
|
@ -49,12 +49,7 @@ MODULE_DESCRIPTION("arptables core");
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_NETFILTER_DEBUG
|
||||
#define ARP_NF_ASSERT(x) \
|
||||
do { \
|
||||
if (!(x)) \
|
||||
printk("ARP_NF_ASSERT: %s:%s:%u\n", \
|
||||
__func__, __FILE__, __LINE__); \
|
||||
} while(0)
|
||||
#define ARP_NF_ASSERT(x) WARN_ON(!(x))
|
||||
#else
|
||||
#define ARP_NF_ASSERT(x)
|
||||
#endif
|
||||
|
|
@ -224,10 +219,10 @@ static inline int arp_checkentry(const struct arpt_arp *arp)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
arpt_error(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
arpt_error(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
if (net_ratelimit())
|
||||
printk("arp_tables: error: '%s'\n",
|
||||
pr_err("arp_tables: error: '%s'\n",
|
||||
(const char *)par->targinfo);
|
||||
|
||||
return NF_DROP;
|
||||
|
|
@ -260,12 +255,11 @@ unsigned int arpt_do_table(struct sk_buff *skb,
|
|||
static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long))));
|
||||
unsigned int verdict = NF_DROP;
|
||||
const struct arphdr *arp;
|
||||
bool hotdrop = false;
|
||||
struct arpt_entry *e, *back;
|
||||
const char *indev, *outdev;
|
||||
void *table_base;
|
||||
const struct xt_table_info *private;
|
||||
struct xt_target_param tgpar;
|
||||
struct xt_action_param acpar;
|
||||
|
||||
if (!pskb_may_pull(skb, arp_hdr_len(skb->dev)))
|
||||
return NF_DROP;
|
||||
|
|
@ -280,10 +274,11 @@ unsigned int arpt_do_table(struct sk_buff *skb,
|
|||
e = get_entry(table_base, private->hook_entry[hook]);
|
||||
back = get_entry(table_base, private->underflow[hook]);
|
||||
|
||||
tgpar.in = in;
|
||||
tgpar.out = out;
|
||||
tgpar.hooknum = hook;
|
||||
tgpar.family = NFPROTO_ARP;
|
||||
acpar.in = in;
|
||||
acpar.out = out;
|
||||
acpar.hooknum = hook;
|
||||
acpar.family = NFPROTO_ARP;
|
||||
acpar.hotdrop = false;
|
||||
|
||||
arp = arp_hdr(skb);
|
||||
do {
|
||||
|
|
@ -333,9 +328,9 @@ unsigned int arpt_do_table(struct sk_buff *skb,
|
|||
/* Targets which reenter must return
|
||||
* abs. verdicts
|
||||
*/
|
||||
tgpar.target = t->u.kernel.target;
|
||||
tgpar.targinfo = t->data;
|
||||
verdict = t->u.kernel.target->target(skb, &tgpar);
|
||||
acpar.target = t->u.kernel.target;
|
||||
acpar.targinfo = t->data;
|
||||
verdict = t->u.kernel.target->target(skb, &acpar);
|
||||
|
||||
/* Target might have changed stuff. */
|
||||
arp = arp_hdr(skb);
|
||||
|
|
@ -345,10 +340,10 @@ unsigned int arpt_do_table(struct sk_buff *skb,
|
|||
else
|
||||
/* Verdict */
|
||||
break;
|
||||
} while (!hotdrop);
|
||||
} while (!acpar.hotdrop);
|
||||
xt_info_rdunlock_bh();
|
||||
|
||||
if (hotdrop)
|
||||
if (acpar.hotdrop)
|
||||
return NF_DROP;
|
||||
else
|
||||
return verdict;
|
||||
|
|
@ -390,7 +385,7 @@ static int mark_source_chains(const struct xt_table_info *newinfo,
|
|||
int visited = e->comefrom & (1 << hook);
|
||||
|
||||
if (e->comefrom & (1 << NF_ARP_NUMHOOKS)) {
|
||||
printk("arptables: loop hook %u pos %u %08X.\n",
|
||||
pr_notice("arptables: loop hook %u pos %u %08X.\n",
|
||||
hook, pos, e->comefrom);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -523,13 +518,11 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size)
|
|||
return ret;
|
||||
|
||||
t = arpt_get_target(e);
|
||||
target = try_then_request_module(xt_find_target(NFPROTO_ARP,
|
||||
t->u.user.name,
|
||||
t->u.user.revision),
|
||||
"arpt_%s", t->u.user.name);
|
||||
if (IS_ERR(target) || !target) {
|
||||
target = xt_request_find_target(NFPROTO_ARP, t->u.user.name,
|
||||
t->u.user.revision);
|
||||
if (IS_ERR(target)) {
|
||||
duprintf("find_check_entry: `%s' not found\n", t->u.user.name);
|
||||
ret = target ? PTR_ERR(target) : -ENOENT;
|
||||
ret = PTR_ERR(target);
|
||||
goto out;
|
||||
}
|
||||
t->u.kernel.target = target;
|
||||
|
|
@ -651,6 +644,9 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
|
|||
if (ret != 0)
|
||||
break;
|
||||
++i;
|
||||
if (strcmp(arpt_get_target(iter)->u.user.name,
|
||||
XT_ERROR_TARGET) == 0)
|
||||
++newinfo->stacksize;
|
||||
}
|
||||
duprintf("translate_table: ARPT_ENTRY_ITERATE gives %d\n", ret);
|
||||
if (ret != 0)
|
||||
|
|
@ -1252,14 +1248,12 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e,
|
|||
entry_offset = (void *)e - (void *)base;
|
||||
|
||||
t = compat_arpt_get_target(e);
|
||||
target = try_then_request_module(xt_find_target(NFPROTO_ARP,
|
||||
t->u.user.name,
|
||||
t->u.user.revision),
|
||||
"arpt_%s", t->u.user.name);
|
||||
if (IS_ERR(target) || !target) {
|
||||
target = xt_request_find_target(NFPROTO_ARP, t->u.user.name,
|
||||
t->u.user.revision);
|
||||
if (IS_ERR(target)) {
|
||||
duprintf("check_compat_entry_size_and_hooks: `%s' not found\n",
|
||||
t->u.user.name);
|
||||
ret = target ? PTR_ERR(target) : -ENOENT;
|
||||
ret = PTR_ERR(target);
|
||||
goto out;
|
||||
}
|
||||
t->u.kernel.target = target;
|
||||
|
|
@ -1778,8 +1772,7 @@ struct xt_table *arpt_register_table(struct net *net,
|
|||
{
|
||||
int ret;
|
||||
struct xt_table_info *newinfo;
|
||||
struct xt_table_info bootstrap
|
||||
= { 0, 0, 0, { 0 }, { 0 }, { } };
|
||||
struct xt_table_info bootstrap = {0};
|
||||
void *loc_cpu_entry;
|
||||
struct xt_table *new_table;
|
||||
|
||||
|
|
@ -1830,22 +1823,23 @@ void arpt_unregister_table(struct xt_table *table)
|
|||
}
|
||||
|
||||
/* The built-in targets: standard (NULL) and error. */
|
||||
static struct xt_target arpt_standard_target __read_mostly = {
|
||||
.name = ARPT_STANDARD_TARGET,
|
||||
.targetsize = sizeof(int),
|
||||
.family = NFPROTO_ARP,
|
||||
static struct xt_target arpt_builtin_tg[] __read_mostly = {
|
||||
{
|
||||
.name = ARPT_STANDARD_TARGET,
|
||||
.targetsize = sizeof(int),
|
||||
.family = NFPROTO_ARP,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compatsize = sizeof(compat_int_t),
|
||||
.compat_from_user = compat_standard_from_user,
|
||||
.compat_to_user = compat_standard_to_user,
|
||||
.compatsize = sizeof(compat_int_t),
|
||||
.compat_from_user = compat_standard_from_user,
|
||||
.compat_to_user = compat_standard_to_user,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct xt_target arpt_error_target __read_mostly = {
|
||||
.name = ARPT_ERROR_TARGET,
|
||||
.target = arpt_error,
|
||||
.targetsize = ARPT_FUNCTION_MAXNAMELEN,
|
||||
.family = NFPROTO_ARP,
|
||||
},
|
||||
{
|
||||
.name = ARPT_ERROR_TARGET,
|
||||
.target = arpt_error,
|
||||
.targetsize = ARPT_FUNCTION_MAXNAMELEN,
|
||||
.family = NFPROTO_ARP,
|
||||
},
|
||||
};
|
||||
|
||||
static struct nf_sockopt_ops arpt_sockopts = {
|
||||
|
|
@ -1889,12 +1883,9 @@ static int __init arp_tables_init(void)
|
|||
goto err1;
|
||||
|
||||
/* Noone else will be downing sem now, so we won't sleep */
|
||||
ret = xt_register_target(&arpt_standard_target);
|
||||
ret = xt_register_targets(arpt_builtin_tg, ARRAY_SIZE(arpt_builtin_tg));
|
||||
if (ret < 0)
|
||||
goto err2;
|
||||
ret = xt_register_target(&arpt_error_target);
|
||||
if (ret < 0)
|
||||
goto err3;
|
||||
|
||||
/* Register setsockopt */
|
||||
ret = nf_register_sockopt(&arpt_sockopts);
|
||||
|
|
@ -1905,9 +1896,7 @@ static int __init arp_tables_init(void)
|
|||
return 0;
|
||||
|
||||
err4:
|
||||
xt_unregister_target(&arpt_error_target);
|
||||
err3:
|
||||
xt_unregister_target(&arpt_standard_target);
|
||||
xt_unregister_targets(arpt_builtin_tg, ARRAY_SIZE(arpt_builtin_tg));
|
||||
err2:
|
||||
unregister_pernet_subsys(&arp_tables_net_ops);
|
||||
err1:
|
||||
|
|
@ -1917,8 +1906,7 @@ err1:
|
|||
static void __exit arp_tables_fini(void)
|
||||
{
|
||||
nf_unregister_sockopt(&arpt_sockopts);
|
||||
xt_unregister_target(&arpt_error_target);
|
||||
xt_unregister_target(&arpt_standard_target);
|
||||
xt_unregister_targets(arpt_builtin_tg, ARRAY_SIZE(arpt_builtin_tg));
|
||||
unregister_pernet_subsys(&arp_tables_net_ops);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ MODULE_AUTHOR("Bart De Schuymer <[email protected]>");
|
|||
MODULE_DESCRIPTION("arptables arp payload mangle target");
|
||||
|
||||
static unsigned int
|
||||
target(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
target(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct arpt_mangle *mangle = par->targinfo;
|
||||
const struct arphdr *arp;
|
||||
|
|
@ -54,7 +54,7 @@ target(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
return mangle->target;
|
||||
}
|
||||
|
||||
static bool checkentry(const struct xt_tgchk_param *par)
|
||||
static int checkentry(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct arpt_mangle *mangle = par->targinfo;
|
||||
|
||||
|
|
|
|||
|
|
@ -161,8 +161,7 @@ ipq_build_packet_message(struct nf_queue_entry *entry, int *errp)
|
|||
break;
|
||||
|
||||
case IPQ_COPY_PACKET:
|
||||
if ((entry->skb->ip_summed == CHECKSUM_PARTIAL ||
|
||||
entry->skb->ip_summed == CHECKSUM_COMPLETE) &&
|
||||
if (entry->skb->ip_summed == CHECKSUM_PARTIAL &&
|
||||
(*errp = skb_checksum_help(entry->skb))) {
|
||||
read_unlock_bh(&queue_lock);
|
||||
return NULL;
|
||||
|
|
@ -462,7 +461,6 @@ __ipq_rcv_skb(struct sk_buff *skb)
|
|||
|
||||
if (flags & NLM_F_ACK)
|
||||
netlink_ack(skb, nlh, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -39,24 +39,19 @@ MODULE_DESCRIPTION("IPv4 packet filter");
|
|||
/*#define DEBUG_IP_FIREWALL_USER*/
|
||||
|
||||
#ifdef DEBUG_IP_FIREWALL
|
||||
#define dprintf(format, args...) printk(format , ## args)
|
||||
#define dprintf(format, args...) pr_info(format , ## args)
|
||||
#else
|
||||
#define dprintf(format, args...)
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_IP_FIREWALL_USER
|
||||
#define duprintf(format, args...) printk(format , ## args)
|
||||
#define duprintf(format, args...) pr_info(format , ## args)
|
||||
#else
|
||||
#define duprintf(format, args...)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NETFILTER_DEBUG
|
||||
#define IP_NF_ASSERT(x) \
|
||||
do { \
|
||||
if (!(x)) \
|
||||
printk("IP_NF_ASSERT: %s:%s:%u\n", \
|
||||
__func__, __FILE__, __LINE__); \
|
||||
} while(0)
|
||||
#define IP_NF_ASSERT(x) WARN_ON(!(x))
|
||||
#else
|
||||
#define IP_NF_ASSERT(x)
|
||||
#endif
|
||||
|
|
@ -165,30 +160,14 @@ ip_checkentry(const struct ipt_ip *ip)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
ipt_error(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
ipt_error(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
if (net_ratelimit())
|
||||
printk("ip_tables: error: `%s'\n",
|
||||
(const char *)par->targinfo);
|
||||
pr_info("error: `%s'\n", (const char *)par->targinfo);
|
||||
|
||||
return NF_DROP;
|
||||
}
|
||||
|
||||
/* Performance critical - called for every packet */
|
||||
static inline bool
|
||||
do_match(const struct ipt_entry_match *m, const struct sk_buff *skb,
|
||||
struct xt_match_param *par)
|
||||
{
|
||||
par->match = m->u.kernel.match;
|
||||
par->matchinfo = m->data;
|
||||
|
||||
/* Stop iteration if it doesn't match */
|
||||
if (!m->u.kernel.match->match(skb, par))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Performance critical */
|
||||
static inline struct ipt_entry *
|
||||
get_entry(const void *base, unsigned int offset)
|
||||
|
|
@ -322,19 +301,16 @@ ipt_do_table(struct sk_buff *skb,
|
|||
const struct net_device *out,
|
||||
struct xt_table *table)
|
||||
{
|
||||
#define tb_comefrom ((struct ipt_entry *)table_base)->comefrom
|
||||
|
||||
static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long))));
|
||||
const struct iphdr *ip;
|
||||
bool hotdrop = false;
|
||||
/* Initializing verdict to NF_DROP keeps gcc happy. */
|
||||
unsigned int verdict = NF_DROP;
|
||||
const char *indev, *outdev;
|
||||
const void *table_base;
|
||||
struct ipt_entry *e, *back;
|
||||
struct ipt_entry *e, **jumpstack;
|
||||
unsigned int *stackptr, origptr, cpu;
|
||||
const struct xt_table_info *private;
|
||||
struct xt_match_param mtpar;
|
||||
struct xt_target_param tgpar;
|
||||
struct xt_action_param acpar;
|
||||
|
||||
/* Initialization */
|
||||
ip = ip_hdr(skb);
|
||||
|
|
@ -346,40 +322,47 @@ ipt_do_table(struct sk_buff *skb,
|
|||
* things we don't know, ie. tcp syn flag or ports). If the
|
||||
* rule is also a fragment-specific rule, non-fragments won't
|
||||
* match it. */
|
||||
mtpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
|
||||
mtpar.thoff = ip_hdrlen(skb);
|
||||
mtpar.hotdrop = &hotdrop;
|
||||
mtpar.in = tgpar.in = in;
|
||||
mtpar.out = tgpar.out = out;
|
||||
mtpar.family = tgpar.family = NFPROTO_IPV4;
|
||||
mtpar.hooknum = tgpar.hooknum = hook;
|
||||
acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
|
||||
acpar.thoff = ip_hdrlen(skb);
|
||||
acpar.hotdrop = false;
|
||||
acpar.in = in;
|
||||
acpar.out = out;
|
||||
acpar.family = NFPROTO_IPV4;
|
||||
acpar.hooknum = hook;
|
||||
|
||||
IP_NF_ASSERT(table->valid_hooks & (1 << hook));
|
||||
xt_info_rdlock_bh();
|
||||
private = table->private;
|
||||
table_base = private->entries[smp_processor_id()];
|
||||
cpu = smp_processor_id();
|
||||
table_base = private->entries[cpu];
|
||||
jumpstack = (struct ipt_entry **)private->jumpstack[cpu];
|
||||
stackptr = &private->stackptr[cpu];
|
||||
origptr = *stackptr;
|
||||
|
||||
e = get_entry(table_base, private->hook_entry[hook]);
|
||||
|
||||
/* For return from builtin chain */
|
||||
back = get_entry(table_base, private->underflow[hook]);
|
||||
pr_debug("Entering %s(hook %u); sp at %u (UF %p)\n",
|
||||
table->name, hook, origptr,
|
||||
get_entry(table_base, private->underflow[hook]));
|
||||
|
||||
do {
|
||||
const struct ipt_entry_target *t;
|
||||
const struct xt_entry_match *ematch;
|
||||
|
||||
IP_NF_ASSERT(e);
|
||||
IP_NF_ASSERT(back);
|
||||
if (!ip_packet_match(ip, indev, outdev,
|
||||
&e->ip, mtpar.fragoff)) {
|
||||
&e->ip, acpar.fragoff)) {
|
||||
no_match:
|
||||
e = ipt_next_entry(e);
|
||||
continue;
|
||||
}
|
||||
|
||||
xt_ematch_foreach(ematch, e)
|
||||
if (do_match(ematch, skb, &mtpar) != 0)
|
||||
xt_ematch_foreach(ematch, e) {
|
||||
acpar.match = ematch->u.kernel.match;
|
||||
acpar.matchinfo = ematch->data;
|
||||
if (!acpar.match->match(skb, &acpar))
|
||||
goto no_match;
|
||||
}
|
||||
|
||||
ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1);
|
||||
|
||||
|
|
@ -404,41 +387,38 @@ ipt_do_table(struct sk_buff *skb,
|
|||
verdict = (unsigned)(-v) - 1;
|
||||
break;
|
||||
}
|
||||
e = back;
|
||||
back = get_entry(table_base, back->comefrom);
|
||||
if (*stackptr == 0) {
|
||||
e = get_entry(table_base,
|
||||
private->underflow[hook]);
|
||||
pr_debug("Underflow (this is normal) "
|
||||
"to %p\n", e);
|
||||
} else {
|
||||
e = jumpstack[--*stackptr];
|
||||
pr_debug("Pulled %p out from pos %u\n",
|
||||
e, *stackptr);
|
||||
e = ipt_next_entry(e);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (table_base + v != ipt_next_entry(e) &&
|
||||
!(e->ip.flags & IPT_F_GOTO)) {
|
||||
/* Save old back ptr in next entry */
|
||||
struct ipt_entry *next = ipt_next_entry(e);
|
||||
next->comefrom = (void *)back - table_base;
|
||||
/* set back pointer to next entry */
|
||||
back = next;
|
||||
if (*stackptr >= private->stacksize) {
|
||||
verdict = NF_DROP;
|
||||
break;
|
||||
}
|
||||
jumpstack[(*stackptr)++] = e;
|
||||
pr_debug("Pushed %p into pos %u\n",
|
||||
e, *stackptr - 1);
|
||||
}
|
||||
|
||||
e = get_entry(table_base, v);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Targets which reenter must return
|
||||
abs. verdicts */
|
||||
tgpar.target = t->u.kernel.target;
|
||||
tgpar.targinfo = t->data;
|
||||
acpar.target = t->u.kernel.target;
|
||||
acpar.targinfo = t->data;
|
||||
|
||||
|
||||
#ifdef CONFIG_NETFILTER_DEBUG
|
||||
tb_comefrom = 0xeeeeeeec;
|
||||
#endif
|
||||
verdict = t->u.kernel.target->target(skb, &tgpar);
|
||||
#ifdef CONFIG_NETFILTER_DEBUG
|
||||
if (tb_comefrom != 0xeeeeeeec && verdict == IPT_CONTINUE) {
|
||||
printk("Target %s reentered!\n",
|
||||
t->u.kernel.target->name);
|
||||
verdict = NF_DROP;
|
||||
}
|
||||
tb_comefrom = 0x57acc001;
|
||||
#endif
|
||||
verdict = t->u.kernel.target->target(skb, &acpar);
|
||||
/* Target might have changed stuff. */
|
||||
ip = ip_hdr(skb);
|
||||
if (verdict == IPT_CONTINUE)
|
||||
|
|
@ -446,18 +426,18 @@ ipt_do_table(struct sk_buff *skb,
|
|||
else
|
||||
/* Verdict */
|
||||
break;
|
||||
} while (!hotdrop);
|
||||
} while (!acpar.hotdrop);
|
||||
xt_info_rdunlock_bh();
|
||||
|
||||
pr_debug("Exiting %s; resetting sp from %u to %u\n",
|
||||
__func__, *stackptr, origptr);
|
||||
*stackptr = origptr;
|
||||
#ifdef DEBUG_ALLOW_ALL
|
||||
return NF_ACCEPT;
|
||||
#else
|
||||
if (hotdrop)
|
||||
if (acpar.hotdrop)
|
||||
return NF_DROP;
|
||||
else return verdict;
|
||||
#endif
|
||||
|
||||
#undef tb_comefrom
|
||||
}
|
||||
|
||||
/* Figures out from what hook each rule can be called: returns 0 if
|
||||
|
|
@ -486,7 +466,7 @@ mark_source_chains(const struct xt_table_info *newinfo,
|
|||
int visited = e->comefrom & (1 << hook);
|
||||
|
||||
if (e->comefrom & (1 << NF_INET_NUMHOOKS)) {
|
||||
printk("iptables: loop hook %u pos %u %08X.\n",
|
||||
pr_err("iptables: loop hook %u pos %u %08X.\n",
|
||||
hook, pos, e->comefrom);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -591,7 +571,7 @@ check_entry(const struct ipt_entry *e, const char *name)
|
|||
const struct ipt_entry_target *t;
|
||||
|
||||
if (!ip_checkentry(&e->ip)) {
|
||||
duprintf("ip_tables: ip check failed %p %s.\n", e, name);
|
||||
duprintf("ip check failed %p %s.\n", e, par->match->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -618,8 +598,7 @@ check_match(struct ipt_entry_match *m, struct xt_mtchk_param *par)
|
|||
ret = xt_check_match(par, m->u.match_size - sizeof(*m),
|
||||
ip->proto, ip->invflags & IPT_INV_PROTO);
|
||||
if (ret < 0) {
|
||||
duprintf("ip_tables: check failed for `%s'.\n",
|
||||
par.match->name);
|
||||
duprintf("check failed for `%s'.\n", par->match->name);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -631,12 +610,11 @@ find_check_match(struct ipt_entry_match *m, struct xt_mtchk_param *par)
|
|||
struct xt_match *match;
|
||||
int ret;
|
||||
|
||||
match = try_then_request_module(xt_find_match(AF_INET, m->u.user.name,
|
||||
m->u.user.revision),
|
||||
"ipt_%s", m->u.user.name);
|
||||
if (IS_ERR(match) || !match) {
|
||||
match = xt_request_find_match(NFPROTO_IPV4, m->u.user.name,
|
||||
m->u.user.revision);
|
||||
if (IS_ERR(match)) {
|
||||
duprintf("find_check_match: `%s' not found\n", m->u.user.name);
|
||||
return match ? PTR_ERR(match) : -ENOENT;
|
||||
return PTR_ERR(match);
|
||||
}
|
||||
m->u.kernel.match = match;
|
||||
|
||||
|
|
@ -667,7 +645,7 @@ static int check_target(struct ipt_entry *e, struct net *net, const char *name)
|
|||
ret = xt_check_target(&par, t->u.target_size - sizeof(*t),
|
||||
e->ip.proto, e->ip.invflags & IPT_INV_PROTO);
|
||||
if (ret < 0) {
|
||||
duprintf("ip_tables: check failed for `%s'.\n",
|
||||
duprintf("check failed for `%s'.\n",
|
||||
t->u.kernel.target->name);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -703,13 +681,11 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name,
|
|||
}
|
||||
|
||||
t = ipt_get_target(e);
|
||||
target = try_then_request_module(xt_find_target(AF_INET,
|
||||
t->u.user.name,
|
||||
t->u.user.revision),
|
||||
"ipt_%s", t->u.user.name);
|
||||
if (IS_ERR(target) || !target) {
|
||||
target = xt_request_find_target(NFPROTO_IPV4, t->u.user.name,
|
||||
t->u.user.revision);
|
||||
if (IS_ERR(target)) {
|
||||
duprintf("find_check_entry: `%s' not found\n", t->u.user.name);
|
||||
ret = target ? PTR_ERR(target) : -ENOENT;
|
||||
ret = PTR_ERR(target);
|
||||
goto cleanup_matches;
|
||||
}
|
||||
t->u.kernel.target = target;
|
||||
|
|
@ -843,6 +819,9 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
|
|||
if (ret != 0)
|
||||
return ret;
|
||||
++i;
|
||||
if (strcmp(ipt_get_target(iter)->u.user.name,
|
||||
XT_ERROR_TARGET) == 0)
|
||||
++newinfo->stacksize;
|
||||
}
|
||||
|
||||
if (i != repl->num_entries) {
|
||||
|
|
@ -1311,7 +1290,7 @@ do_replace(struct net *net, const void __user *user, unsigned int len)
|
|||
if (ret != 0)
|
||||
goto free_newinfo;
|
||||
|
||||
duprintf("ip_tables: Translated table\n");
|
||||
duprintf("Translated table\n");
|
||||
|
||||
ret = __do_replace(net, tmp.name, tmp.valid_hooks, newinfo,
|
||||
tmp.num_counters, tmp.counters);
|
||||
|
|
@ -1476,13 +1455,12 @@ compat_find_calc_match(struct ipt_entry_match *m,
|
|||
{
|
||||
struct xt_match *match;
|
||||
|
||||
match = try_then_request_module(xt_find_match(AF_INET, m->u.user.name,
|
||||
m->u.user.revision),
|
||||
"ipt_%s", m->u.user.name);
|
||||
if (IS_ERR(match) || !match) {
|
||||
match = xt_request_find_match(NFPROTO_IPV4, m->u.user.name,
|
||||
m->u.user.revision);
|
||||
if (IS_ERR(match)) {
|
||||
duprintf("compat_check_calc_match: `%s' not found\n",
|
||||
m->u.user.name);
|
||||
return match ? PTR_ERR(match) : -ENOENT;
|
||||
return PTR_ERR(match);
|
||||
}
|
||||
m->u.kernel.match = match;
|
||||
*size += xt_compat_match_offset(match);
|
||||
|
|
@ -1549,14 +1527,12 @@ check_compat_entry_size_and_hooks(struct compat_ipt_entry *e,
|
|||
}
|
||||
|
||||
t = compat_ipt_get_target(e);
|
||||
target = try_then_request_module(xt_find_target(AF_INET,
|
||||
t->u.user.name,
|
||||
t->u.user.revision),
|
||||
"ipt_%s", t->u.user.name);
|
||||
if (IS_ERR(target) || !target) {
|
||||
target = xt_request_find_target(NFPROTO_IPV4, t->u.user.name,
|
||||
t->u.user.revision);
|
||||
if (IS_ERR(target)) {
|
||||
duprintf("check_compat_entry_size_and_hooks: `%s' not found\n",
|
||||
t->u.user.name);
|
||||
ret = target ? PTR_ERR(target) : -ENOENT;
|
||||
ret = PTR_ERR(target);
|
||||
goto release_matches;
|
||||
}
|
||||
t->u.kernel.target = target;
|
||||
|
|
@ -2094,8 +2070,7 @@ struct xt_table *ipt_register_table(struct net *net,
|
|||
{
|
||||
int ret;
|
||||
struct xt_table_info *newinfo;
|
||||
struct xt_table_info bootstrap
|
||||
= { 0, 0, 0, { 0 }, { 0 }, { } };
|
||||
struct xt_table_info bootstrap = {0};
|
||||
void *loc_cpu_entry;
|
||||
struct xt_table *new_table;
|
||||
|
||||
|
|
@ -2157,7 +2132,7 @@ icmp_type_code_match(u_int8_t test_type, u_int8_t min_code, u_int8_t max_code,
|
|||
}
|
||||
|
||||
static bool
|
||||
icmp_match(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
icmp_match(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
const struct icmphdr *ic;
|
||||
struct icmphdr _icmph;
|
||||
|
|
@ -2173,7 +2148,7 @@ icmp_match(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
* can't. Hence, no choice but to drop.
|
||||
*/
|
||||
duprintf("Dropping evil ICMP tinygram.\n");
|
||||
*par->hotdrop = true;
|
||||
par->hotdrop = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -2184,31 +2159,31 @@ icmp_match(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
!!(icmpinfo->invflags&IPT_ICMP_INV));
|
||||
}
|
||||
|
||||
static bool icmp_checkentry(const struct xt_mtchk_param *par)
|
||||
static int icmp_checkentry(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ipt_icmp *icmpinfo = par->matchinfo;
|
||||
|
||||
/* Must specify no unknown invflags */
|
||||
return !(icmpinfo->invflags & ~IPT_ICMP_INV);
|
||||
return (icmpinfo->invflags & ~IPT_ICMP_INV) ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
/* The built-in targets: standard (NULL) and error. */
|
||||
static struct xt_target ipt_standard_target __read_mostly = {
|
||||
.name = IPT_STANDARD_TARGET,
|
||||
.targetsize = sizeof(int),
|
||||
.family = NFPROTO_IPV4,
|
||||
static struct xt_target ipt_builtin_tg[] __read_mostly = {
|
||||
{
|
||||
.name = IPT_STANDARD_TARGET,
|
||||
.targetsize = sizeof(int),
|
||||
.family = NFPROTO_IPV4,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compatsize = sizeof(compat_int_t),
|
||||
.compat_from_user = compat_standard_from_user,
|
||||
.compat_to_user = compat_standard_to_user,
|
||||
.compatsize = sizeof(compat_int_t),
|
||||
.compat_from_user = compat_standard_from_user,
|
||||
.compat_to_user = compat_standard_to_user,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct xt_target ipt_error_target __read_mostly = {
|
||||
.name = IPT_ERROR_TARGET,
|
||||
.target = ipt_error,
|
||||
.targetsize = IPT_FUNCTION_MAXNAMELEN,
|
||||
.family = NFPROTO_IPV4,
|
||||
},
|
||||
{
|
||||
.name = IPT_ERROR_TARGET,
|
||||
.target = ipt_error,
|
||||
.targetsize = IPT_FUNCTION_MAXNAMELEN,
|
||||
.family = NFPROTO_IPV4,
|
||||
},
|
||||
};
|
||||
|
||||
static struct nf_sockopt_ops ipt_sockopts = {
|
||||
|
|
@ -2228,13 +2203,15 @@ static struct nf_sockopt_ops ipt_sockopts = {
|
|||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static struct xt_match icmp_matchstruct __read_mostly = {
|
||||
.name = "icmp",
|
||||
.match = icmp_match,
|
||||
.matchsize = sizeof(struct ipt_icmp),
|
||||
.checkentry = icmp_checkentry,
|
||||
.proto = IPPROTO_ICMP,
|
||||
.family = NFPROTO_IPV4,
|
||||
static struct xt_match ipt_builtin_mt[] __read_mostly = {
|
||||
{
|
||||
.name = "icmp",
|
||||
.match = icmp_match,
|
||||
.matchsize = sizeof(struct ipt_icmp),
|
||||
.checkentry = icmp_checkentry,
|
||||
.proto = IPPROTO_ICMP,
|
||||
.family = NFPROTO_IPV4,
|
||||
},
|
||||
};
|
||||
|
||||
static int __net_init ip_tables_net_init(struct net *net)
|
||||
|
|
@ -2261,13 +2238,10 @@ static int __init ip_tables_init(void)
|
|||
goto err1;
|
||||
|
||||
/* Noone else will be downing sem now, so we won't sleep */
|
||||
ret = xt_register_target(&ipt_standard_target);
|
||||
ret = xt_register_targets(ipt_builtin_tg, ARRAY_SIZE(ipt_builtin_tg));
|
||||
if (ret < 0)
|
||||
goto err2;
|
||||
ret = xt_register_target(&ipt_error_target);
|
||||
if (ret < 0)
|
||||
goto err3;
|
||||
ret = xt_register_match(&icmp_matchstruct);
|
||||
ret = xt_register_matches(ipt_builtin_mt, ARRAY_SIZE(ipt_builtin_mt));
|
||||
if (ret < 0)
|
||||
goto err4;
|
||||
|
||||
|
|
@ -2276,15 +2250,13 @@ static int __init ip_tables_init(void)
|
|||
if (ret < 0)
|
||||
goto err5;
|
||||
|
||||
printk(KERN_INFO "ip_tables: (C) 2000-2006 Netfilter Core Team\n");
|
||||
pr_info("(C) 2000-2006 Netfilter Core Team\n");
|
||||
return 0;
|
||||
|
||||
err5:
|
||||
xt_unregister_match(&icmp_matchstruct);
|
||||
xt_unregister_matches(ipt_builtin_mt, ARRAY_SIZE(ipt_builtin_mt));
|
||||
err4:
|
||||
xt_unregister_target(&ipt_error_target);
|
||||
err3:
|
||||
xt_unregister_target(&ipt_standard_target);
|
||||
xt_unregister_targets(ipt_builtin_tg, ARRAY_SIZE(ipt_builtin_tg));
|
||||
err2:
|
||||
unregister_pernet_subsys(&ip_tables_net_ops);
|
||||
err1:
|
||||
|
|
@ -2295,10 +2267,8 @@ static void __exit ip_tables_fini(void)
|
|||
{
|
||||
nf_unregister_sockopt(&ipt_sockopts);
|
||||
|
||||
xt_unregister_match(&icmp_matchstruct);
|
||||
xt_unregister_target(&ipt_error_target);
|
||||
xt_unregister_target(&ipt_standard_target);
|
||||
|
||||
xt_unregister_matches(ipt_builtin_mt, ARRAY_SIZE(ipt_builtin_mt));
|
||||
xt_unregister_targets(ipt_builtin_tg, ARRAY_SIZE(ipt_builtin_tg));
|
||||
unregister_pernet_subsys(&ip_tables_net_ops);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/jhash.h>
|
||||
|
|
@ -88,7 +89,7 @@ clusterip_config_entry_put(struct clusterip_config *c)
|
|||
list_del(&c->list);
|
||||
write_unlock_bh(&clusterip_lock);
|
||||
|
||||
dev_mc_delete(c->dev, c->clustermac, ETH_ALEN, 0);
|
||||
dev_mc_del(c->dev, c->clustermac);
|
||||
dev_put(c->dev);
|
||||
|
||||
/* In case anyone still accesses the file, the open/close
|
||||
|
|
@ -239,8 +240,7 @@ clusterip_hashfn(const struct sk_buff *skb,
|
|||
break;
|
||||
default:
|
||||
if (net_ratelimit())
|
||||
printk(KERN_NOTICE "CLUSTERIP: unknown protocol `%u'\n",
|
||||
iph->protocol);
|
||||
pr_info("unknown protocol %u\n", iph->protocol);
|
||||
sport = dport = 0;
|
||||
}
|
||||
|
||||
|
|
@ -262,7 +262,7 @@ clusterip_hashfn(const struct sk_buff *skb,
|
|||
hashval = 0;
|
||||
/* This cannot happen, unless the check function wasn't called
|
||||
* at rule load time */
|
||||
printk("CLUSTERIP: unknown mode `%u'\n", config->hash_mode);
|
||||
pr_info("unknown mode %u\n", config->hash_mode);
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
|
|
@ -282,7 +282,7 @@ clusterip_responsible(const struct clusterip_config *config, u_int32_t hash)
|
|||
***********************************************************************/
|
||||
|
||||
static unsigned int
|
||||
clusterip_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
clusterip_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ipt_clusterip_tgt_info *cipinfo = par->targinfo;
|
||||
struct nf_conn *ct;
|
||||
|
|
@ -295,7 +295,7 @@ clusterip_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
|
||||
ct = nf_ct_get(skb, &ctinfo);
|
||||
if (ct == NULL) {
|
||||
printk(KERN_ERR "CLUSTERIP: no conntrack!\n");
|
||||
pr_info("no conntrack!\n");
|
||||
/* FIXME: need to drop invalid ones, since replies
|
||||
* to outgoing connections of other nodes will be
|
||||
* marked as INVALID */
|
||||
|
|
@ -348,25 +348,24 @@ clusterip_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static bool clusterip_tg_check(const struct xt_tgchk_param *par)
|
||||
static int clusterip_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
struct ipt_clusterip_tgt_info *cipinfo = par->targinfo;
|
||||
const struct ipt_entry *e = par->entryinfo;
|
||||
|
||||
struct clusterip_config *config;
|
||||
int ret;
|
||||
|
||||
if (cipinfo->hash_mode != CLUSTERIP_HASHMODE_SIP &&
|
||||
cipinfo->hash_mode != CLUSTERIP_HASHMODE_SIP_SPT &&
|
||||
cipinfo->hash_mode != CLUSTERIP_HASHMODE_SIP_SPT_DPT) {
|
||||
printk(KERN_WARNING "CLUSTERIP: unknown mode `%u'\n",
|
||||
cipinfo->hash_mode);
|
||||
return false;
|
||||
pr_info("unknown mode %u\n", cipinfo->hash_mode);
|
||||
return -EINVAL;
|
||||
|
||||
}
|
||||
if (e->ip.dmsk.s_addr != htonl(0xffffffff) ||
|
||||
e->ip.dst.s_addr == 0) {
|
||||
printk(KERN_ERR "CLUSTERIP: Please specify destination IP\n");
|
||||
return false;
|
||||
pr_info("Please specify destination IP\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* FIXME: further sanity checks */
|
||||
|
|
@ -374,41 +373,41 @@ static bool clusterip_tg_check(const struct xt_tgchk_param *par)
|
|||
config = clusterip_config_find_get(e->ip.dst.s_addr, 1);
|
||||
if (!config) {
|
||||
if (!(cipinfo->flags & CLUSTERIP_FLAG_NEW)) {
|
||||
printk(KERN_WARNING "CLUSTERIP: no config found for %pI4, need 'new'\n", &e->ip.dst.s_addr);
|
||||
return false;
|
||||
pr_info("no config found for %pI4, need 'new'\n",
|
||||
&e->ip.dst.s_addr);
|
||||
return -EINVAL;
|
||||
} else {
|
||||
struct net_device *dev;
|
||||
|
||||
if (e->ip.iniface[0] == '\0') {
|
||||
printk(KERN_WARNING "CLUSTERIP: Please specify an interface name\n");
|
||||
return false;
|
||||
pr_info("Please specify an interface name\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev = dev_get_by_name(&init_net, e->ip.iniface);
|
||||
if (!dev) {
|
||||
printk(KERN_WARNING "CLUSTERIP: no such interface %s\n", e->ip.iniface);
|
||||
return false;
|
||||
pr_info("no such interface %s\n",
|
||||
e->ip.iniface);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
config = clusterip_config_init(cipinfo,
|
||||
e->ip.dst.s_addr, dev);
|
||||
if (!config) {
|
||||
printk(KERN_WARNING "CLUSTERIP: cannot allocate config\n");
|
||||
pr_info("cannot allocate config\n");
|
||||
dev_put(dev);
|
||||
return false;
|
||||
return -ENOMEM;
|
||||
}
|
||||
dev_mc_add(config->dev,config->clustermac, ETH_ALEN, 0);
|
||||
dev_mc_add(config->dev, config->clustermac);
|
||||
}
|
||||
}
|
||||
cipinfo->config = config;
|
||||
|
||||
if (nf_ct_l3proto_try_module_get(par->target->family) < 0) {
|
||||
printk(KERN_WARNING "can't load conntrack support for "
|
||||
"proto=%u\n", par->target->family);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
ret = nf_ct_l3proto_try_module_get(par->family);
|
||||
if (ret < 0)
|
||||
pr_info("cannot load conntrack support for proto=%u\n",
|
||||
par->family);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* drop reference count of cluster config when rule is deleted */
|
||||
|
|
@ -422,7 +421,7 @@ static void clusterip_tg_destroy(const struct xt_tgdtor_param *par)
|
|||
|
||||
clusterip_config_put(cipinfo->config);
|
||||
|
||||
nf_ct_l3proto_module_put(par->target->family);
|
||||
nf_ct_l3proto_module_put(par->family);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
@ -479,8 +478,8 @@ static void arp_print(struct arp_payload *payload)
|
|||
}
|
||||
hbuffer[--k]='\0';
|
||||
|
||||
printk("src %pI4@%s, dst %pI4\n",
|
||||
&payload->src_ip, hbuffer, &payload->dst_ip);
|
||||
pr_debug("src %pI4@%s, dst %pI4\n",
|
||||
&payload->src_ip, hbuffer, &payload->dst_ip);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -519,7 +518,7 @@ arp_mangle(unsigned int hook,
|
|||
* this wouldn't work, since we didn't subscribe the mcast group on
|
||||
* other interfaces */
|
||||
if (c->dev != out) {
|
||||
pr_debug("CLUSTERIP: not mangling arp reply on different "
|
||||
pr_debug("not mangling arp reply on different "
|
||||
"interface: cip'%s'-skb'%s'\n",
|
||||
c->dev->name, out->name);
|
||||
clusterip_config_put(c);
|
||||
|
|
@ -530,7 +529,7 @@ arp_mangle(unsigned int hook,
|
|||
memcpy(payload->src_hw, c->clustermac, arp->ar_hln);
|
||||
|
||||
#ifdef DEBUG
|
||||
pr_debug(KERN_DEBUG "CLUSTERIP mangled arp reply: ");
|
||||
pr_debug("mangled arp reply: ");
|
||||
arp_print(payload);
|
||||
#endif
|
||||
|
||||
|
|
@ -601,7 +600,8 @@ static void *clusterip_seq_next(struct seq_file *s, void *v, loff_t *pos)
|
|||
|
||||
static void clusterip_seq_stop(struct seq_file *s, void *v)
|
||||
{
|
||||
kfree(v);
|
||||
if (!IS_ERR(v))
|
||||
kfree(v);
|
||||
}
|
||||
|
||||
static int clusterip_seq_show(struct seq_file *s, void *v)
|
||||
|
|
@ -706,13 +706,13 @@ static int __init clusterip_tg_init(void)
|
|||
#ifdef CONFIG_PROC_FS
|
||||
clusterip_procdir = proc_mkdir("ipt_CLUSTERIP", init_net.proc_net);
|
||||
if (!clusterip_procdir) {
|
||||
printk(KERN_ERR "CLUSTERIP: Unable to proc dir entry\n");
|
||||
pr_err("Unable to proc dir entry\n");
|
||||
ret = -ENOMEM;
|
||||
goto cleanup_hook;
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
printk(KERN_NOTICE "ClusterIP Version %s loaded successfully\n",
|
||||
pr_info("ClusterIP Version %s loaded successfully\n",
|
||||
CLUSTERIP_VERSION);
|
||||
return 0;
|
||||
|
||||
|
|
@ -727,8 +727,7 @@ cleanup_target:
|
|||
|
||||
static void __exit clusterip_tg_exit(void)
|
||||
{
|
||||
printk(KERN_NOTICE "ClusterIP Version %s unloading\n",
|
||||
CLUSTERIP_VERSION);
|
||||
pr_info("ClusterIP Version %s unloading\n", CLUSTERIP_VERSION);
|
||||
#ifdef CONFIG_PROC_FS
|
||||
remove_proc_entry(clusterip_procdir->name, clusterip_procdir->parent);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/in.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
|
@ -77,7 +77,7 @@ set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
ecn_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
ecn_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ipt_ECN_info *einfo = par->targinfo;
|
||||
|
||||
|
|
@ -93,28 +93,25 @@ ecn_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static bool ecn_tg_check(const struct xt_tgchk_param *par)
|
||||
static int ecn_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ipt_ECN_info *einfo = par->targinfo;
|
||||
const struct ipt_entry *e = par->entryinfo;
|
||||
|
||||
if (einfo->operation & IPT_ECN_OP_MASK) {
|
||||
printk(KERN_WARNING "ECN: unsupported ECN operation %x\n",
|
||||
einfo->operation);
|
||||
return false;
|
||||
pr_info("unsupported ECN operation %x\n", einfo->operation);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (einfo->ip_ect & ~IPT_ECN_IP_MASK) {
|
||||
printk(KERN_WARNING "ECN: new ECT codepoint %x out of mask\n",
|
||||
einfo->ip_ect);
|
||||
return false;
|
||||
pr_info("new ECT codepoint %x out of mask\n", einfo->ip_ect);
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) &&
|
||||
(e->ip.proto != IPPROTO_TCP || (e->ip.invflags & XT_INV_PROTO))) {
|
||||
printk(KERN_WARNING "ECN: cannot use TCP operations on a "
|
||||
"non-tcp rule\n");
|
||||
return false;
|
||||
pr_info("cannot use TCP operations on a non-tcp rule\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_target ecn_tg_reg __read_mostly = {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
|
@ -367,7 +367,7 @@ static struct nf_loginfo default_loginfo = {
|
|||
.type = NF_LOG_TYPE_LOG,
|
||||
.u = {
|
||||
.log = {
|
||||
.level = 0,
|
||||
.level = 5,
|
||||
.logflags = NF_LOG_MASK,
|
||||
},
|
||||
},
|
||||
|
|
@ -425,7 +425,7 @@ ipt_log_packet(u_int8_t pf,
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
log_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
log_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ipt_log_info *loginfo = par->targinfo;
|
||||
struct nf_loginfo li;
|
||||
|
|
@ -439,20 +439,19 @@ log_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static bool log_tg_check(const struct xt_tgchk_param *par)
|
||||
static int log_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ipt_log_info *loginfo = par->targinfo;
|
||||
|
||||
if (loginfo->level >= 8) {
|
||||
pr_debug("LOG: level %u >= 8\n", loginfo->level);
|
||||
return false;
|
||||
pr_debug("level %u >= 8\n", loginfo->level);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (loginfo->prefix[sizeof(loginfo->prefix)-1] != '\0') {
|
||||
pr_debug("LOG: prefix term %i\n",
|
||||
loginfo->prefix[sizeof(loginfo->prefix)-1]);
|
||||
return false;
|
||||
pr_debug("prefix is not null-terminated\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_target log_tg_reg __read_mostly = {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/types.h>
|
||||
#include <linux/inetdevice.h>
|
||||
#include <linux/ip.h>
|
||||
|
|
@ -28,23 +28,23 @@ MODULE_AUTHOR("Netfilter Core Team <[email protected]>");
|
|||
MODULE_DESCRIPTION("Xtables: automatic-address SNAT");
|
||||
|
||||
/* FIXME: Multiple targets. --RR */
|
||||
static bool masquerade_tg_check(const struct xt_tgchk_param *par)
|
||||
static int masquerade_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct nf_nat_multi_range_compat *mr = par->targinfo;
|
||||
|
||||
if (mr->range[0].flags & IP_NAT_RANGE_MAP_IPS) {
|
||||
pr_debug("masquerade_check: bad MAP_IPS.\n");
|
||||
return false;
|
||||
pr_debug("bad MAP_IPS.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (mr->rangesize != 1) {
|
||||
pr_debug("masquerade_check: bad rangesize %u\n", mr->rangesize);
|
||||
return false;
|
||||
pr_debug("bad rangesize %u\n", mr->rangesize);
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
masquerade_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
masquerade_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct nf_conn *ct;
|
||||
struct nf_conn_nat *nat;
|
||||
|
|
@ -72,7 +72,7 @@ masquerade_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
rt = skb_rtable(skb);
|
||||
newsrc = inet_select_addr(par->out, rt->rt_gateway, RT_SCOPE_UNIVERSE);
|
||||
if (!newsrc) {
|
||||
printk("MASQUERADE: %s ate my IP address\n", par->out->name);
|
||||
pr_info("%s ate my IP address\n", par->out->name);
|
||||
return NF_DROP;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/ip.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
|
@ -22,23 +22,23 @@ MODULE_LICENSE("GPL");
|
|||
MODULE_AUTHOR("Svenning Soerensen <[email protected]>");
|
||||
MODULE_DESCRIPTION("Xtables: 1:1 NAT mapping of IPv4 subnets");
|
||||
|
||||
static bool netmap_tg_check(const struct xt_tgchk_param *par)
|
||||
static int netmap_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct nf_nat_multi_range_compat *mr = par->targinfo;
|
||||
|
||||
if (!(mr->range[0].flags & IP_NAT_RANGE_MAP_IPS)) {
|
||||
pr_debug("NETMAP:check: bad MAP_IPS.\n");
|
||||
return false;
|
||||
pr_debug("bad MAP_IPS.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (mr->rangesize != 1) {
|
||||
pr_debug("NETMAP:check: bad rangesize %u.\n", mr->rangesize);
|
||||
return false;
|
||||
pr_debug("bad rangesize %u.\n", mr->rangesize);
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
netmap_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
netmap_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct nf_conn *ct;
|
||||
enum ip_conntrack_info ctinfo;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/types.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/timer.h>
|
||||
|
|
@ -26,23 +26,23 @@ MODULE_AUTHOR("Netfilter Core Team <[email protected]>");
|
|||
MODULE_DESCRIPTION("Xtables: Connection redirection to localhost");
|
||||
|
||||
/* FIXME: Take multiple ranges --RR */
|
||||
static bool redirect_tg_check(const struct xt_tgchk_param *par)
|
||||
static int redirect_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct nf_nat_multi_range_compat *mr = par->targinfo;
|
||||
|
||||
if (mr->range[0].flags & IP_NAT_RANGE_MAP_IPS) {
|
||||
pr_debug("redirect_check: bad MAP_IPS.\n");
|
||||
return false;
|
||||
pr_debug("bad MAP_IPS.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (mr->rangesize != 1) {
|
||||
pr_debug("redirect_check: bad rangesize %u.\n", mr->rangesize);
|
||||
return false;
|
||||
pr_debug("bad rangesize %u.\n", mr->rangesize);
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
redirect_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
redirect_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct nf_conn *ct;
|
||||
enum ip_conntrack_info ctinfo;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
@ -136,13 +136,10 @@ static inline void send_unreach(struct sk_buff *skb_in, int code)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
reject_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
reject_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ipt_reject_info *reject = par->targinfo;
|
||||
|
||||
/* WARNING: This code causes reentry within iptables.
|
||||
This means that the iptables jump stack is now crap. We
|
||||
must return an absolute verdict. --RR */
|
||||
switch (reject->with) {
|
||||
case IPT_ICMP_NET_UNREACHABLE:
|
||||
send_unreach(skb, ICMP_NET_UNREACH);
|
||||
|
|
@ -175,23 +172,23 @@ reject_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
return NF_DROP;
|
||||
}
|
||||
|
||||
static bool reject_tg_check(const struct xt_tgchk_param *par)
|
||||
static int reject_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ipt_reject_info *rejinfo = par->targinfo;
|
||||
const struct ipt_entry *e = par->entryinfo;
|
||||
|
||||
if (rejinfo->with == IPT_ICMP_ECHOREPLY) {
|
||||
printk("ipt_REJECT: ECHOREPLY no longer supported.\n");
|
||||
return false;
|
||||
pr_info("ECHOREPLY no longer supported.\n");
|
||||
return -EINVAL;
|
||||
} else if (rejinfo->with == IPT_TCP_RESET) {
|
||||
/* Must specify that it's a TCP packet */
|
||||
if (e->ip.proto != IPPROTO_TCP ||
|
||||
(e->ip.invflags & XT_INV_PROTO)) {
|
||||
printk("ipt_REJECT: TCP_RESET invalid for non-tcp\n");
|
||||
return false;
|
||||
pr_info("TCP_RESET invalid for non-tcp\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_target reject_tg_reg __read_mostly = {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
* Specify, after how many hundredths of a second the queue should be
|
||||
* flushed even if it is not full yet.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/socket.h>
|
||||
|
|
@ -57,8 +57,6 @@ MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_NFLOG);
|
|||
#define ULOG_NL_EVENT 111 /* Harald's favorite number */
|
||||
#define ULOG_MAXNLGROUPS 32 /* numer of nlgroups */
|
||||
|
||||
#define PRINTR(format, args...) do { if (net_ratelimit()) printk(format , ## args); } while (0)
|
||||
|
||||
static unsigned int nlbufsiz = NLMSG_GOODSIZE;
|
||||
module_param(nlbufsiz, uint, 0400);
|
||||
MODULE_PARM_DESC(nlbufsiz, "netlink buffer size");
|
||||
|
|
@ -91,12 +89,12 @@ static void ulog_send(unsigned int nlgroupnum)
|
|||
ulog_buff_t *ub = &ulog_buffers[nlgroupnum];
|
||||
|
||||
if (timer_pending(&ub->timer)) {
|
||||
pr_debug("ipt_ULOG: ulog_send: timer was pending, deleting\n");
|
||||
pr_debug("ulog_send: timer was pending, deleting\n");
|
||||
del_timer(&ub->timer);
|
||||
}
|
||||
|
||||
if (!ub->skb) {
|
||||
pr_debug("ipt_ULOG: ulog_send: nothing to send\n");
|
||||
pr_debug("ulog_send: nothing to send\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -105,7 +103,7 @@ static void ulog_send(unsigned int nlgroupnum)
|
|||
ub->lastnlh->nlmsg_type = NLMSG_DONE;
|
||||
|
||||
NETLINK_CB(ub->skb).dst_group = nlgroupnum + 1;
|
||||
pr_debug("ipt_ULOG: throwing %d packets to netlink group %u\n",
|
||||
pr_debug("throwing %d packets to netlink group %u\n",
|
||||
ub->qlen, nlgroupnum + 1);
|
||||
netlink_broadcast(nflognl, ub->skb, 0, nlgroupnum + 1, GFP_ATOMIC);
|
||||
|
||||
|
|
@ -118,7 +116,7 @@ static void ulog_send(unsigned int nlgroupnum)
|
|||
/* timer function to flush queue in flushtimeout time */
|
||||
static void ulog_timer(unsigned long data)
|
||||
{
|
||||
pr_debug("ipt_ULOG: timer function called, calling ulog_send\n");
|
||||
pr_debug("timer function called, calling ulog_send\n");
|
||||
|
||||
/* lock to protect against somebody modifying our structure
|
||||
* from ipt_ulog_target at the same time */
|
||||
|
|
@ -139,7 +137,7 @@ static struct sk_buff *ulog_alloc_skb(unsigned int size)
|
|||
n = max(size, nlbufsiz);
|
||||
skb = alloc_skb(n, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
PRINTR("ipt_ULOG: can't alloc whole buffer %ub!\n", n);
|
||||
pr_debug("cannot alloc whole buffer %ub!\n", n);
|
||||
|
||||
if (n > size) {
|
||||
/* try to allocate only as much as we need for
|
||||
|
|
@ -147,8 +145,7 @@ static struct sk_buff *ulog_alloc_skb(unsigned int size)
|
|||
|
||||
skb = alloc_skb(size, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
PRINTR("ipt_ULOG: can't even allocate %ub\n",
|
||||
size);
|
||||
pr_debug("cannot even allocate %ub\n", size);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -199,8 +196,7 @@ static void ipt_ulog_packet(unsigned int hooknum,
|
|||
goto alloc_failure;
|
||||
}
|
||||
|
||||
pr_debug("ipt_ULOG: qlen %d, qthreshold %Zu\n", ub->qlen,
|
||||
loginfo->qthreshold);
|
||||
pr_debug("qlen %d, qthreshold %Zu\n", ub->qlen, loginfo->qthreshold);
|
||||
|
||||
/* NLMSG_PUT contains a hidden goto nlmsg_failure !!! */
|
||||
nlh = NLMSG_PUT(ub->skb, 0, ub->qlen, ULOG_NL_EVENT,
|
||||
|
|
@ -273,16 +269,14 @@ static void ipt_ulog_packet(unsigned int hooknum,
|
|||
return;
|
||||
|
||||
nlmsg_failure:
|
||||
PRINTR("ipt_ULOG: error during NLMSG_PUT\n");
|
||||
|
||||
pr_debug("error during NLMSG_PUT\n");
|
||||
alloc_failure:
|
||||
PRINTR("ipt_ULOG: Error building netlink message\n");
|
||||
|
||||
pr_debug("Error building netlink message\n");
|
||||
spin_unlock_bh(&ulog_lock);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
ulog_tg(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
ulog_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
ipt_ulog_packet(par->hooknum, skb, par->in, par->out,
|
||||
par->targinfo, NULL);
|
||||
|
|
@ -314,21 +308,20 @@ static void ipt_logfn(u_int8_t pf,
|
|||
ipt_ulog_packet(hooknum, skb, in, out, &loginfo, prefix);
|
||||
}
|
||||
|
||||
static bool ulog_tg_check(const struct xt_tgchk_param *par)
|
||||
static int ulog_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ipt_ulog_info *loginfo = par->targinfo;
|
||||
|
||||
if (loginfo->prefix[sizeof(loginfo->prefix) - 1] != '\0') {
|
||||
pr_debug("ipt_ULOG: prefix term %i\n",
|
||||
loginfo->prefix[sizeof(loginfo->prefix) - 1]);
|
||||
return false;
|
||||
pr_debug("prefix not null-terminated\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (loginfo->qthreshold > ULOG_MAX_QLEN) {
|
||||
pr_debug("ipt_ULOG: queue threshold %Zu > MAX_QLEN\n",
|
||||
pr_debug("queue threshold %Zu > MAX_QLEN\n",
|
||||
loginfo->qthreshold);
|
||||
return false;
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
@ -390,10 +383,10 @@ static int __init ulog_tg_init(void)
|
|||
{
|
||||
int ret, i;
|
||||
|
||||
pr_debug("ipt_ULOG: init module\n");
|
||||
pr_debug("init module\n");
|
||||
|
||||
if (nlbufsiz > 128*1024) {
|
||||
printk("Netlink buffer has to be <= 128kB\n");
|
||||
pr_warning("Netlink buffer has to be <= 128kB\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -423,7 +416,7 @@ static void __exit ulog_tg_exit(void)
|
|||
ulog_buff_t *ub;
|
||||
int i;
|
||||
|
||||
pr_debug("ipt_ULOG: cleanup_module\n");
|
||||
pr_debug("cleanup_module\n");
|
||||
|
||||
if (nflog)
|
||||
nf_log_unregister(&ipt_ulog_logger);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
|
@ -30,7 +30,7 @@ static inline bool match_type(struct net *net, const struct net_device *dev,
|
|||
}
|
||||
|
||||
static bool
|
||||
addrtype_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
addrtype_mt_v0(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
struct net *net = dev_net(par->in ? par->in : par->out);
|
||||
const struct ipt_addrtype_info *info = par->matchinfo;
|
||||
|
|
@ -48,7 +48,7 @@ addrtype_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
}
|
||||
|
||||
static bool
|
||||
addrtype_mt_v1(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
addrtype_mt_v1(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
struct net *net = dev_net(par->in ? par->in : par->out);
|
||||
const struct ipt_addrtype_info_v1 *info = par->matchinfo;
|
||||
|
|
@ -70,34 +70,34 @@ addrtype_mt_v1(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static bool addrtype_mt_checkentry_v1(const struct xt_mtchk_param *par)
|
||||
static int addrtype_mt_checkentry_v1(const struct xt_mtchk_param *par)
|
||||
{
|
||||
struct ipt_addrtype_info_v1 *info = par->matchinfo;
|
||||
|
||||
if (info->flags & IPT_ADDRTYPE_LIMIT_IFACE_IN &&
|
||||
info->flags & IPT_ADDRTYPE_LIMIT_IFACE_OUT) {
|
||||
printk(KERN_ERR "ipt_addrtype: both incoming and outgoing "
|
||||
"interface limitation cannot be selected\n");
|
||||
return false;
|
||||
pr_info("both incoming and outgoing "
|
||||
"interface limitation cannot be selected\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (par->hook_mask & ((1 << NF_INET_PRE_ROUTING) |
|
||||
(1 << NF_INET_LOCAL_IN)) &&
|
||||
info->flags & IPT_ADDRTYPE_LIMIT_IFACE_OUT) {
|
||||
printk(KERN_ERR "ipt_addrtype: output interface limitation "
|
||||
"not valid in PRE_ROUTING and INPUT\n");
|
||||
return false;
|
||||
pr_info("output interface limitation "
|
||||
"not valid in PREROUTING and INPUT\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (par->hook_mask & ((1 << NF_INET_POST_ROUTING) |
|
||||
(1 << NF_INET_LOCAL_OUT)) &&
|
||||
info->flags & IPT_ADDRTYPE_LIMIT_IFACE_IN) {
|
||||
printk(KERN_ERR "ipt_addrtype: input interface limitation "
|
||||
"not valid in POST_ROUTING and OUTPUT\n");
|
||||
return false;
|
||||
pr_info("input interface limitation "
|
||||
"not valid in POSTROUTING and OUTPUT\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_match addrtype_mt_reg[] __read_mostly = {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/in.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
|
@ -18,25 +18,19 @@ MODULE_LICENSE("GPL");
|
|||
MODULE_AUTHOR("Yon Uriarte <[email protected]>");
|
||||
MODULE_DESCRIPTION("Xtables: IPv4 IPsec-AH SPI match");
|
||||
|
||||
#ifdef DEBUG_CONNTRACK
|
||||
#define duprintf(format, args...) printk(format , ## args)
|
||||
#else
|
||||
#define duprintf(format, args...)
|
||||
#endif
|
||||
|
||||
/* Returns 1 if the spi is matched by the range, 0 otherwise */
|
||||
static inline bool
|
||||
spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, bool invert)
|
||||
{
|
||||
bool r;
|
||||
duprintf("ah spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ',
|
||||
min,spi,max);
|
||||
pr_debug("spi_match:%c 0x%x <= 0x%x <= 0x%x\n",
|
||||
invert ? '!' : ' ', min, spi, max);
|
||||
r=(spi >= min && spi <= max) ^ invert;
|
||||
duprintf(" result %s\n",r? "PASS" : "FAILED");
|
||||
pr_debug(" result %s\n", r ? "PASS" : "FAILED");
|
||||
return r;
|
||||
}
|
||||
|
||||
static bool ah_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
static bool ah_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
struct ip_auth_hdr _ahdr;
|
||||
const struct ip_auth_hdr *ah;
|
||||
|
|
@ -51,8 +45,8 @@ static bool ah_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
/* We've been asked to examine this packet, and we
|
||||
* can't. Hence, no choice but to drop.
|
||||
*/
|
||||
duprintf("Dropping evil AH tinygram.\n");
|
||||
*par->hotdrop = true;
|
||||
pr_debug("Dropping evil AH tinygram.\n");
|
||||
par->hotdrop = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -61,16 +55,16 @@ static bool ah_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
!!(ahinfo->invflags & IPT_AH_INV_SPI));
|
||||
}
|
||||
|
||||
static bool ah_mt_check(const struct xt_mtchk_param *par)
|
||||
static int ah_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ipt_ah *ahinfo = par->matchinfo;
|
||||
|
||||
/* Must specify no unknown invflags */
|
||||
if (ahinfo->invflags & ~IPT_AH_INV_MASK) {
|
||||
duprintf("ipt_ah: unknown flags %X\n", ahinfo->invflags);
|
||||
return false;
|
||||
pr_debug("unknown flags %X\n", ahinfo->invflags);
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_match ah_mt_reg __read_mostly = {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <net/ip.h>
|
||||
|
|
@ -67,7 +67,7 @@ static inline bool match_tcp(const struct sk_buff *skb,
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool ecn_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
static bool ecn_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
const struct ipt_ecn_info *info = par->matchinfo;
|
||||
|
||||
|
|
@ -78,32 +78,31 @@ static bool ecn_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)) {
|
||||
if (ip_hdr(skb)->protocol != IPPROTO_TCP)
|
||||
return false;
|
||||
if (!match_tcp(skb, info, par->hotdrop))
|
||||
if (!match_tcp(skb, info, &par->hotdrop))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool ecn_mt_check(const struct xt_mtchk_param *par)
|
||||
static int ecn_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ipt_ecn_info *info = par->matchinfo;
|
||||
const struct ipt_ip *ip = par->entryinfo;
|
||||
|
||||
if (info->operation & IPT_ECN_OP_MATCH_MASK)
|
||||
return false;
|
||||
return -EINVAL;
|
||||
|
||||
if (info->invert & IPT_ECN_OP_MATCH_MASK)
|
||||
return false;
|
||||
return -EINVAL;
|
||||
|
||||
if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR) &&
|
||||
ip->proto != IPPROTO_TCP) {
|
||||
printk(KERN_WARNING "ipt_ecn: can't match TCP bits in rule for"
|
||||
" non-tcp packets\n");
|
||||
return false;
|
||||
pr_info("cannot match TCP bits in rule for non-tcp packets\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_match ecn_mt_reg __read_mostly = {
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ static int __init iptable_filter_init(void)
|
|||
int ret;
|
||||
|
||||
if (forward < 0 || forward > NF_MAX_VERDICT) {
|
||||
printk("iptables forward must be 0 or 1\n");
|
||||
pr_err("iptables forward must be 0 or 1\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -382,32 +382,32 @@ static int __init nf_conntrack_l3proto_ipv4_init(void)
|
|||
|
||||
ret = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_tcp4);
|
||||
if (ret < 0) {
|
||||
printk("nf_conntrack_ipv4: can't register tcp.\n");
|
||||
pr_err("nf_conntrack_ipv4: can't register tcp.\n");
|
||||
goto cleanup_sockopt;
|
||||
}
|
||||
|
||||
ret = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_udp4);
|
||||
if (ret < 0) {
|
||||
printk("nf_conntrack_ipv4: can't register udp.\n");
|
||||
pr_err("nf_conntrack_ipv4: can't register udp.\n");
|
||||
goto cleanup_tcp;
|
||||
}
|
||||
|
||||
ret = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_icmp);
|
||||
if (ret < 0) {
|
||||
printk("nf_conntrack_ipv4: can't register icmp.\n");
|
||||
pr_err("nf_conntrack_ipv4: can't register icmp.\n");
|
||||
goto cleanup_udp;
|
||||
}
|
||||
|
||||
ret = nf_conntrack_l3proto_register(&nf_conntrack_l3proto_ipv4);
|
||||
if (ret < 0) {
|
||||
printk("nf_conntrack_ipv4: can't register ipv4\n");
|
||||
pr_err("nf_conntrack_ipv4: can't register ipv4\n");
|
||||
goto cleanup_icmp;
|
||||
}
|
||||
|
||||
ret = nf_register_hooks(ipv4_conntrack_ops,
|
||||
ARRAY_SIZE(ipv4_conntrack_ops));
|
||||
if (ret < 0) {
|
||||
printk("nf_conntrack_ipv4: can't register hooks.\n");
|
||||
pr_err("nf_conntrack_ipv4: can't register hooks.\n");
|
||||
goto cleanup_ipv4;
|
||||
}
|
||||
#if defined(CONFIG_PROC_FS) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT)
|
||||
|
|
|
|||
|
|
@ -336,12 +336,12 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
|
|||
const struct ip_conntrack_stat *st = v;
|
||||
|
||||
if (v == SEQ_START_TOKEN) {
|
||||
seq_printf(seq, "entries searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error expect_new expect_create expect_delete\n");
|
||||
seq_printf(seq, "entries searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error expect_new expect_create expect_delete search_restart\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x "
|
||||
"%08x %08x %08x %08x %08x %08x %08x %08x \n",
|
||||
"%08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||
nr_conntracks,
|
||||
st->searched,
|
||||
st->found,
|
||||
|
|
@ -358,7 +358,8 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
|
|||
|
||||
st->expect_new,
|
||||
st->expect_create,
|
||||
st->expect_delete
|
||||
st->expect_delete,
|
||||
st->search_restart
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <net/tcp.h>
|
||||
|
||||
|
|
@ -44,7 +43,7 @@ static int set_addr(struct sk_buff *skb,
|
|||
addroff, sizeof(buf),
|
||||
(char *) &buf, sizeof(buf))) {
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_h323: nf_nat_mangle_tcp_packet"
|
||||
pr_notice("nf_nat_h323: nf_nat_mangle_tcp_packet"
|
||||
" error\n");
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -60,7 +59,7 @@ static int set_addr(struct sk_buff *skb,
|
|||
addroff, sizeof(buf),
|
||||
(char *) &buf, sizeof(buf))) {
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_h323: nf_nat_mangle_udp_packet"
|
||||
pr_notice("nf_nat_h323: nf_nat_mangle_udp_packet"
|
||||
" error\n");
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -216,7 +215,7 @@ static int nat_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct,
|
|||
/* Run out of expectations */
|
||||
if (i >= H323_RTP_CHANNEL_MAX) {
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_h323: out of expectations\n");
|
||||
pr_notice("nf_nat_h323: out of expectations\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -235,7 +234,7 @@ static int nat_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct,
|
|||
|
||||
if (nated_port == 0) { /* No port available */
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_h323: out of RTP ports\n");
|
||||
pr_notice("nf_nat_h323: out of RTP ports\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -292,7 +291,7 @@ static int nat_t120(struct sk_buff *skb, struct nf_conn *ct,
|
|||
|
||||
if (nated_port == 0) { /* No port available */
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_h323: out of TCP ports\n");
|
||||
pr_notice("nf_nat_h323: out of TCP ports\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -342,7 +341,7 @@ static int nat_h245(struct sk_buff *skb, struct nf_conn *ct,
|
|||
|
||||
if (nated_port == 0) { /* No port available */
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_q931: out of TCP ports\n");
|
||||
pr_notice("nf_nat_q931: out of TCP ports\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -426,7 +425,7 @@ static int nat_q931(struct sk_buff *skb, struct nf_conn *ct,
|
|||
|
||||
if (nated_port == 0) { /* No port available */
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_ras: out of TCP ports\n");
|
||||
pr_notice("nf_nat_ras: out of TCP ports\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -508,7 +507,7 @@ static int nat_callforwarding(struct sk_buff *skb, struct nf_conn *ct,
|
|||
|
||||
if (nated_port == 0) { /* No port available */
|
||||
if (net_ratelimit())
|
||||
printk("nf_nat_q931: out of TCP ports\n");
|
||||
pr_notice("nf_nat_q931: out of TCP ports\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
*/
|
||||
|
||||
/* Everything about the rules for NAT. */
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/types.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/netfilter.h>
|
||||
|
|
@ -38,7 +39,7 @@ static const struct xt_table nat_table = {
|
|||
|
||||
/* Source NAT */
|
||||
static unsigned int
|
||||
ipt_snat_target(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
ipt_snat_target(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct nf_conn *ct;
|
||||
enum ip_conntrack_info ctinfo;
|
||||
|
|
@ -57,7 +58,7 @@ ipt_snat_target(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
ipt_dnat_target(struct sk_buff *skb, const struct xt_target_param *par)
|
||||
ipt_dnat_target(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct nf_conn *ct;
|
||||
enum ip_conntrack_info ctinfo;
|
||||
|
|
@ -74,28 +75,28 @@ ipt_dnat_target(struct sk_buff *skb, const struct xt_target_param *par)
|
|||
return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_DST);
|
||||
}
|
||||
|
||||
static bool ipt_snat_checkentry(const struct xt_tgchk_param *par)
|
||||
static int ipt_snat_checkentry(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct nf_nat_multi_range_compat *mr = par->targinfo;
|
||||
|
||||
/* Must be a valid range */
|
||||
if (mr->rangesize != 1) {
|
||||
printk("SNAT: multiple ranges no longer supported\n");
|
||||
return false;
|
||||
pr_info("SNAT: multiple ranges no longer supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool ipt_dnat_checkentry(const struct xt_tgchk_param *par)
|
||||
static int ipt_dnat_checkentry(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct nf_nat_multi_range_compat *mr = par->targinfo;
|
||||
|
||||
/* Must be a valid range */
|
||||
if (mr->rangesize != 1) {
|
||||
printk("DNAT: multiple ranges no longer supported\n");
|
||||
return false;
|
||||
pr_info("DNAT: multiple ranges no longer supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
|
|
|
|||
|
|
@ -401,7 +401,7 @@ static unsigned char asn1_octets_decode(struct asn1_ctx *ctx,
|
|||
*octets = kmalloc(eoc - ctx->pointer, GFP_ATOMIC);
|
||||
if (*octets == NULL) {
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -452,7 +452,7 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
|
|||
*oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
|
||||
if (*oid == NULL) {
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -729,7 +729,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
|
|||
if (*obj == NULL) {
|
||||
kfree(id);
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
(*obj)->syntax.l[0] = l;
|
||||
|
|
@ -746,7 +746,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
|
|||
kfree(p);
|
||||
kfree(id);
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
memcpy((*obj)->syntax.c, p, len);
|
||||
|
|
@ -761,7 +761,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
|
|||
if (*obj == NULL) {
|
||||
kfree(id);
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
if (!asn1_null_decode(ctx, end)) {
|
||||
|
|
@ -782,7 +782,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
|
|||
kfree(lp);
|
||||
kfree(id);
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
memcpy((*obj)->syntax.ul, lp, len);
|
||||
|
|
@ -803,7 +803,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
|
|||
kfree(p);
|
||||
kfree(id);
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
memcpy((*obj)->syntax.uc, p, len);
|
||||
|
|
@ -821,7 +821,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
|
|||
if (*obj == NULL) {
|
||||
kfree(id);
|
||||
if (net_ratelimit())
|
||||
printk("OOM in bsalg (%d)\n", __LINE__);
|
||||
pr_notice("OOM in bsalg (%d)\n", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
(*obj)->syntax.ul[0] = ul;
|
||||
|
|
|
|||
|
|
@ -138,9 +138,8 @@ nf_nat_fn(unsigned int hooknum,
|
|||
ret = nf_nat_rule_find(skb, hooknum, in, out,
|
||||
ct);
|
||||
|
||||
if (ret != NF_ACCEPT) {
|
||||
if (ret != NF_ACCEPT)
|
||||
return ret;
|
||||
}
|
||||
} else
|
||||
pr_debug("Already setup manip %s for ct %p\n",
|
||||
maniptype == IP_NAT_MANIP_SRC ? "SRC" : "DST",
|
||||
|
|
@ -294,12 +293,12 @@ static int __init nf_nat_standalone_init(void)
|
|||
#endif
|
||||
ret = nf_nat_rule_init();
|
||||
if (ret < 0) {
|
||||
printk("nf_nat_init: can't setup rules.\n");
|
||||
pr_err("nf_nat_init: can't setup rules.\n");
|
||||
goto cleanup_decode_session;
|
||||
}
|
||||
ret = nf_register_hooks(nf_nat_ops, ARRAY_SIZE(nf_nat_ops));
|
||||
if (ret < 0) {
|
||||
printk("nf_nat_init: can't register hooks.\n");
|
||||
pr_err("nf_nat_init: can't register hooks.\n");
|
||||
goto cleanup_rule_init;
|
||||
}
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/udp.h>
|
||||
|
||||
#include <net/netfilter/nf_nat_helper.h>
|
||||
|
|
|
|||
|
|
@ -251,6 +251,7 @@ static const struct snmp_mib snmp4_net_list[] = {
|
|||
SNMP_MIB_ITEM("TCPSackShiftFallback", LINUX_MIB_SACKSHIFTFALLBACK),
|
||||
SNMP_MIB_ITEM("TCPBacklogDrop", LINUX_MIB_TCPBACKLOGDROP),
|
||||
SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP),
|
||||
SNMP_MIB_ITEM("TCPDeferAcceptDrop", LINUX_MIB_TCPDEFERACCEPTDROP),
|
||||
SNMP_MIB_SENTINEL
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -290,7 +290,7 @@ static int raw_rcv_skb(struct sock * sk, struct sk_buff * skb)
|
|||
{
|
||||
/* Charge it to the socket. */
|
||||
|
||||
if (sock_queue_rcv_skb(sk, skb) < 0) {
|
||||
if (ip_queue_rcv_skb(sk, skb) < 0) {
|
||||
kfree_skb(skb);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
|
@ -381,8 +381,8 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
|
|||
icmp_out_count(net, ((struct icmphdr *)
|
||||
skb_transport_header(skb))->type);
|
||||
|
||||
err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
|
||||
dst_output);
|
||||
err = NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL,
|
||||
rt->u.dst.dev, dst_output);
|
||||
if (err > 0)
|
||||
err = net_xmit_errno(err);
|
||||
if (err)
|
||||
|
|
|
|||
154
net/ipv4/route.c
154
net/ipv4/route.c
|
|
@ -129,7 +129,6 @@ static int ip_rt_gc_elasticity __read_mostly = 8;
|
|||
static int ip_rt_mtu_expires __read_mostly = 10 * 60 * HZ;
|
||||
static int ip_rt_min_pmtu __read_mostly = 512 + 20 + 20;
|
||||
static int ip_rt_min_advmss __read_mostly = 256;
|
||||
static int ip_rt_secret_interval __read_mostly = 10 * 60 * HZ;
|
||||
static int rt_chain_length_max __read_mostly = 20;
|
||||
|
||||
static struct delayed_work expires_work;
|
||||
|
|
@ -258,10 +257,9 @@ static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat);
|
|||
(__raw_get_cpu_var(rt_cache_stat).field++)
|
||||
|
||||
static inline unsigned int rt_hash(__be32 daddr, __be32 saddr, int idx,
|
||||
int genid)
|
||||
int genid)
|
||||
{
|
||||
return jhash_3words((__force u32)(__be32)(daddr),
|
||||
(__force u32)(__be32)(saddr),
|
||||
return jhash_3words((__force u32)daddr, (__force u32)saddr,
|
||||
idx, genid)
|
||||
& rt_hash_mask;
|
||||
}
|
||||
|
|
@ -378,12 +376,13 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v)
|
|||
struct rtable *r = v;
|
||||
int len;
|
||||
|
||||
seq_printf(seq, "%s\t%08lX\t%08lX\t%8X\t%d\t%u\t%d\t"
|
||||
"%08lX\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n",
|
||||
seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t"
|
||||
"%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n",
|
||||
r->u.dst.dev ? r->u.dst.dev->name : "*",
|
||||
(unsigned long)r->rt_dst, (unsigned long)r->rt_gateway,
|
||||
(__force u32)r->rt_dst,
|
||||
(__force u32)r->rt_gateway,
|
||||
r->rt_flags, atomic_read(&r->u.dst.__refcnt),
|
||||
r->u.dst.__use, 0, (unsigned long)r->rt_src,
|
||||
r->u.dst.__use, 0, (__force u32)r->rt_src,
|
||||
(dst_metric(&r->u.dst, RTAX_ADVMSS) ?
|
||||
(int)dst_metric(&r->u.dst, RTAX_ADVMSS) + 40 : 0),
|
||||
dst_metric(&r->u.dst, RTAX_WINDOW),
|
||||
|
|
@ -685,18 +684,17 @@ static inline bool rt_caching(const struct net *net)
|
|||
static inline bool compare_hash_inputs(const struct flowi *fl1,
|
||||
const struct flowi *fl2)
|
||||
{
|
||||
return (__force u32)(((fl1->nl_u.ip4_u.daddr ^ fl2->nl_u.ip4_u.daddr) |
|
||||
(fl1->nl_u.ip4_u.saddr ^ fl2->nl_u.ip4_u.saddr) |
|
||||
return ((((__force u32)fl1->nl_u.ip4_u.daddr ^ (__force u32)fl2->nl_u.ip4_u.daddr) |
|
||||
((__force u32)fl1->nl_u.ip4_u.saddr ^ (__force u32)fl2->nl_u.ip4_u.saddr) |
|
||||
(fl1->iif ^ fl2->iif)) == 0);
|
||||
}
|
||||
|
||||
static inline int compare_keys(struct flowi *fl1, struct flowi *fl2)
|
||||
{
|
||||
return ((__force u32)((fl1->nl_u.ip4_u.daddr ^ fl2->nl_u.ip4_u.daddr) |
|
||||
(fl1->nl_u.ip4_u.saddr ^ fl2->nl_u.ip4_u.saddr)) |
|
||||
return (((__force u32)fl1->nl_u.ip4_u.daddr ^ (__force u32)fl2->nl_u.ip4_u.daddr) |
|
||||
((__force u32)fl1->nl_u.ip4_u.saddr ^ (__force u32)fl2->nl_u.ip4_u.saddr) |
|
||||
(fl1->mark ^ fl2->mark) |
|
||||
(*(u16 *)&fl1->nl_u.ip4_u.tos ^
|
||||
*(u16 *)&fl2->nl_u.ip4_u.tos) |
|
||||
(*(u16 *)&fl1->nl_u.ip4_u.tos ^ *(u16 *)&fl2->nl_u.ip4_u.tos) |
|
||||
(fl1->oif ^ fl2->oif) |
|
||||
(fl1->iif ^ fl2->iif)) == 0;
|
||||
}
|
||||
|
|
@ -919,32 +917,11 @@ void rt_cache_flush_batch(void)
|
|||
rt_do_flush(!in_softirq());
|
||||
}
|
||||
|
||||
/*
|
||||
* We change rt_genid and let gc do the cleanup
|
||||
*/
|
||||
static void rt_secret_rebuild(unsigned long __net)
|
||||
{
|
||||
struct net *net = (struct net *)__net;
|
||||
rt_cache_invalidate(net);
|
||||
mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval);
|
||||
}
|
||||
|
||||
static void rt_secret_rebuild_oneshot(struct net *net)
|
||||
{
|
||||
del_timer_sync(&net->ipv4.rt_secret_timer);
|
||||
rt_cache_invalidate(net);
|
||||
if (ip_rt_secret_interval)
|
||||
mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval);
|
||||
}
|
||||
|
||||
static void rt_emergency_hash_rebuild(struct net *net)
|
||||
{
|
||||
if (net_ratelimit()) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_WARNING "Route hash chain too long!\n");
|
||||
printk(KERN_WARNING "Adjust your secret_interval!\n");
|
||||
}
|
||||
|
||||
rt_secret_rebuild_oneshot(net);
|
||||
rt_cache_invalidate(net);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -2300,8 +2277,8 @@ martian_source:
|
|||
goto e_inval;
|
||||
}
|
||||
|
||||
int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev)
|
||||
int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev, bool noref)
|
||||
{
|
||||
struct rtable * rth;
|
||||
unsigned hash;
|
||||
|
|
@ -2319,18 +2296,23 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|||
rcu_read_lock();
|
||||
for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
|
||||
rth = rcu_dereference(rth->u.dst.rt_next)) {
|
||||
if (((rth->fl.fl4_dst ^ daddr) |
|
||||
(rth->fl.fl4_src ^ saddr) |
|
||||
if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) |
|
||||
((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) |
|
||||
(rth->fl.iif ^ iif) |
|
||||
rth->fl.oif |
|
||||
(rth->fl.fl4_tos ^ tos)) == 0 &&
|
||||
rth->fl.mark == skb->mark &&
|
||||
net_eq(dev_net(rth->u.dst.dev), net) &&
|
||||
!rt_is_expired(rth)) {
|
||||
dst_use(&rth->u.dst, jiffies);
|
||||
if (noref) {
|
||||
dst_use_noref(&rth->u.dst, jiffies);
|
||||
skb_dst_set_noref(skb, &rth->u.dst);
|
||||
} else {
|
||||
dst_use(&rth->u.dst, jiffies);
|
||||
skb_dst_set(skb, &rth->u.dst);
|
||||
}
|
||||
RT_CACHE_STAT_INC(in_hit);
|
||||
rcu_read_unlock();
|
||||
skb_dst_set(skb, &rth->u.dst);
|
||||
return 0;
|
||||
}
|
||||
RT_CACHE_STAT_INC(in_hlist_search);
|
||||
|
|
@ -2373,6 +2355,7 @@ skip_cache:
|
|||
}
|
||||
return ip_route_input_slow(skb, daddr, saddr, tos, dev);
|
||||
}
|
||||
EXPORT_SYMBOL(ip_route_input_common);
|
||||
|
||||
static int __mkroute_output(struct rtable **result,
|
||||
struct fib_result *res,
|
||||
|
|
@ -3056,7 +3039,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
continue;
|
||||
if (rt_is_expired(rt))
|
||||
continue;
|
||||
skb_dst_set(skb, dst_clone(&rt->u.dst));
|
||||
skb_dst_set_noref(skb, &rt->u.dst);
|
||||
if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid,
|
||||
cb->nlh->nlmsg_seq, RTM_NEWROUTE,
|
||||
1, NLM_F_MULTI) <= 0) {
|
||||
|
|
@ -3102,48 +3085,6 @@ static int ipv4_sysctl_rtcache_flush(ctl_table *__ctl, int write,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void rt_secret_reschedule(int old)
|
||||
{
|
||||
struct net *net;
|
||||
int new = ip_rt_secret_interval;
|
||||
int diff = new - old;
|
||||
|
||||
if (!diff)
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
for_each_net(net) {
|
||||
int deleted = del_timer_sync(&net->ipv4.rt_secret_timer);
|
||||
long time;
|
||||
|
||||
if (!new)
|
||||
continue;
|
||||
|
||||
if (deleted) {
|
||||
time = net->ipv4.rt_secret_timer.expires - jiffies;
|
||||
|
||||
if (time <= 0 || (time += diff) <= 0)
|
||||
time = 0;
|
||||
} else
|
||||
time = new;
|
||||
|
||||
mod_timer(&net->ipv4.rt_secret_timer, jiffies + time);
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
static int ipv4_sysctl_rt_secret_interval(ctl_table *ctl, int write,
|
||||
void __user *buffer, size_t *lenp,
|
||||
loff_t *ppos)
|
||||
{
|
||||
int old = ip_rt_secret_interval;
|
||||
int ret = proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos);
|
||||
|
||||
rt_secret_reschedule(old);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ctl_table ipv4_route_table[] = {
|
||||
{
|
||||
.procname = "gc_thresh",
|
||||
|
|
@ -3252,13 +3193,6 @@ static ctl_table ipv4_route_table[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "secret_interval",
|
||||
.data = &ip_rt_secret_interval,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = ipv4_sysctl_rt_secret_interval,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
@ -3337,34 +3271,15 @@ static __net_initdata struct pernet_operations sysctl_route_ops = {
|
|||
};
|
||||
#endif
|
||||
|
||||
|
||||
static __net_init int rt_secret_timer_init(struct net *net)
|
||||
static __net_init int rt_genid_init(struct net *net)
|
||||
{
|
||||
atomic_set(&net->ipv4.rt_genid,
|
||||
(int) ((num_physpages ^ (num_physpages>>8)) ^
|
||||
(jiffies ^ (jiffies >> 7))));
|
||||
|
||||
net->ipv4.rt_secret_timer.function = rt_secret_rebuild;
|
||||
net->ipv4.rt_secret_timer.data = (unsigned long)net;
|
||||
init_timer_deferrable(&net->ipv4.rt_secret_timer);
|
||||
|
||||
if (ip_rt_secret_interval) {
|
||||
net->ipv4.rt_secret_timer.expires =
|
||||
jiffies + net_random() % ip_rt_secret_interval +
|
||||
ip_rt_secret_interval;
|
||||
add_timer(&net->ipv4.rt_secret_timer);
|
||||
}
|
||||
get_random_bytes(&net->ipv4.rt_genid,
|
||||
sizeof(net->ipv4.rt_genid));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __net_exit void rt_secret_timer_exit(struct net *net)
|
||||
{
|
||||
del_timer_sync(&net->ipv4.rt_secret_timer);
|
||||
}
|
||||
|
||||
static __net_initdata struct pernet_operations rt_secret_timer_ops = {
|
||||
.init = rt_secret_timer_init,
|
||||
.exit = rt_secret_timer_exit,
|
||||
static __net_initdata struct pernet_operations rt_genid_ops = {
|
||||
.init = rt_genid_init,
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -3425,9 +3340,6 @@ int __init ip_rt_init(void)
|
|||
schedule_delayed_work(&expires_work,
|
||||
net_random() % ip_rt_gc_interval + ip_rt_gc_interval);
|
||||
|
||||
if (register_pernet_subsys(&rt_secret_timer_ops))
|
||||
printk(KERN_ERR "Unable to setup rt_secret_timer\n");
|
||||
|
||||
if (ip_rt_proc_init())
|
||||
printk(KERN_ERR "Unable to create route proc files\n");
|
||||
#ifdef CONFIG_XFRM
|
||||
|
|
@ -3439,6 +3351,7 @@ int __init ip_rt_init(void)
|
|||
#ifdef CONFIG_SYSCTL
|
||||
register_pernet_subsys(&sysctl_route_ops);
|
||||
#endif
|
||||
register_pernet_subsys(&rt_genid_ops);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -3454,5 +3367,4 @@ void __init ip_static_sysctl_init(void)
|
|||
#endif
|
||||
|
||||
EXPORT_SYMBOL(__ip_select_ident);
|
||||
EXPORT_SYMBOL(ip_route_input);
|
||||
EXPORT_SYMBOL(ip_route_output_key);
|
||||
|
|
|
|||
|
|
@ -299,6 +299,13 @@ static struct ctl_table ipv4_table[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = ipv4_local_port_range,
|
||||
},
|
||||
{
|
||||
.procname = "ip_local_reserved_ports",
|
||||
.data = NULL, /* initialized in sysctl_ipv4_init */
|
||||
.maxlen = 65536,
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_do_large_bitmap,
|
||||
},
|
||||
#ifdef CONFIG_IP_MULTICAST
|
||||
{
|
||||
.procname = "igmp_max_memberships",
|
||||
|
|
@ -736,6 +743,16 @@ static __net_initdata struct pernet_operations ipv4_sysctl_ops = {
|
|||
static __init int sysctl_ipv4_init(void)
|
||||
{
|
||||
struct ctl_table_header *hdr;
|
||||
struct ctl_table *i;
|
||||
|
||||
for (i = ipv4_table; i->procname; i++) {
|
||||
if (strcmp(i->procname, "ip_local_reserved_ports") == 0) {
|
||||
i->data = sysctl_local_reserved_ports;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!i->procname)
|
||||
return -EINVAL;
|
||||
|
||||
hdr = register_sysctl_paths(net_ipv4_ctl_path, ipv4_table);
|
||||
if (hdr == NULL)
|
||||
|
|
|
|||
|
|
@ -378,7 +378,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
|||
struct sock *sk = sock->sk;
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
|
||||
sock_poll_wait(file, sk->sk_sleep, wait);
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
if (sk->sk_state == TCP_LISTEN)
|
||||
return inet_csk_listen_poll(sk);
|
||||
|
||||
|
|
@ -2215,7 +2215,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
|
|||
default:
|
||||
/* fallthru */
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
if (optlen < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
|
@ -2298,7 +2298,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
|
|||
if (sock_flag(sk, SOCK_KEEPOPEN) &&
|
||||
!((1 << sk->sk_state) &
|
||||
(TCPF_CLOSE | TCPF_LISTEN))) {
|
||||
__u32 elapsed = tcp_time_stamp - tp->rcv_tstamp;
|
||||
u32 elapsed = keepalive_time_elapsed(tp);
|
||||
if (tp->keepalive_time > elapsed)
|
||||
elapsed = tp->keepalive_time - elapsed;
|
||||
else
|
||||
|
|
@ -2721,7 +2721,7 @@ struct sk_buff **tcp_gro_receive(struct sk_buff **head, struct sk_buff *skb)
|
|||
struct tcphdr *th2;
|
||||
unsigned int len;
|
||||
unsigned int thlen;
|
||||
unsigned int flags;
|
||||
__be32 flags;
|
||||
unsigned int mss = 1;
|
||||
unsigned int hlen;
|
||||
unsigned int off;
|
||||
|
|
@ -2771,10 +2771,10 @@ struct sk_buff **tcp_gro_receive(struct sk_buff **head, struct sk_buff *skb)
|
|||
|
||||
found:
|
||||
flush = NAPI_GRO_CB(p)->flush;
|
||||
flush |= flags & TCP_FLAG_CWR;
|
||||
flush |= (flags ^ tcp_flag_word(th2)) &
|
||||
~(TCP_FLAG_CWR | TCP_FLAG_FIN | TCP_FLAG_PSH);
|
||||
flush |= th->ack_seq ^ th2->ack_seq;
|
||||
flush |= (__force int)(flags & TCP_FLAG_CWR);
|
||||
flush |= (__force int)((flags ^ tcp_flag_word(th2)) &
|
||||
~(TCP_FLAG_CWR | TCP_FLAG_FIN | TCP_FLAG_PSH));
|
||||
flush |= (__force int)(th->ack_seq ^ th2->ack_seq);
|
||||
for (i = sizeof(*th); i < thlen; i += 4)
|
||||
flush |= *(u32 *)((u8 *)th + i) ^
|
||||
*(u32 *)((u8 *)th2 + i);
|
||||
|
|
@ -2795,8 +2795,9 @@ found:
|
|||
|
||||
out_check_final:
|
||||
flush = len < mss;
|
||||
flush |= flags & (TCP_FLAG_URG | TCP_FLAG_PSH | TCP_FLAG_RST |
|
||||
TCP_FLAG_SYN | TCP_FLAG_FIN);
|
||||
flush |= (__force int)(flags & (TCP_FLAG_URG | TCP_FLAG_PSH |
|
||||
TCP_FLAG_RST | TCP_FLAG_SYN |
|
||||
TCP_FLAG_FIN));
|
||||
|
||||
if (p && (!NAPI_GRO_CB(skb)->same_flow || flush))
|
||||
pp = head;
|
||||
|
|
|
|||
|
|
@ -3710,7 +3710,7 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
|
|||
}
|
||||
|
||||
if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP))
|
||||
dst_confirm(sk->sk_dst_cache);
|
||||
dst_confirm(__sk_dst_get(sk));
|
||||
|
||||
return 1;
|
||||
|
||||
|
|
@ -3845,12 +3845,13 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
|
|||
/* 16-bit multiple */
|
||||
opt_rx->cookie_plus = opsize;
|
||||
*hvpp = ptr;
|
||||
break;
|
||||
default:
|
||||
/* ignore option */
|
||||
break;
|
||||
};
|
||||
}
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
ptr += opsize-2;
|
||||
length -= opsize;
|
||||
|
|
@ -4319,7 +4320,7 @@ static void tcp_ofo_queue(struct sock *sk)
|
|||
}
|
||||
|
||||
if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) {
|
||||
SOCK_DEBUG(sk, "ofo packet was already received \n");
|
||||
SOCK_DEBUG(sk, "ofo packet was already received\n");
|
||||
__skb_unlink(skb, &tp->out_of_order_queue);
|
||||
__kfree_skb(skb);
|
||||
continue;
|
||||
|
|
@ -4367,6 +4368,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
|
|||
if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq)
|
||||
goto drop;
|
||||
|
||||
skb_dst_drop(skb);
|
||||
__skb_pull(skb, th->doff * 4);
|
||||
|
||||
TCP_ECN_accept_cwr(tp, skb);
|
||||
|
|
@ -5833,7 +5835,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|||
if (tp->snd_una == tp->write_seq) {
|
||||
tcp_set_state(sk, TCP_FIN_WAIT2);
|
||||
sk->sk_shutdown |= SEND_SHUTDOWN;
|
||||
dst_confirm(sk->sk_dst_cache);
|
||||
dst_confirm(__sk_dst_get(sk));
|
||||
|
||||
if (!sock_flag(sk, SOCK_DEAD))
|
||||
/* Wake up lingering close() */
|
||||
|
|
|
|||
|
|
@ -519,26 +519,31 @@ out:
|
|||
sock_put(sk);
|
||||
}
|
||||
|
||||
/* This routine computes an IPv4 TCP checksum. */
|
||||
void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
|
||||
static void __tcp_v4_send_check(struct sk_buff *skb,
|
||||
__be32 saddr, __be32 daddr)
|
||||
{
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
struct tcphdr *th = tcp_hdr(skb);
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
th->check = ~tcp_v4_check(len, inet->inet_saddr,
|
||||
inet->inet_daddr, 0);
|
||||
th->check = ~tcp_v4_check(skb->len, saddr, daddr, 0);
|
||||
skb->csum_start = skb_transport_header(skb) - skb->head;
|
||||
skb->csum_offset = offsetof(struct tcphdr, check);
|
||||
} else {
|
||||
th->check = tcp_v4_check(len, inet->inet_saddr,
|
||||
inet->inet_daddr,
|
||||
th->check = tcp_v4_check(skb->len, saddr, daddr,
|
||||
csum_partial(th,
|
||||
th->doff << 2,
|
||||
skb->csum));
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine computes an IPv4 TCP checksum. */
|
||||
void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
|
||||
__tcp_v4_send_check(skb, inet->inet_saddr, inet->inet_daddr);
|
||||
}
|
||||
|
||||
int tcp_v4_gso_send_check(struct sk_buff *skb)
|
||||
{
|
||||
const struct iphdr *iph;
|
||||
|
|
@ -551,10 +556,8 @@ int tcp_v4_gso_send_check(struct sk_buff *skb)
|
|||
th = tcp_hdr(skb);
|
||||
|
||||
th->check = 0;
|
||||
th->check = ~tcp_v4_check(skb->len, iph->saddr, iph->daddr, 0);
|
||||
skb->csum_start = skb_transport_header(skb) - skb->head;
|
||||
skb->csum_offset = offsetof(struct tcphdr, check);
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
__tcp_v4_send_check(skb, iph->saddr, iph->daddr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -763,13 +766,7 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,
|
|||
skb = tcp_make_synack(sk, dst, req, rvp);
|
||||
|
||||
if (skb) {
|
||||
struct tcphdr *th = tcp_hdr(skb);
|
||||
|
||||
th->check = tcp_v4_check(skb->len,
|
||||
ireq->loc_addr,
|
||||
ireq->rmt_addr,
|
||||
csum_partial(th, skb->len,
|
||||
skb->csum));
|
||||
__tcp_v4_send_check(skb, ireq->loc_addr, ireq->rmt_addr);
|
||||
|
||||
err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr,
|
||||
ireq->rmt_addr,
|
||||
|
|
@ -894,7 +891,7 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
|
|||
kfree(newkey);
|
||||
return -ENOMEM;
|
||||
}
|
||||
sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
|
||||
sk_nocaps_add(sk, NETIF_F_GSO_MASK);
|
||||
}
|
||||
if (tcp_alloc_md5sig_pool(sk) == NULL) {
|
||||
kfree(newkey);
|
||||
|
|
@ -1024,7 +1021,7 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,
|
|||
return -EINVAL;
|
||||
|
||||
tp->md5sig_info = p;
|
||||
sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
|
||||
sk_nocaps_add(sk, NETIF_F_GSO_MASK);
|
||||
}
|
||||
|
||||
newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, sk->sk_allocation);
|
||||
|
|
@ -1289,8 +1286,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
|
|||
goto drop_and_release;
|
||||
|
||||
/* Secret recipe starts with IP addresses */
|
||||
*mess++ ^= daddr;
|
||||
*mess++ ^= saddr;
|
||||
*mess++ ^= (__force u32)daddr;
|
||||
*mess++ ^= (__force u32)saddr;
|
||||
|
||||
/* plus variable length Initiator Cookie */
|
||||
c = (u8 *)mess;
|
||||
|
|
@ -1465,7 +1462,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
|
|||
if (newkey != NULL)
|
||||
tcp_v4_md5_do_add(newsk, newinet->inet_daddr,
|
||||
newkey, key->keylen);
|
||||
newsk->sk_route_caps &= ~NETIF_F_GSO_MASK;
|
||||
sk_nocaps_add(newsk, NETIF_F_GSO_MASK);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -1675,6 +1672,8 @@ process:
|
|||
|
||||
skb->dev = NULL;
|
||||
|
||||
sock_rps_save_rxhash(sk, skb->rxhash);
|
||||
|
||||
bh_lock_sock_nested(sk);
|
||||
ret = 0;
|
||||
if (!sock_owned_by_user(sk)) {
|
||||
|
|
|
|||
|
|
@ -672,6 +672,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
|
|||
if (req->retrans < inet_csk(sk)->icsk_accept_queue.rskq_defer_accept &&
|
||||
TCP_SKB_CB(skb)->end_seq == tcp_rsk(req)->rcv_isn + 1) {
|
||||
inet_rsk(req)->acked = 1;
|
||||
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPDEFERACCEPTDROP);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -350,6 +350,7 @@ static inline void TCP_ECN_send(struct sock *sk, struct sk_buff *skb,
|
|||
*/
|
||||
static void tcp_init_nondata_skb(struct sk_buff *skb, u32 seq, u8 flags)
|
||||
{
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
skb->csum = 0;
|
||||
|
||||
TCP_SKB_CB(skb)->flags = flags;
|
||||
|
|
@ -667,7 +668,6 @@ static unsigned tcp_synack_options(struct sock *sk,
|
|||
u8 cookie_plus = (xvp != NULL && !xvp->cookie_out_never) ?
|
||||
xvp->cookie_plus :
|
||||
0;
|
||||
bool doing_ts = ireq->tstamp_ok;
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
*md5 = tcp_rsk(req)->af_specific->md5_lookup(sk, req);
|
||||
|
|
@ -680,7 +680,7 @@ static unsigned tcp_synack_options(struct sock *sk,
|
|||
* rather than TS in order to fit in better with old,
|
||||
* buggy kernels, but that was deemed to be unnecessary.
|
||||
*/
|
||||
doing_ts &= !ireq->sack_ok;
|
||||
ireq->tstamp_ok &= !ireq->sack_ok;
|
||||
}
|
||||
#else
|
||||
*md5 = NULL;
|
||||
|
|
@ -695,7 +695,7 @@ static unsigned tcp_synack_options(struct sock *sk,
|
|||
opts->options |= OPTION_WSCALE;
|
||||
remaining -= TCPOLEN_WSCALE_ALIGNED;
|
||||
}
|
||||
if (likely(doing_ts)) {
|
||||
if (likely(ireq->tstamp_ok)) {
|
||||
opts->options |= OPTION_TS;
|
||||
opts->tsval = TCP_SKB_CB(skb)->when;
|
||||
opts->tsecr = req->ts_recent;
|
||||
|
|
@ -703,7 +703,7 @@ static unsigned tcp_synack_options(struct sock *sk,
|
|||
}
|
||||
if (likely(ireq->sack_ok)) {
|
||||
opts->options |= OPTION_SACK_ADVERTISE;
|
||||
if (unlikely(!doing_ts))
|
||||
if (unlikely(!ireq->tstamp_ok))
|
||||
remaining -= TCPOLEN_SACKPERM_ALIGNED;
|
||||
}
|
||||
|
||||
|
|
@ -711,7 +711,7 @@ static unsigned tcp_synack_options(struct sock *sk,
|
|||
* If the <SYN> options fit, the same options should fit now!
|
||||
*/
|
||||
if (*md5 == NULL &&
|
||||
doing_ts &&
|
||||
ireq->tstamp_ok &&
|
||||
cookie_plus > TCPOLEN_COOKIE_BASE) {
|
||||
int need = cookie_plus; /* has TCPOLEN_COOKIE_BASE */
|
||||
|
||||
|
|
@ -860,7 +860,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
|||
th->urg_ptr = htons(tp->snd_up - tcb->seq);
|
||||
th->urg = 1;
|
||||
} else if (after(tcb->seq + 0xFFFF, tp->snd_nxt)) {
|
||||
th->urg_ptr = 0xFFFF;
|
||||
th->urg_ptr = htons(0xFFFF);
|
||||
th->urg = 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -872,13 +872,13 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
|||
#ifdef CONFIG_TCP_MD5SIG
|
||||
/* Calculate the MD5 hash, as we have all we need now */
|
||||
if (md5) {
|
||||
sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
|
||||
sk_nocaps_add(sk, NETIF_F_GSO_MASK);
|
||||
tp->af_specific->calc_md5_hash(opts.hash_location,
|
||||
md5, sk, NULL, skb);
|
||||
}
|
||||
#endif
|
||||
|
||||
icsk->icsk_af_ops->send_check(sk, skb->len, skb);
|
||||
icsk->icsk_af_ops->send_check(sk, skb);
|
||||
|
||||
if (likely(tcb->flags & TCPCB_FLAG_ACK))
|
||||
tcp_event_ack_sent(sk, tcp_skb_pcount(skb));
|
||||
|
|
@ -887,9 +887,10 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
|||
tcp_event_data_sent(tp, skb, sk);
|
||||
|
||||
if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq)
|
||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS);
|
||||
TCP_ADD_STATS(sock_net(sk), TCP_MIB_OUTSEGS,
|
||||
tcp_skb_pcount(skb));
|
||||
|
||||
err = icsk->icsk_af_ops->queue_xmit(skb, 0);
|
||||
err = icsk->icsk_af_ops->queue_xmit(skb);
|
||||
if (likely(err <= 0))
|
||||
return err;
|
||||
|
||||
|
|
@ -2484,7 +2485,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
|||
*tail-- ^= TCP_SKB_CB(skb)->seq + 1;
|
||||
|
||||
/* recommended */
|
||||
*tail-- ^= ((th->dest << 16) | th->source);
|
||||
*tail-- ^= (((__force u32)th->dest << 16) | (__force u32)th->source);
|
||||
*tail-- ^= (u32)(unsigned long)cvp; /* per sockopt */
|
||||
|
||||
sha_transform((__u32 *)&xvp->cookie_bakery[0],
|
||||
|
|
@ -2502,7 +2503,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
|||
th->window = htons(min(req->rcv_wnd, 65535U));
|
||||
tcp_options_write((__be32 *)(th + 1), tp, &opts);
|
||||
th->doff = (tcp_header_size >> 2);
|
||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS);
|
||||
TCP_ADD_STATS(sock_net(sk), TCP_MIB_OUTSEGS, tcp_skb_pcount(skb));
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
/* Okay, we have all we need - do the md5 hash if needed */
|
||||
|
|
|
|||
|
|
@ -172,14 +172,14 @@ static int tcp_write_timeout(struct sock *sk)
|
|||
|
||||
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
|
||||
if (icsk->icsk_retransmits)
|
||||
dst_negative_advice(&sk->sk_dst_cache, sk);
|
||||
dst_negative_advice(sk);
|
||||
retry_until = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries;
|
||||
} else {
|
||||
if (retransmits_timed_out(sk, sysctl_tcp_retries1)) {
|
||||
/* Black hole detection */
|
||||
tcp_mtu_probing(icsk, sk);
|
||||
|
||||
dst_negative_advice(&sk->sk_dst_cache, sk);
|
||||
dst_negative_advice(sk);
|
||||
}
|
||||
|
||||
retry_until = sysctl_tcp_retries2;
|
||||
|
|
@ -517,7 +517,7 @@ static void tcp_keepalive_timer (unsigned long data)
|
|||
struct sock *sk = (struct sock *) data;
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
__u32 elapsed;
|
||||
u32 elapsed;
|
||||
|
||||
/* Only process if socket is not in use. */
|
||||
bh_lock_sock(sk);
|
||||
|
|
@ -554,7 +554,7 @@ static void tcp_keepalive_timer (unsigned long data)
|
|||
if (tp->packets_out || tcp_send_head(sk))
|
||||
goto resched;
|
||||
|
||||
elapsed = tcp_time_stamp - tp->rcv_tstamp;
|
||||
elapsed = keepalive_time_elapsed(tp);
|
||||
|
||||
if (elapsed >= keepalive_time_when(tp)) {
|
||||
if (icsk->icsk_probes_out >= keepalive_probes(tp)) {
|
||||
|
|
|
|||
|
|
@ -233,7 +233,8 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
|
|||
*/
|
||||
do {
|
||||
if (low <= snum && snum <= high &&
|
||||
!test_bit(snum >> udptable->log, bitmap))
|
||||
!test_bit(snum >> udptable->log, bitmap) &&
|
||||
!inet_is_reserved_local_port(snum))
|
||||
goto found;
|
||||
snum += rand;
|
||||
} while (snum != first);
|
||||
|
|
@ -307,13 +308,13 @@ static int ipv4_rcv_saddr_equal(const struct sock *sk1, const struct sock *sk2)
|
|||
static unsigned int udp4_portaddr_hash(struct net *net, __be32 saddr,
|
||||
unsigned int port)
|
||||
{
|
||||
return jhash_1word(saddr, net_hash_mix(net)) ^ port;
|
||||
return jhash_1word((__force u32)saddr, net_hash_mix(net)) ^ port;
|
||||
}
|
||||
|
||||
int udp_v4_get_port(struct sock *sk, unsigned short snum)
|
||||
{
|
||||
unsigned int hash2_nulladdr =
|
||||
udp4_portaddr_hash(sock_net(sk), INADDR_ANY, snum);
|
||||
udp4_portaddr_hash(sock_net(sk), htonl(INADDR_ANY), snum);
|
||||
unsigned int hash2_partial =
|
||||
udp4_portaddr_hash(sock_net(sk), inet_sk(sk)->inet_rcv_saddr, 0);
|
||||
|
||||
|
|
@ -466,14 +467,14 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
|
|||
daddr, hnum, dif,
|
||||
hslot2, slot2);
|
||||
if (!result) {
|
||||
hash2 = udp4_portaddr_hash(net, INADDR_ANY, hnum);
|
||||
hash2 = udp4_portaddr_hash(net, htonl(INADDR_ANY), hnum);
|
||||
slot2 = hash2 & udptable->mask;
|
||||
hslot2 = &udptable->hash2[slot2];
|
||||
if (hslot->count < hslot2->count)
|
||||
goto begin;
|
||||
|
||||
result = udp4_lib_lookup2(net, saddr, sport,
|
||||
INADDR_ANY, hnum, dif,
|
||||
htonl(INADDR_ANY), hnum, dif,
|
||||
hslot2, slot2);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
|
@ -1062,10 +1063,10 @@ static unsigned int first_packet_length(struct sock *sk)
|
|||
spin_unlock_bh(&rcvq->lock);
|
||||
|
||||
if (!skb_queue_empty(&list_kill)) {
|
||||
lock_sock(sk);
|
||||
lock_sock_bh(sk);
|
||||
__skb_queue_purge(&list_kill);
|
||||
sk_mem_reclaim_partial(sk);
|
||||
release_sock(sk);
|
||||
unlock_sock_bh(sk);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
|
@ -1196,10 +1197,10 @@ out:
|
|||
return err;
|
||||
|
||||
csum_copy_err:
|
||||
lock_sock(sk);
|
||||
lock_sock_bh(sk);
|
||||
if (!skb_kill_datagram(sk, skb, flags))
|
||||
UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
|
||||
release_sock(sk);
|
||||
unlock_sock_bh(sk);
|
||||
|
||||
if (noblock)
|
||||
return -EAGAIN;
|
||||
|
|
@ -1217,6 +1218,7 @@ int udp_disconnect(struct sock *sk, int flags)
|
|||
sk->sk_state = TCP_CLOSE;
|
||||
inet->inet_daddr = 0;
|
||||
inet->inet_dport = 0;
|
||||
sock_rps_save_rxhash(sk, 0);
|
||||
sk->sk_bound_dev_if = 0;
|
||||
if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
|
||||
inet_reset_saddr(sk);
|
||||
|
|
@ -1258,8 +1260,12 @@ EXPORT_SYMBOL(udp_lib_unhash);
|
|||
|
||||
static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
int rc = sock_queue_rcv_skb(sk, skb);
|
||||
int rc;
|
||||
|
||||
if (inet_sk(sk)->inet_daddr)
|
||||
sock_rps_save_rxhash(sk, skb->rxhash);
|
||||
|
||||
rc = ip_queue_rcv_skb(sk, skb);
|
||||
if (rc < 0) {
|
||||
int is_udplite = IS_UDPLITE(sk);
|
||||
|
||||
|
|
@ -1367,6 +1373,10 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|||
goto drop;
|
||||
}
|
||||
|
||||
|
||||
if (sk_rcvqueues_full(sk, skb))
|
||||
goto drop;
|
||||
|
||||
rc = 0;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
|
|
@ -1615,9 +1625,9 @@ int udp_rcv(struct sk_buff *skb)
|
|||
|
||||
void udp_destroy_sock(struct sock *sk)
|
||||
{
|
||||
lock_sock(sk);
|
||||
lock_sock_bh(sk);
|
||||
udp_flush_pending_frames(sk);
|
||||
release_sock(sk);
|
||||
unlock_sock_bh(sk);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ static inline int xfrm4_rcv_encap_finish(struct sk_buff *skb)
|
|||
if (skb_dst(skb) == NULL) {
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
|
||||
skb->dev))
|
||||
if (ip_route_input_noref(skb, iph->daddr, iph->saddr,
|
||||
iph->tos, skb->dev))
|
||||
goto drop;
|
||||
}
|
||||
return dst_input(skb);
|
||||
|
|
@ -61,7 +61,7 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async)
|
|||
iph->tot_len = htons(skb->len);
|
||||
ip_send_check(iph);
|
||||
|
||||
NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
|
||||
NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
|
||||
xfrm4_rcv_encap_finish);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ static int xfrm4_output_finish(struct sk_buff *skb)
|
|||
|
||||
int xfrm4_output(struct sk_buff *skb)
|
||||
{
|
||||
return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb,
|
||||
return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb,
|
||||
NULL, skb_dst(skb)->dev, xfrm4_output_finish,
|
||||
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,27 +59,6 @@ static int xfrm4_get_saddr(struct net *net,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct dst_entry *
|
||||
__xfrm4_find_bundle(struct flowi *fl, struct xfrm_policy *policy)
|
||||
{
|
||||
struct dst_entry *dst;
|
||||
|
||||
read_lock_bh(&policy->lock);
|
||||
for (dst = policy->bundles; dst; dst = dst->next) {
|
||||
struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
|
||||
if (xdst->u.rt.fl.oif == fl->oif && /*XXX*/
|
||||
xdst->u.rt.fl.fl4_dst == fl->fl4_dst &&
|
||||
xdst->u.rt.fl.fl4_src == fl->fl4_src &&
|
||||
xdst->u.rt.fl.fl4_tos == fl->fl4_tos &&
|
||||
xfrm_bundle_ok(policy, xdst, fl, AF_INET, 0)) {
|
||||
dst_clone(dst);
|
||||
break;
|
||||
}
|
||||
}
|
||||
read_unlock_bh(&policy->lock);
|
||||
return dst;
|
||||
}
|
||||
|
||||
static int xfrm4_get_tos(struct flowi *fl)
|
||||
{
|
||||
return fl->fl4_tos;
|
||||
|
|
@ -259,7 +238,6 @@ static struct xfrm_policy_afinfo xfrm4_policy_afinfo = {
|
|||
.dst_ops = &xfrm4_dst_ops,
|
||||
.dst_lookup = xfrm4_dst_lookup,
|
||||
.get_saddr = xfrm4_get_saddr,
|
||||
.find_bundle = __xfrm4_find_bundle,
|
||||
.decode_session = _decode_session4,
|
||||
.get_tos = xfrm4_get_tos,
|
||||
.init_path = xfrm4_init_path,
|
||||
|
|
|
|||
Loading…
Reference in a new issue