|
@@ -141,136 +141,6 @@ void nf_unregister_sockopt(struct nf_sockopt_ops *reg)
|
|
|
up(&nf_sockopt_mutex);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_NETFILTER_DEBUG
|
|
|
-#include <net/ip.h>
|
|
|
-#include <net/tcp.h>
|
|
|
-#include <linux/netfilter_ipv4.h>
|
|
|
-
|
|
|
-static void debug_print_hooks_ip(unsigned int nf_debug)
|
|
|
-{
|
|
|
- if (nf_debug & (1 << NF_IP_PRE_ROUTING)) {
|
|
|
- printk("PRE_ROUTING ");
|
|
|
- nf_debug ^= (1 << NF_IP_PRE_ROUTING);
|
|
|
- }
|
|
|
- if (nf_debug & (1 << NF_IP_LOCAL_IN)) {
|
|
|
- printk("LOCAL_IN ");
|
|
|
- nf_debug ^= (1 << NF_IP_LOCAL_IN);
|
|
|
- }
|
|
|
- if (nf_debug & (1 << NF_IP_FORWARD)) {
|
|
|
- printk("FORWARD ");
|
|
|
- nf_debug ^= (1 << NF_IP_FORWARD);
|
|
|
- }
|
|
|
- if (nf_debug & (1 << NF_IP_LOCAL_OUT)) {
|
|
|
- printk("LOCAL_OUT ");
|
|
|
- nf_debug ^= (1 << NF_IP_LOCAL_OUT);
|
|
|
- }
|
|
|
- if (nf_debug & (1 << NF_IP_POST_ROUTING)) {
|
|
|
- printk("POST_ROUTING ");
|
|
|
- nf_debug ^= (1 << NF_IP_POST_ROUTING);
|
|
|
- }
|
|
|
- if (nf_debug)
|
|
|
- printk("Crap bits: 0x%04X", nf_debug);
|
|
|
- printk("\n");
|
|
|
-}
|
|
|
-
|
|
|
-static void nf_dump_skb(int pf, struct sk_buff *skb)
|
|
|
-{
|
|
|
- printk("skb: pf=%i %s dev=%s len=%u\n",
|
|
|
- pf,
|
|
|
- skb->sk ? "(owned)" : "(unowned)",
|
|
|
- skb->dev ? skb->dev->name : "(no dev)",
|
|
|
- skb->len);
|
|
|
- switch (pf) {
|
|
|
- case PF_INET: {
|
|
|
- const struct iphdr *ip = skb->nh.iph;
|
|
|
- __u32 *opt = (__u32 *) (ip + 1);
|
|
|
- int opti;
|
|
|
- __u16 src_port = 0, dst_port = 0;
|
|
|
-
|
|
|
- if (ip->protocol == IPPROTO_TCP
|
|
|
- || ip->protocol == IPPROTO_UDP) {
|
|
|
- struct tcphdr *tcp=(struct tcphdr *)((__u32 *)ip+ip->ihl);
|
|
|
- src_port = ntohs(tcp->source);
|
|
|
- dst_port = ntohs(tcp->dest);
|
|
|
- }
|
|
|
-
|
|
|
- printk("PROTO=%d %u.%u.%u.%u:%hu %u.%u.%u.%u:%hu"
|
|
|
- " L=%hu S=0x%2.2hX I=%hu F=0x%4.4hX T=%hu",
|
|
|
- ip->protocol, NIPQUAD(ip->saddr),
|
|
|
- src_port, NIPQUAD(ip->daddr),
|
|
|
- dst_port,
|
|
|
- ntohs(ip->tot_len), ip->tos, ntohs(ip->id),
|
|
|
- ntohs(ip->frag_off), ip->ttl);
|
|
|
-
|
|
|
- for (opti = 0; opti < (ip->ihl - sizeof(struct iphdr) / 4); opti++)
|
|
|
- printk(" O=0x%8.8X", *opt++);
|
|
|
- printk("\n");
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void nf_debug_ip_local_deliver(struct sk_buff *skb)
|
|
|
-{
|
|
|
- /* If it's a loopback packet, it must have come through
|
|
|
- * NF_IP_LOCAL_OUT, NF_IP_RAW_INPUT, NF_IP_PRE_ROUTING and
|
|
|
- * NF_IP_LOCAL_IN. Otherwise, must have gone through
|
|
|
- * NF_IP_RAW_INPUT and NF_IP_PRE_ROUTING. */
|
|
|
- if (!skb->dev) {
|
|
|
- printk("ip_local_deliver: skb->dev is NULL.\n");
|
|
|
- } else {
|
|
|
- if (skb->nf_debug != ((1<<NF_IP_PRE_ROUTING)
|
|
|
- | (1<<NF_IP_LOCAL_IN))) {
|
|
|
- printk("ip_local_deliver: bad skb: ");
|
|
|
- debug_print_hooks_ip(skb->nf_debug);
|
|
|
- nf_dump_skb(PF_INET, skb);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void nf_debug_ip_loopback_xmit(struct sk_buff *newskb)
|
|
|
-{
|
|
|
- if (newskb->nf_debug != ((1 << NF_IP_LOCAL_OUT)
|
|
|
- | (1 << NF_IP_POST_ROUTING))) {
|
|
|
- printk("ip_dev_loopback_xmit: bad owned skb = %p: ",
|
|
|
- newskb);
|
|
|
- debug_print_hooks_ip(newskb->nf_debug);
|
|
|
- nf_dump_skb(PF_INET, newskb);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void nf_debug_ip_finish_output2(struct sk_buff *skb)
|
|
|
-{
|
|
|
- /* If it's owned, it must have gone through the
|
|
|
- * NF_IP_LOCAL_OUT and NF_IP_POST_ROUTING.
|
|
|
- * Otherwise, must have gone through
|
|
|
- * NF_IP_PRE_ROUTING, NF_IP_FORWARD and NF_IP_POST_ROUTING.
|
|
|
- */
|
|
|
- if (skb->sk) {
|
|
|
- if (skb->nf_debug != ((1 << NF_IP_LOCAL_OUT)
|
|
|
- | (1 << NF_IP_POST_ROUTING))) {
|
|
|
- printk("ip_finish_output: bad owned skb = %p: ", skb);
|
|
|
- debug_print_hooks_ip(skb->nf_debug);
|
|
|
- nf_dump_skb(PF_INET, skb);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (skb->nf_debug != ((1 << NF_IP_PRE_ROUTING)
|
|
|
- | (1 << NF_IP_FORWARD)
|
|
|
- | (1 << NF_IP_POST_ROUTING))) {
|
|
|
- /* Fragments, entunnelled packets, TCP RSTs
|
|
|
- generated by ipt_REJECT will have no
|
|
|
- owners, but still may be local */
|
|
|
- if (skb->nf_debug != ((1 << NF_IP_LOCAL_OUT)
|
|
|
- | (1 << NF_IP_POST_ROUTING))){
|
|
|
- printk("ip_finish_output:"
|
|
|
- " bad unowned skb = %p: ",skb);
|
|
|
- debug_print_hooks_ip(skb->nf_debug);
|
|
|
- nf_dump_skb(PF_INET, skb);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-#endif /*CONFIG_NETFILTER_DEBUG*/
|
|
|
-
|
|
|
/* Call get/setsockopt() */
|
|
|
static int nf_sockopt(struct sock *sk, int pf, int val,
|
|
|
char __user *opt, int *len, int get)
|
|
@@ -488,14 +358,6 @@ int nf_hook_slow(int pf, unsigned int hook, struct sk_buff **pskb,
|
|
|
/* We may already have this, but read-locks nest anyway */
|
|
|
rcu_read_lock();
|
|
|
|
|
|
-#ifdef CONFIG_NETFILTER_DEBUG
|
|
|
- if (unlikely((*pskb)->nf_debug & (1 << hook))) {
|
|
|
- printk("nf_hook: hook %i already set.\n", hook);
|
|
|
- nf_dump_skb(pf, *pskb);
|
|
|
- }
|
|
|
- (*pskb)->nf_debug |= (1 << hook);
|
|
|
-#endif
|
|
|
-
|
|
|
elem = &nf_hooks[pf][hook];
|
|
|
next_hook:
|
|
|
verdict = nf_iterate(&nf_hooks[pf][hook], pskb, hook, indev,
|