-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter/xt_MARK.h linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter/xt_MARK.h
---- linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter/xt_MARK.h 2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter/xt_MARK.h 2009-01-12 01:18:23.000000000 +0100
-@@ -11,6 +11,7 @@ enum {
- XT_MARK_SET=0,
- XT_MARK_AND,
- XT_MARK_OR,
-+ XT_MARK_COPYXID,
- };
-
- struct xt_mark_target_info_v1 {
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter/xt_SETXID.h linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter/xt_SETXID.h
---- linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter/xt_SETXID.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter/xt_SETXID.h 2009-01-12 01:18:23.000000000 +0100
-@@ -0,0 +1,14 @@
-+#ifndef _XT_SETXID_H_target
-+#define _XT_SETXID_H_target
-+
-+/* Version 1 */
-+enum {
-+ XT_SET_PACKET_XID=0
-+};
-+
-+struct xt_setxid_target_info_v1 {
-+ unsigned long mark;
-+ u_int8_t mode;
-+};
-+
-+#endif /*_XT_SETXID_H_target*/
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter_ipv4/ipt_MARK.h linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter_ipv4/ipt_MARK.h
---- linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter_ipv4/ipt_MARK.h 2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter_ipv4/ipt_MARK.h 2009-01-12 01:18:23.000000000 +0100
-@@ -12,6 +12,7 @@
- #define IPT_MARK_SET XT_MARK_SET
- #define IPT_MARK_AND XT_MARK_AND
- #define IPT_MARK_OR XT_MARK_OR
-+#define IPT_MARK_COPYXID XT_MARK_COPYXID
-
- #define ipt_mark_target_info_v1 xt_mark_target_info_v1
-
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter_ipv4/ipt_SETXID.h linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter_ipv4/ipt_SETXID.h
---- linux-2.6.27.10-vs2.3.x-P/include/linux/netfilter_ipv4/ipt_SETXID.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.27.10-vs2.3.x-P522/include/linux/netfilter_ipv4/ipt_SETXID.h 2009-01-12 01:18:23.000000000 +0100
-@@ -0,0 +1,13 @@
-+#ifndef _IPT_SETXID_H_target
-+#define _IPT_SETXID_H_target
-+
-+/* Backwards compatibility for old userspace */
-+
-+#include <linux/netfilter/xt_SETXID.h>
-+
-+/* Version 1 */
-+#define IPT_SET_PACKET_XID XT_SET_PACKET_XID
-+
-+#define ipt_setxid_target_info_v1 xt_setxid_target_info_v1
-+
-+#endif /*_IPT_SETXID_H_target*/
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/include/net/netfilter/nf_conntrack.h linux-2.6.27.10-vs2.3.x-P522/include/net/netfilter/nf_conntrack.h
---- linux-2.6.27.10-vs2.3.x-P/include/net/netfilter/nf_conntrack.h 2008-10-13 14:52:09.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/include/net/netfilter/nf_conntrack.h 2009-01-12 01:59:20.000000000 +0100
-@@ -121,6 +121,9 @@ struct nf_conn
- /* Storage reserved for other modules: */
- union nf_conntrack_proto proto;
-
-+ /* PLANETLAB. VNET-specific */
-+ int xid[IP_CT_DIR_MAX];
-+
- /* Extensions */
- struct nf_ct_ext *ext;
-
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/net/netfilter/Kconfig linux-2.6.27.10-vs2.3.x-P522/net/netfilter/Kconfig
---- linux-2.6.27.10-vs2.3.x-P/net/netfilter/Kconfig 2008-10-13 14:52:09.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/net/netfilter/Kconfig 2009-01-12 01:18:23.000000000 +0100
-@@ -477,6 +477,13 @@ config NETFILTER_XT_TARGET_TCPOPTSTRIP
- This option adds a "TCPOPTSTRIP" target, which allows you to strip
- TCP options from TCP packets.
-
-+config NETFILTER_XT_TARGET_SETXID
-+ tristate '"SETXID" target support'
-+ depends on NETFILTER_XTABLES
-+ help
-+ This option adds a `SETXID' target, which allows you to alter the
-+ xid of a socket.
-+
- config NETFILTER_XT_MATCH_COMMENT
- tristate '"comment" match support'
- depends on NETFILTER_XTABLES
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/net/netfilter/Makefile linux-2.6.27.10-vs2.3.x-P522/net/netfilter/Makefile
---- linux-2.6.27.10-vs2.3.x-P/net/netfilter/Makefile 2008-10-13 14:52:09.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/net/netfilter/Makefile 2009-01-12 01:18:23.000000000 +0100
-@@ -38,6 +38,7 @@ obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_co
- obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o
-
- # targets
-+obj-$(CONFIG_NETFILTER_XT_TARGET_SETXID) += xt_SETXID.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIFY) += xt_CLASSIFY.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMARK) += xt_CONNMARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/net/netfilter/nf_conntrack_core.c linux-2.6.27.10-vs2.3.x-P522/net/netfilter/nf_conntrack_core.c
---- linux-2.6.27.10-vs2.3.x-P/net/netfilter/nf_conntrack_core.c 2008-10-13 14:52:09.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/net/netfilter/nf_conntrack_core.c 2009-01-12 02:01:55.000000000 +0100
-@@ -595,6 +595,9 @@ init_conntrack(const struct nf_conntrack
- /* Overload tuple linked list to put us in unconfirmed list. */
- hlist_add_head(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnode, &unconfirmed);
-
-+ conntrack->xid[IP_CT_DIR_ORIGINAL] = -1;
-+ conntrack->xid[IP_CT_DIR_REPLY] = -1;
-+
- spin_unlock_bh(&nf_conntrack_lock);
-
- if (exp) {
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/net/netfilter/xt_MARK.c linux-2.6.27.10-vs2.3.x-P522/net/netfilter/xt_MARK.c
---- linux-2.6.27.10-vs2.3.x-P/net/netfilter/xt_MARK.c 2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.27.10-vs2.3.x-P522/net/netfilter/xt_MARK.c 2009-01-12 02:20:38.000000000 +0100
-@@ -8,13 +8,19 @@
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-+ *
- */
-
+diff -Nurb linux-2.6.27-521/net/netfilter/xt_MARK.c linux-2.6.27-522/net/netfilter/xt_MARK.c
+--- linux-2.6.27-521/net/netfilter/xt_MARK.c 2008-10-09 18:13:53.000000000 -0400
++++ linux-2.6.27-522/net/netfilter/xt_MARK.c 2009-06-02 11:12:59.000000000 -0400
+@@ -13,7 +13,13 @@
#include <linux/module.h>
-+#include <linux/version.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
+#include <net/udp.h>
#include <net/checksum.h>
+#include <net/route.h>
+#include <net/inet_hashtables.h>
-
++#include <net/net_namespace.h>
++
+#include <net/netfilter/nf_conntrack.h>
+
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter/xt_MARK.h>
-
-@@ -24,6 +30,50 @@ MODULE_DESCRIPTION("Xtables: packet mark
+@@ -24,6 +30,8 @@
MODULE_ALIAS("ipt_MARK");
MODULE_ALIAS("ip6t_MARK");
++extern DEFINE_PER_CPU(int, sknid_elevator);
++
+ static unsigned int
+ mark_tg_v0(struct sk_buff *skb, const struct net_device *in,
+ const struct net_device *out, unsigned int hooknum,
+@@ -61,14 +69,242 @@
+ return XT_CONTINUE;
+ }
+
+#define PEERCRED_SET(x) ((x!=0) && (x!=(unsigned int)-1))
+
++
+static inline u_int16_t
+get_dst_port(struct nf_conntrack_tuple *tuple)
+{
+ switch (tuple->dst.protonum) {
+ case IPPROTO_GRE:
+ /* XXX Truncate 32-bit GRE key to 16 bits */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+ return tuple->dst.u.gre.key;
-+#else
-+ return htons(ntohl(tuple->dst.u.gre.key));
-+#endif
+ case IPPROTO_ICMP:
+ /* Bind on ICMP echo ID */
+ return tuple->src.u.icmp.id;
+ return tuple->src.u.all;
+ }
+}
-+
- static unsigned int
- mark_tg_v0(struct sk_buff *skb, const struct net_device *in,
- const struct net_device *out, unsigned int hooknum,
-@@ -35,13 +85,88 @@ mark_tg_v0(struct sk_buff *skb, const st
- return XT_CONTINUE;
- }
-
-+extern DEFINE_PER_CPU(int, sknid_elevator);
+
+static struct sock *__udp4_lib_lookup(__be32 saddr, __be16 sport,
+ __be32 daddr, __be16 dport,
+ read_unlock(&udp_hash_lock);
+ return result;
+}
-+
-+#define related(ct) (ct==(IP_CT_IS_REPLY + IP_CT_RELATED))
-+
static unsigned int
- mark_tg_v1(struct sk_buff *skb, const struct net_device *in,
- const struct net_device *out, unsigned int hooknum,
- const struct xt_target *target, const void *targinfo)
+ mark_tg(struct sk_buff *skb, const struct net_device *in,
+ const struct net_device *out, unsigned int hooknum,
+ const struct xt_target *target, const void *targinfo)
{
- const struct xt_mark_target_info_v1 *markinfo = targinfo;
-- int mark = 0;
-+ enum ip_conntrack_info ctinfo;
-+ struct sock *connection_sk;
-+ int dif;
-+ struct nf_conn *ct;
-+ extern struct inet_hashinfo tcp_hashinfo;
-+ enum ip_conntrack_dir dir;
-+ int *curtag;
-+ u_int32_t src_ip;
-+ u_int32_t dst_ip;
-+ u_int16_t proto, src_port;
-+ u_int32_t ip;
-+ u_int16_t port;
-+
-+ int mark = -1;
-
- switch (markinfo->mode) {
- case XT_MARK_SET:
-@@ -55,9 +180,119 @@ mark_tg_v1(struct sk_buff *skb, const st
- case XT_MARK_OR:
- mark = skb->mark | markinfo->mark;
- break;
-+
-+ case XT_MARK_COPYXID:
-+ dif = ((struct rtable *)(*pskb)->dst)->rt_iif;
-+
-+ ct = nf_ct_get((*pskb), &ctinfo);
-+ if (!ct)
-+ break;
-+
-+ dir = CTINFO2DIR(ctinfo);
-+ src_ip = ct->tuplehash[dir].tuple.src.u3.ip;
-+ dst_ip = ct->tuplehash[dir].tuple.dst.u3.ip;
-+ src_port = get_src_port(&ct->tuplehash[dir].tuple);
-+ proto = ct->tuplehash[dir].tuple.dst.protonum;
-+
-+ ip = ct->tuplehash[dir].tuple.dst.u3.ip;
-+ port = get_dst_port(&ct->tuplehash[dir].tuple);
-+
-+ if (proto == 1) {
-+ if ((*pskb)->mark > 0)
-+ /* The packet is marked, it's going out */
-+ ct->xid[0] = (*pskb)->mark;
-+
-+ if (ct->xid[0] > 0)
-+ mark = ct->xid[0];
-+ }
-+ else if (proto == 17) {
-+ struct sock *sk;
-+ if (!(*pskb)->mark) {
-+ sk = __udp4_lib_lookup(src_ip, src_port,
-+ ip, port, dif, udp_hash);
-+
-+ if (sk && hooknum == NF_IP_LOCAL_IN)
-+ mark = sk->sk_nid;
-+
-+ if (sk)
-+ sock_put(sk);
-+ }
-+ else if ((*pskb)->mark > 0)
-+ /* The packet is marked, it's going out */
-+ ct->xid[0] = (*pskb)->mark;
-+ }
-+ else if (proto == 6) /* TCP */{
-+ int sockettype = 0; /* Established socket */
-+
-+ /* Looks for an established socket or a listening
-+ socket corresponding to the 4-tuple, in that order.
-+ The order is important for Codemux connections
-+ to be handled properly */
-+
-+ connection_sk = inet_lookup_established(&tcp_hashinfo,
-+ src_ip, src_port, ip, port, dif);
-+
-+ if (!connection_sk) {
-+ connection_sk = inet_lookup_listener(&tcp_hashinfo,
-+ ip, port, dif);
-+ sockettype = 1; /* Listening socket */
-+ }
-+
-+ if (connection_sk) {
-+ /* The peercred is not set. We set it if the other side has an xid. */
-+ if (!PEERCRED_SET(connection_sk->sk_peercred.uid)
-+ && ct->xid[!dir] > 0 && (sockettype == 0)) {
-+ connection_sk->sk_peercred.gid =
-+ connection_sk->sk_peercred.uid = ct->xid[!dir];
-+ }
-+
-+ /* The peercred is set, and is not equal to the XID of 'the other side' */
-+ else if (PEERCRED_SET(connection_sk->sk_peercred.uid) &&
-+ (connection_sk->sk_peercred.uid != ct->xid[!dir]) &&
-+ (sockettype == 0)) {
-+ mark = connection_sk->sk_peercred.uid;
-+ }
-+
-+ /* Has this connection already been tagged? */
-+ if (ct->xid[dir] < 1) {
-+ /* No - let's tag it */
-+ ct->xid[dir]=connection_sk->sk_nid;
-+ }
-+
-+ if (mark == -1 && (ct->xid[dir] != 0))
-+ mark = ct->xid[dir];
-+
-+ if (connection_sk->sk_state == TCP_TIME_WAIT) {
-+ inet_twsk_put(inet_twsk(connection_sk));
-+ break;
-+ } else
-+ sock_put(connection_sk);
-+ }
-+
-+ /* All else failed. Is this a connection over raw sockets?
-+ That explains why we couldn't get anything out of skb->sk,
-+ or look up a "real" connection. */
-+ if (ct->xid[dir] < 1) {
-+ if ((*pskb)->skb_tag)
-+ ct->xid[dir] = (*pskb)->skb_tag;
-+ }
-+
-+ /* Covers CoDemux case */
-+ if (mark < 1 && (ct->xid[dir] > 0))
-+ mark = ct->xid[dir];
-+
-+ if (mark < 1 && (ct->xid[!dir] > 0))
-+ mark = ct->xid[!dir];
-+ break;
-+ }
- }
-+ if (mark != -1)
-+ skb->mark = mark;
+ const struct xt_mark_tginfo2 *info = targinfo;
++ long mark = -1;
++ enum ip_conntrack_info ctinfo;
++ struct sock *connection_sk;
++ int dif;
++ struct nf_conn *ct;
++ extern struct inet_hashinfo tcp_hashinfo;
++ enum ip_conntrack_dir dir;
++ int *curtag;
++ u_int32_t src_ip;
++ u_int32_t dst_ip;
++ u_int16_t proto, src_port;
++ u_int32_t ip;
++ u_int16_t port;
++
++ if (info->mark == ~0U) {
++ /* copy-xid */
++ dif = ((struct rtable *)(skb->dst))->rt_iif;
++
++ ct = nf_ct_get(skb, &ctinfo);
++ if (!ct)
++ goto out_mark_finish;
++
++ dir = CTINFO2DIR(ctinfo);
++ src_ip = ct->tuplehash[dir].tuple.src.u3.ip;
++ dst_ip = ct->tuplehash[dir].tuple.dst.u3.ip;
++ src_port = get_src_port(&ct->tuplehash[dir].tuple);
++ proto = ct->tuplehash[dir].tuple.dst.protonum;
++
++ ip = ct->tuplehash[dir].tuple.dst.u3.ip;
++ port = get_dst_port(&ct->tuplehash[dir].tuple);
++
++ if (proto == 1) {
++ if (skb->mark > 0)
++ /* The packet is marked, it's going out */
++ ct->xid[0] = skb->mark;
++
++ if (ct->xid[0] > 0)
++ mark = ct->xid[0];
++ }
++ else if (proto == 17) {
++ struct sock *sk;
++ if (!skb->mark) {
++ sk = __udp4_lib_lookup(src_ip, src_port,
++ ip, port, dif, udp_hash);
+
-+ curtag = &__get_cpu_var(sknid_elevator);
-+ if (mark > 0 && *curtag == -2 && hooknum == NF_IP_LOCAL_IN)
-+ *curtag = mark;
++ if (sk && hooknum == NF_INET_LOCAL_IN)
++ mark = sk->sk_nid;
++
++ if (sk)
++ sock_put(sk);
++ }
++ else if (skb->mark > 0)
++ /* The packet is marked, it's going out */
++ ct->xid[0] = skb->mark;
++ }
++ else if (proto == 6) /* TCP */{
++ int sockettype = 0; /* Established socket */
++ struct net *net = &init_net;
++
++ /* Looks for an established socket or a listening
++ socket corresponding to the 4-tuple, in that order.
++ The order is important for Codemux connections
++ to be handled properly */
++
++ connection_sk = inet_lookup_established(net,
++ &tcp_hashinfo, src_ip, src_port, ip, port, dif);
++
++ if (!connection_sk) {
++ connection_sk = inet_lookup_listener(net,
++ &tcp_hashinfo, ip, port, dif);
++ sockettype = 1; /* Listening socket */
++ }
++
++ if (connection_sk) {
++ /* The peercred is not set. We set it if the other side has an xid. */
++ if (!PEERCRED_SET(connection_sk->sk_peercred.uid)
++ && ct->xid[!dir] > 0 && (sockettype == 0)) {
++ connection_sk->sk_peercred.gid =
++ connection_sk->sk_peercred.uid = ct->xid[!dir];
++ }
++
++ /* The peercred is set, and is not equal to the XID of 'the other side' */
++ else if (PEERCRED_SET(connection_sk->sk_peercred.uid) &&
++ (connection_sk->sk_peercred.uid != ct->xid[!dir]) &&
++ (sockettype == 0)) {
++ mark = connection_sk->sk_peercred.uid;
++ }
++
++ /* Has this connection already been tagged? */
++ if (ct->xid[dir] < 1) {
++ /* No - let's tag it */
++ ct->xid[dir]=connection_sk->sk_nid;
++ }
++
++ if (mark == -1 && (ct->xid[dir] != 0))
++ mark = ct->xid[dir];
++
++ if (connection_sk->sk_state == TCP_TIME_WAIT) {
++ inet_twsk_put(inet_twsk(connection_sk));
++ goto out_mark_finish;
++ } else
++ sock_put(connection_sk);
++ }
++
++ /* All else failed. Is this a connection over raw sockets?
++ That explains why we couldn't get anything out of skb->sk,
++ or look up a "real" connection. */
++ if (ct->xid[dir] < 1) {
++ if (skb->skb_tag)
++ ct->xid[dir] = skb->skb_tag;
++ }
++
++ /* Covers CoDemux case */
++ if (mark < 1 && (ct->xid[dir] > 0))
++ mark = ct->xid[dir];
++
++ if (mark < 1 && (ct->xid[!dir] > 0))
++ mark = ct->xid[!dir];
++ goto out_mark_finish;
++ }
++ }
++ else
++ mark = (skb->mark & ~info->mask) ^ info->mark;
++
++out_mark_finish:
++ if (mark != -1)
++ skb->mark = mark;
++
++ curtag = &__get_cpu_var(sknid_elevator);
++ if (mark > 0 && *curtag == -2 && hooknum == NF_INET_LOCAL_IN)
++ *curtag = mark;
-- skb->mark = mark;
+- skb->mark = (skb->mark & ~info->mask) ^ info->mark;
return XT_CONTINUE;
}
-@@ -95,7 +330,8 @@ mark_tg_check_v1(const char *tablename,
-
- if (markinfo->mode != XT_MARK_SET
- && markinfo->mode != XT_MARK_AND
-- && markinfo->mode != XT_MARK_OR) {
-+ && markinfo->mode != XT_MARK_OR
-+ && markinfo->mode != XT_MARK_COPYXID) {
- printk(KERN_WARNING "MARK: unknown mode %u\n",
- markinfo->mode);
- return false;
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/net/netfilter/xt_SETXID.c linux-2.6.27.10-vs2.3.x-P522/net/netfilter/xt_SETXID.c
---- linux-2.6.27.10-vs2.3.x-P/net/netfilter/xt_SETXID.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.27.10-vs2.3.x-P522/net/netfilter/xt_SETXID.c 2009-01-12 01:18:23.000000000 +0100
-@@ -0,0 +1,79 @@
+diff -Nurb linux-2.6.27-521/net/netfilter/xt_MARK.c.orig linux-2.6.27-522/net/netfilter/xt_MARK.c.orig
+--- linux-2.6.27-521/net/netfilter/xt_MARK.c.orig 1969-12-31 19:00:00.000000000 -0500
++++ linux-2.6.27-522/net/netfilter/xt_MARK.c.orig 2009-06-02 10:14:55.000000000 -0400
+@@ -0,0 +1,381 @@
++/*
++ * xt_MARK - Netfilter module to modify the NFMARK field of an skb
++ *
++ * (C) 1999-2001 Marc Boucher <marc@mbsi.ca>
++ * Copyright © CC Computer Consultants GmbH, 2007 - 2008
++ * Jan Engelhardt <jengelh@computergmbh.de>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/ip.h>
+#include <net/checksum.h>
-+#include <linux/vs_network.h>
+
+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_SETXID.h>
++#include <linux/netfilter/xt_MARK.h>
+
+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("");
-+MODULE_DESCRIPTION("");
-+MODULE_ALIAS("ipt_SETXID");
++MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
++MODULE_DESCRIPTION("Xtables: packet mark modification");
++MODULE_ALIAS("ipt_MARK");
++MODULE_ALIAS("ip6t_MARK");
++
++static unsigned int
++mark_tg_v0(struct sk_buff *skb, const struct net_device *in,
++ const struct net_device *out, unsigned int hooknum,
++ const struct xt_target *target, const void *targinfo)
++{
++ const struct xt_mark_target_info *markinfo = targinfo;
++
++ skb->mark = markinfo->mark;
++ return XT_CONTINUE;
++}
+
+static unsigned int
-+target_v1(struct sk_buff **pskb,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ unsigned int hooknum,
-+ const struct xt_target *target,
-+ const void *targinfo)
++mark_tg_v1(struct sk_buff *skb, const struct net_device *in,
++ const struct net_device *out, unsigned int hooknum,
++ const struct xt_target *target, const void *targinfo)
+{
-+ const struct xt_setxid_target_info_v1 *setxidinfo = targinfo;
++ const struct xt_mark_target_info_v1 *markinfo = targinfo;
++ int mark = 0;
++
++ switch (markinfo->mode) {
++ case XT_MARK_SET:
++ mark = markinfo->mark;
++ break;
++
++ case XT_MARK_AND:
++ mark = skb->mark & markinfo->mark;
++ break;
+
-+ switch (setxidinfo->mode) {
-+ case XT_SET_PACKET_XID:
-+ (*pskb)->skb_tag = setxidinfo->mark;
++ case XT_MARK_OR:
++ mark = skb->mark | markinfo->mark;
+ break;
+ }
++
++ skb->mark = mark;
+ return XT_CONTINUE;
+}
+
++static unsigned int
++mark_tg(struct sk_buff *skb, const struct net_device *in,
++ const struct net_device *out, unsigned int hooknum,
++ const struct xt_target *target, const void *targinfo)
++{
++ const struct xt_mark_tginfo2 *info = targinfo;
++ long mark = -1;
++
++ if (info->mark == ~0U) {
++ /* copy-xid */
++ enum ip_conntrack_info ctinfo;
++ struct sock *connection_sk;
++ int dif;
++ struct nf_conn *ct;
++ extern struct inet_hashinfo tcp_hashinfo;
++ enum ip_conntrack_dir dir;
++ int *curtag;
++ u_int32_t src_ip;
++ u_int32_t dst_ip;
++ u_int16_t proto, src_port;
++ u_int32_t ip;
++ u_int16_t port;
++
++ dif = ((struct rtable *)(skb->dst))->rt_iif;
++
++ ct = nf_ct_get(skb, &ctinfo);
++ if (!ct)
++ break;
++
++ dir = CTINFO2DIR(ctinfo);
++ src_ip = ct->tuplehash[dir].tuple.src.u3.ip;
++ dst_ip = ct->tuplehash[dir].tuple.dst.u3.ip;
++ src_port = get_src_port(&ct->tuplehash[dir].tuple);
++ proto = ct->tuplehash[dir].tuple.dst.protonum;
++
++ ip = ct->tuplehash[dir].tuple.dst.u3.ip;
++ port = get_dst_port(&ct->tuplehash[dir].tuple);
++
++ if (proto == 1) {
++ if (skb->mark > 0)
++ /* The packet is marked, it's going out */
++ ct->xid[0] = skb->mark;
++
++ if (ct->xid[0] > 0)
++ mark = ct->xid[0];
++ }
++ else if (proto == 17) {
++ struct sock *sk;
++ if (!skb->mark) {
++ sk = __udp4_lib_lookup(src_ip, src_port,
++ ip, port, dif, udp_hash);
++
++ if (sk && hooknum == NF_INET_LOCAL_IN)
++ mark = sk->sk_nid;
++
++ if (sk)
++ sock_put(sk);
++ }
++ else if (skb->mark > 0)
++ /* The packet is marked, it's going out */
++ ct->xid[0] = skb->mark;
++ }
++ else if (proto == 6) /* TCP */{
++ int sockettype = 0; /* Established socket */
++ struct net *net = &init_net;
++
++ /* Looks for an established socket or a listening
++ socket corresponding to the 4-tuple, in that order.
++ The order is important for Codemux connections
++ to be handled properly */
++
++ connection_sk = inet_lookup_established(net,
++ &tcp_hashinfo, src_ip, src_port, ip, port, dif);
++
++ if (!connection_sk) {
++ connection_sk = inet_lookup_listener(net,
++ &tcp_hashinfo, ip, port, dif);
++ sockettype = 1; /* Listening socket */
++ }
++
++ if (connection_sk) {
++ /* The peercred is not set. We set it if the other side has an xid. */
++ if (!PEERCRED_SET(connection_sk->sk_peercred.uid)
++ && ct->xid[!dir] > 0 && (sockettype == 0)) {
++ connection_sk->sk_peercred.gid =
++ connection_sk->sk_peercred.uid = ct->xid[!dir];
++ }
++
++ /* The peercred is set, and is not equal to the XID of 'the other side' */
++ else if (PEERCRED_SET(connection_sk->sk_peercred.uid) &&
++ (connection_sk->sk_peercred.uid != ct->xid[!dir]) &&
++ (sockettype == 0)) {
++ mark = connection_sk->sk_peercred.uid;
++ }
++
++ /* Has this connection already been tagged? */
++ if (ct->xid[dir] < 1) {
++ /* No - let's tag it */
++ ct->xid[dir]=connection_sk->sk_nid;
++ }
++
++ if (mark == -1 && (ct->xid[dir] != 0))
++ mark = ct->xid[dir];
++
++ if (connection_sk->sk_state == TCP_TIME_WAIT) {
++ inet_twsk_put(inet_twsk(connection_sk));
++ break;
++ } else
++ sock_put(connection_sk);
++ }
++
++ /* All else failed. Is this a connection over raw sockets?
++ That explains why we couldn't get anything out of skb->sk,
++ or look up a "real" connection. */
++ if (ct->xid[dir] < 1) {
++ if (skb->skb_tag)
++ ct->xid[dir] = skb->skb_tag;
++ }
++
++ /* Covers CoDemux case */
++ if (mark < 1 && (ct->xid[dir] > 0))
++ mark = ct->xid[dir];
++
++ if (mark < 1 && (ct->xid[!dir] > 0))
++ mark = ct->xid[!dir];
++ break;
++ }
++ }
++ else
++ mark = (skb->mark & ~info->mask) ^ info->mark;
++
++ if (mark != -1)
++ skb->mark = mark;
++
++ curtag = &__get_cpu_var(sknid_elevator);
++ if (mark > 0 && *curtag == -2 && hooknum == NF_INET_LOCAL_IN)
++ *curtag = mark;
+
-+static int
-+checkentry_v1(const char *tablename,
-+ const void *entry,
-+ const struct xt_target *target,
-+ void *targinfo,
-+ unsigned int hook_mask)
++ return XT_CONTINUE;
++}
++
++static bool
++mark_tg_check_v0(const char *tablename, const void *entry,
++ const struct xt_target *target, void *targinfo,
++ unsigned int hook_mask)
+{
-+ struct xt_setxid_target_info_v1 *setxidinfo = targinfo;
++ const struct xt_mark_target_info *markinfo = targinfo;
++
++ if (markinfo->mark > 0xffffffff) {
++ printk(KERN_WARNING "MARK: Only supports 32bit wide mark\n");
++ return false;
++ }
++ return true;
++}
+
-+ if (setxidinfo->mode != XT_SET_PACKET_XID) {
-+ printk(KERN_WARNING "SETXID: unknown mode %u\n",
-+ setxidinfo->mode);
-+ return 0;
++static bool
++mark_tg_check_v1(const char *tablename, const void *entry,
++ const struct xt_target *target, void *targinfo,
++ unsigned int hook_mask)
++{
++ const struct xt_mark_target_info_v1 *markinfo = targinfo;
++
++ if (markinfo->mode != XT_MARK_SET
++ && markinfo->mode != XT_MARK_AND
++ && markinfo->mode != XT_MARK_OR) {
++ printk(KERN_WARNING "MARK: unknown mode %u\n",
++ markinfo->mode);
++ return false;
++ }
++ if (markinfo->mark > 0xffffffff) {
++ printk(KERN_WARNING "MARK: Only supports 32bit wide mark\n");
++ return false;
+ }
++ return true;
++}
++
++#ifdef CONFIG_COMPAT
++struct compat_xt_mark_target_info {
++ compat_ulong_t mark;
++};
++
++static void mark_tg_compat_from_user_v0(void *dst, void *src)
++{
++ const struct compat_xt_mark_target_info *cm = src;
++ struct xt_mark_target_info m = {
++ .mark = cm->mark,
++ };
++ memcpy(dst, &m, sizeof(m));
++}
++
++static int mark_tg_compat_to_user_v0(void __user *dst, void *src)
++{
++ const struct xt_mark_target_info *m = src;
++ struct compat_xt_mark_target_info cm = {
++ .mark = m->mark,
++ };
++ return copy_to_user(dst, &cm, sizeof(cm)) ? -EFAULT : 0;
++}
++
++struct compat_xt_mark_target_info_v1 {
++ compat_ulong_t mark;
++ u_int8_t mode;
++ u_int8_t __pad1;
++ u_int16_t __pad2;
++};
++
++static void mark_tg_compat_from_user_v1(void *dst, void *src)
++{
++ const struct compat_xt_mark_target_info_v1 *cm = src;
++ struct xt_mark_target_info_v1 m = {
++ .mark = cm->mark,
++ .mode = cm->mode,
++ };
++ memcpy(dst, &m, sizeof(m));
++}
+
-+ return 1;
++static int mark_tg_compat_to_user_v1(void __user *dst, void *src)
++{
++ const struct xt_mark_target_info_v1 *m = src;
++ struct compat_xt_mark_target_info_v1 cm = {
++ .mark = m->mark,
++ .mode = m->mode,
++ };
++ return copy_to_user(dst, &cm, sizeof(cm)) ? -EFAULT : 0;
+}
++#endif /* CONFIG_COMPAT */
+
-+static struct xt_target xt_setxid_target[] = {
++static struct xt_target mark_tg_reg[] __read_mostly = {
+ {
-+ .name = "SETXID",
++ .name = "MARK",
++ .family = AF_INET,
++ .revision = 0,
++ .checkentry = mark_tg_check_v0,
++ .target = mark_tg_v0,
++ .targetsize = sizeof(struct xt_mark_target_info),
++#ifdef CONFIG_COMPAT
++ .compatsize = sizeof(struct compat_xt_mark_target_info),
++ .compat_from_user = mark_tg_compat_from_user_v0,
++ .compat_to_user = mark_tg_compat_to_user_v0,
++#endif
++ .table = "mangle",
++ .me = THIS_MODULE,
++ },
++ {
++ .name = "MARK",
+ .family = AF_INET,
+ .revision = 1,
-+ .checkentry = checkentry_v1,
-+ .target = target_v1,
-+ .targetsize = sizeof(struct xt_setxid_target_info_v1),
++ .checkentry = mark_tg_check_v1,
++ .target = mark_tg_v1,
++ .targetsize = sizeof(struct xt_mark_target_info_v1),
++#ifdef CONFIG_COMPAT
++ .compatsize = sizeof(struct compat_xt_mark_target_info_v1),
++ .compat_from_user = mark_tg_compat_from_user_v1,
++ .compat_to_user = mark_tg_compat_to_user_v1,
++#endif
+ .table = "mangle",
+ .me = THIS_MODULE,
-+ }
++ },
++ {
++ .name = "MARK",
++ .family = AF_INET6,
++ .revision = 0,
++ .checkentry = mark_tg_check_v0,
++ .target = mark_tg_v0,
++ .targetsize = sizeof(struct xt_mark_target_info),
++#ifdef CONFIG_COMPAT
++ .compatsize = sizeof(struct compat_xt_mark_target_info),
++ .compat_from_user = mark_tg_compat_from_user_v0,
++ .compat_to_user = mark_tg_compat_to_user_v0,
++#endif
++ .table = "mangle",
++ .me = THIS_MODULE,
++ },
++ {
++ .name = "MARK",
++ .family = AF_INET6,
++ .revision = 1,
++ .checkentry = mark_tg_check_v1,
++ .target = mark_tg_v1,
++ .targetsize = sizeof(struct xt_mark_target_info_v1),
++#ifdef CONFIG_COMPAT
++ .compatsize = sizeof(struct compat_xt_mark_target_info_v1),
++ .compat_from_user = mark_tg_compat_from_user_v1,
++ .compat_to_user = mark_tg_compat_to_user_v1,
++#endif
++ .table = "mangle",
++ .me = THIS_MODULE,
++ },
++ {
++ .name = "MARK",
++ .revision = 2,
++ .family = AF_INET,
++ .target = mark_tg,
++ .targetsize = sizeof(struct xt_mark_tginfo2),
++ .me = THIS_MODULE,
++ },
++ {
++ .name = "MARK",
++ .revision = 2,
++ .family = AF_INET6,
++ .target = mark_tg,
++ .targetsize = sizeof(struct xt_mark_tginfo2),
++ .me = THIS_MODULE,
++ },
+};
+
-+static int __init init(void)
++static int __init mark_tg_init(void)
+{
-+ int err;
-+
-+ err = xt_register_targets(xt_setxid_target, ARRAY_SIZE(xt_setxid_target));
-+ return err;
++ return xt_register_targets(mark_tg_reg, ARRAY_SIZE(mark_tg_reg));
+}
+
-+static void __exit fini(void)
++static void __exit mark_tg_exit(void)
+{
-+ xt_unregister_targets(xt_setxid_target, ARRAY_SIZE(xt_setxid_target));
++ xt_unregister_targets(mark_tg_reg, ARRAY_SIZE(mark_tg_reg));
+}
+
-+module_init(init);
-+module_exit(fini);
-
-; fixup
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-PS-02.0/net/netfilter/nf_conntrack_core.c linux-2.6.27.10-vs2.3.x-PS-02.1/net/netfilter/nf_conntrack_core.c
---- linux-2.6.27.10-vs2.3.x-PS-02.0/net/netfilter/nf_conntrack_core.c 2009-01-25 02:29:31.000000000 +0100
-+++ linux-2.6.27.10-vs2.3.x-PS-02.1/net/netfilter/nf_conntrack_core.c 2009-01-24 23:22:04.000000000 +0100
-@@ -595,8 +595,8 @@ init_conntrack(const struct nf_conntrack
- /* Overload tuple linked list to put us in unconfirmed list. */
- hlist_add_head(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnode, &unconfirmed);
-
-- conntrack->xid[IP_CT_DIR_ORIGINAL] = -1;
-- conntrack->xid[IP_CT_DIR_REPLY] = -1;
-+ ct->xid[IP_CT_DIR_ORIGINAL] = -1;
-+ ct->xid[IP_CT_DIR_REPLY] = -1;
-
- spin_unlock_bh(&nf_conntrack_lock);
-
-diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-PS-02.0/net/netfilter/xt_MARK.c linux-2.6.27.10-vs2.3.x-PS-02.1/net/netfilter/xt_MARK.c
---- linux-2.6.27.10-vs2.3.x-PS-02.0/net/netfilter/xt_MARK.c 2009-01-25 02:29:31.000000000 +0100
-+++ linux-2.6.27.10-vs2.3.x-PS-02.1/net/netfilter/xt_MARK.c 2009-01-25 00:06:34.000000000 +0100
-@@ -19,6 +19,7 @@
- #include <net/checksum.h>
- #include <net/route.h>
- #include <net/inet_hashtables.h>
-+#include <net/net_namespace.h>
-
- #include <net/netfilter/nf_conntrack.h>
- #include <linux/netfilter/x_tables.h>
-@@ -182,9 +183,9 @@ mark_tg_v1(struct sk_buff *skb, const st
- break;
-
- case XT_MARK_COPYXID:
-- dif = ((struct rtable *)(*pskb)->dst)->rt_iif;
-+ dif = ((struct rtable *)(skb->dst))->rt_iif;
-
-- ct = nf_ct_get((*pskb), &ctinfo);
-+ ct = nf_ct_get(skb, &ctinfo);
- if (!ct)
- break;
-
-@@ -198,43 +199,44 @@ mark_tg_v1(struct sk_buff *skb, const st
- port = get_dst_port(&ct->tuplehash[dir].tuple);
-
- if (proto == 1) {
-- if ((*pskb)->mark > 0)
-+ if (skb->mark > 0)
- /* The packet is marked, it's going out */
-- ct->xid[0] = (*pskb)->mark;
-+ ct->xid[0] = skb->mark;
-
- if (ct->xid[0] > 0)
- mark = ct->xid[0];
- }
- else if (proto == 17) {
- struct sock *sk;
-- if (!(*pskb)->mark) {
-+ if (!skb->mark) {
- sk = __udp4_lib_lookup(src_ip, src_port,
- ip, port, dif, udp_hash);
-
-- if (sk && hooknum == NF_IP_LOCAL_IN)
-+ if (sk && hooknum == NF_INET_LOCAL_IN)
- mark = sk->sk_nid;
-
- if (sk)
- sock_put(sk);
- }
-- else if ((*pskb)->mark > 0)
-+ else if (skb->mark > 0)
- /* The packet is marked, it's going out */
-- ct->xid[0] = (*pskb)->mark;
-+ ct->xid[0] = skb->mark;
- }
- else if (proto == 6) /* TCP */{
- int sockettype = 0; /* Established socket */
-+ struct net *net = &init_net;
-
- /* Looks for an established socket or a listening
- socket corresponding to the 4-tuple, in that order.
- The order is important for Codemux connections
- to be handled properly */
-
-- connection_sk = inet_lookup_established(&tcp_hashinfo,
-- src_ip, src_port, ip, port, dif);
-+ connection_sk = inet_lookup_established(net,
-+ &tcp_hashinfo, src_ip, src_port, ip, port, dif);
-
- if (!connection_sk) {
-- connection_sk = inet_lookup_listener(&tcp_hashinfo,
-- ip, port, dif);
-+ connection_sk = inet_lookup_listener(net,
-+ &tcp_hashinfo, ip, port, dif);
- sockettype = 1; /* Listening socket */
- }
-
-@@ -273,8 +275,8 @@ mark_tg_v1(struct sk_buff *skb, const st
- That explains why we couldn't get anything out of skb->sk,
- or look up a "real" connection. */
- if (ct->xid[dir] < 1) {
-- if ((*pskb)->skb_tag)
-- ct->xid[dir] = (*pskb)->skb_tag;
-+ if (skb->skb_tag)
-+ ct->xid[dir] = skb->skb_tag;
- }
-
- /* Covers CoDemux case */
-@@ -290,7 +292,7 @@ mark_tg_v1(struct sk_buff *skb, const st
- skb->mark = mark;
-
- curtag = &__get_cpu_var(sknid_elevator);
-- if (mark > 0 && *curtag == -2 && hooknum == NF_IP_LOCAL_IN)
-+ if (mark > 0 && *curtag == -2 && hooknum == NF_INET_LOCAL_IN)
- *curtag = mark;
-
- return XT_CONTINUE;
++module_init(mark_tg_init);
++module_exit(mark_tg_exit);
+diff -Nurb linux-2.6.27-521/scripts/basic/.docproc.cmd linux-2.6.27-522/scripts/basic/.docproc.cmd
+--- linux-2.6.27-521/scripts/basic/.docproc.cmd 1969-12-31 19:00:00.000000000 -0500
++++ linux-2.6.27-522/scripts/basic/.docproc.cmd 2009-06-02 10:59:54.000000000 -0400
+@@ -0,0 +1,68 @@
++cmd_scripts/basic/docproc := gcc -Wp,-MD,scripts/basic/.docproc.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/docproc scripts/basic/docproc.c
++
++deps_scripts/basic/docproc := \
++ scripts/basic/docproc.c \
++ /usr/include/stdio.h \
++ /usr/include/features.h \
++ /usr/include/sys/cdefs.h \
++ /usr/include/bits/wordsize.h \
++ /usr/include/gnu/stubs.h \
++ /usr/include/gnu/stubs-32.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/stddef.h \
++ /usr/include/bits/types.h \
++ /usr/include/bits/typesizes.h \
++ /usr/include/libio.h \
++ /usr/include/_G_config.h \
++ /usr/include/wchar.h \
++ /usr/include/bits/wchar.h \
++ /usr/include/gconv.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/stdarg.h \
++ /usr/include/bits/stdio_lim.h \
++ /usr/include/bits/sys_errlist.h \
++ /usr/include/bits/stdio.h \
++ /usr/include/stdlib.h \
++ /usr/include/sys/types.h \
++ /usr/include/time.h \
++ /usr/include/endian.h \
++ /usr/include/bits/endian.h \
++ /usr/include/sys/select.h \
++ /usr/include/bits/select.h \
++ /usr/include/bits/sigset.h \
++ /usr/include/bits/time.h \
++ /usr/include/sys/sysmacros.h \
++ /usr/include/bits/pthreadtypes.h \
++ /usr/include/alloca.h \
++ /usr/include/string.h \
++ /usr/include/bits/string.h \
++ /usr/include/bits/string2.h \
++ /usr/include/ctype.h \
++ /usr/include/unistd.h \
++ /usr/include/bits/posix_opt.h \
++ /usr/include/bits/confname.h \
++ /usr/include/getopt.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/limits.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/syslimits.h \
++ /usr/include/limits.h \
++ /usr/include/bits/posix1_lim.h \
++ /usr/include/bits/local_lim.h \
++ /usr/include/linux/limits.h \
++ /usr/include/bits/posix2_lim.h \
++ /usr/include/sys/wait.h \
++ /usr/include/signal.h \
++ /usr/include/bits/signum.h \
++ /usr/include/bits/siginfo.h \
++ /usr/include/bits/sigaction.h \
++ /usr/include/bits/sigcontext.h \
++ /usr/include/asm/sigcontext.h \
++ /usr/include/asm/types.h \
++ /usr/include/asm-generic/int-ll64.h \
++ /usr/include/bits/sigstack.h \
++ /usr/include/bits/sigthread.h \
++ /usr/include/sys/resource.h \
++ /usr/include/bits/resource.h \
++ /usr/include/bits/waitflags.h \
++ /usr/include/bits/waitstatus.h \
++
++scripts/basic/docproc: $(deps_scripts/basic/docproc)
++
++$(deps_scripts/basic/docproc):
+diff -Nurb linux-2.6.27-521/scripts/basic/.fixdep.cmd linux-2.6.27-522/scripts/basic/.fixdep.cmd
+--- linux-2.6.27-521/scripts/basic/.fixdep.cmd 1969-12-31 19:00:00.000000000 -0500
++++ linux-2.6.27-522/scripts/basic/.fixdep.cmd 2009-06-02 10:59:54.000000000 -0400
+@@ -0,0 +1,76 @@
++cmd_scripts/basic/fixdep := gcc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/fixdep scripts/basic/fixdep.c
++
++deps_scripts/basic/fixdep := \
++ scripts/basic/fixdep.c \
++ $(wildcard include/config/his/driver.h) \
++ $(wildcard include/config/my/option.h) \
++ $(wildcard include/config/.h) \
++ $(wildcard include/config/foo.h) \
++ $(wildcard include/config/boom.h) \
++ /usr/include/sys/types.h \
++ /usr/include/features.h \
++ /usr/include/sys/cdefs.h \
++ /usr/include/bits/wordsize.h \
++ /usr/include/gnu/stubs.h \
++ /usr/include/gnu/stubs-32.h \
++ /usr/include/bits/types.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/stddef.h \
++ /usr/include/bits/typesizes.h \
++ /usr/include/time.h \
++ /usr/include/endian.h \
++ /usr/include/bits/endian.h \
++ /usr/include/sys/select.h \
++ /usr/include/bits/select.h \
++ /usr/include/bits/sigset.h \
++ /usr/include/bits/time.h \
++ /usr/include/sys/sysmacros.h \
++ /usr/include/bits/pthreadtypes.h \
++ /usr/include/sys/stat.h \
++ /usr/include/bits/stat.h \
++ /usr/include/sys/mman.h \
++ /usr/include/bits/mman.h \
++ /usr/include/unistd.h \
++ /usr/include/bits/posix_opt.h \
++ /usr/include/bits/confname.h \
++ /usr/include/getopt.h \
++ /usr/include/fcntl.h \
++ /usr/include/bits/fcntl.h \
++ /usr/include/string.h \
++ /usr/include/bits/string.h \
++ /usr/include/bits/string2.h \
++ /usr/include/stdlib.h \
++ /usr/include/alloca.h \
++ /usr/include/stdio.h \
++ /usr/include/libio.h \
++ /usr/include/_G_config.h \
++ /usr/include/wchar.h \
++ /usr/include/bits/wchar.h \
++ /usr/include/gconv.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/stdarg.h \
++ /usr/include/bits/stdio_lim.h \
++ /usr/include/bits/sys_errlist.h \
++ /usr/include/bits/stdio.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/limits.h \
++ /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/syslimits.h \
++ /usr/include/limits.h \
++ /usr/include/bits/posix1_lim.h \
++ /usr/include/bits/local_lim.h \
++ /usr/include/linux/limits.h \
++ /usr/include/bits/posix2_lim.h \
++ /usr/include/ctype.h \
++ /usr/include/arpa/inet.h \
++ /usr/include/netinet/in.h \
++ /usr/include/stdint.h \
++ /usr/include/sys/socket.h \
++ /usr/include/sys/uio.h \
++ /usr/include/bits/uio.h \
++ /usr/include/bits/socket.h \
++ /usr/include/bits/sockaddr.h \
++ /usr/include/asm/socket.h \
++ /usr/include/asm/sockios.h \
++ /usr/include/bits/in.h \
++ /usr/include/bits/byteswap.h \
++
++scripts/basic/fixdep: $(deps_scripts/basic/fixdep)
++
++$(deps_scripts/basic/fixdep):
+Files linux-2.6.27-521/scripts/basic/docproc and linux-2.6.27-522/scripts/basic/docproc differ
+Files linux-2.6.27-521/scripts/basic/fixdep and linux-2.6.27-522/scripts/basic/fixdep differ