Commit 7a303cfd authored by David S. Miller's avatar David S. Miller

Merge http://linux-mh.bkbits.net/bluetooth-2.6

into nuts.davemloft.net:/disk1/BK/net-2.6
parents 12bcbdd3 b8dcfacc
...@@ -1798,7 +1798,7 @@ S: Maintained ...@@ -1798,7 +1798,7 @@ S: Maintained
PPP OVER ETHERNET PPP OVER ETHERNET
P: Michal Ostrowski P: Michal Ostrowski
M: mostrows@styx.uwaterloo.ca M: mostrows@speakeasy.net
S: Maintained S: Maintained
PREEMPTIBLE KERNEL PREEMPTIBLE KERNEL
......
...@@ -238,8 +238,9 @@ void iounmap(volatile void __iomem *addr) ...@@ -238,8 +238,9 @@ void iounmap(volatile void __iomem *addr)
} }
if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) { if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) {
/* p->size includes the guard page, but cpa doesn't like that */
change_page_attr(virt_to_page(__va(p->phys_addr)), change_page_attr(virt_to_page(__va(p->phys_addr)),
p->size >> PAGE_SHIFT, (p->size - PAGE_SIZE) >> PAGE_SHIFT,
PAGE_KERNEL); PAGE_KERNEL);
global_flush_tlb(); global_flush_tlb();
} }
......
...@@ -198,9 +198,6 @@ int __init setup_early_printk(char *opt) ...@@ -198,9 +198,6 @@ int __init setup_early_printk(char *opt)
early_console = &early_serial_console; early_console = &early_serial_console;
} else if (!strncmp(buf, "vga", 3)) { } else if (!strncmp(buf, "vga", 3)) {
early_console = &early_vga_console; early_console = &early_vga_console;
} else {
early_console = NULL;
return -1;
} }
early_console_initialized = 1; early_console_initialized = 1;
register_console(early_console); register_console(early_console);
......
...@@ -917,7 +917,7 @@ void __init trap_init(void) ...@@ -917,7 +917,7 @@ void __init trap_init(void)
set_intr_gate(0,&divide_error); set_intr_gate(0,&divide_error);
set_intr_gate_ist(1,&debug,DEBUG_STACK); set_intr_gate_ist(1,&debug,DEBUG_STACK);
set_intr_gate_ist(2,&nmi,NMI_STACK); set_intr_gate_ist(2,&nmi,NMI_STACK);
set_intr_gate(3,&int3); set_system_gate(3,&int3);
set_system_gate(4,&overflow); /* int4-5 can be called from all */ set_system_gate(4,&overflow); /* int4-5 can be called from all */
set_system_gate(5,&bounds); set_system_gate(5,&bounds);
set_intr_gate(6,&invalid_op); set_intr_gate(6,&invalid_op);
......
...@@ -265,8 +265,9 @@ void iounmap(volatile void __iomem *addr) ...@@ -265,8 +265,9 @@ void iounmap(volatile void __iomem *addr)
unmap_vm_area(p); unmap_vm_area(p);
if ((p->flags >> 20) && if ((p->flags >> 20) &&
p->phys_addr + p->size - 1 < virt_to_phys(high_memory)) { p->phys_addr + p->size - 1 < virt_to_phys(high_memory)) {
/* p->size includes the guard page, but cpa doesn't like that */
change_page_attr(virt_to_page(__va(p->phys_addr)), change_page_attr(virt_to_page(__va(p->phys_addr)),
p->size >> PAGE_SHIFT, (p->size - PAGE_SIZE) >> PAGE_SHIFT,
PAGE_KERNEL); PAGE_KERNEL);
global_flush_tlb(); global_flush_tlb();
} }
......
...@@ -60,8 +60,8 @@ ...@@ -60,8 +60,8 @@
#define DRV_MODULE_NAME "tg3" #define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": " #define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "3.17" #define DRV_MODULE_VERSION "3.18"
#define DRV_MODULE_RELDATE "January 22, 2005" #define DRV_MODULE_RELDATE "January 24, 2005"
#define TG3_DEF_MAC_MODE 0 #define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0 #define TG3_DEF_RX_MODE 0
...@@ -3111,11 +3111,19 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3111,11 +3111,19 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb->nh.iph->check = 0; skb->nh.iph->check = 0;
skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len); skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
skb->nh.iph->daddr, skb->h.th->check = 0;
0, IPPROTO_TCP, 0); base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
}
else {
skb->h.th->check =
~csum_tcpudp_magic(skb->nh.iph->saddr,
skb->nh.iph->daddr,
0, IPPROTO_TCP, 0);
}
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
if (tcp_opt_len || skb->nh.iph->ihl > 5) { if (tcp_opt_len || skb->nh.iph->ihl > 5) {
int tsflags; int tsflags;
...@@ -3182,7 +3190,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3182,7 +3190,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
would_hit_hwbug = entry + 1; would_hit_hwbug = entry + 1;
} }
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
tg3_set_txd(tp, entry, mapping, len, tg3_set_txd(tp, entry, mapping, len,
base_flags, (i == last)|(mss << 1)); base_flags, (i == last)|(mss << 1));
else else
...@@ -4774,7 +4782,7 @@ static int tg3_load_tso_firmware(struct tg3 *tp) ...@@ -4774,7 +4782,7 @@ static int tg3_load_tso_firmware(struct tg3 *tp)
unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
int err, i; int err, i;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
return 0; return 0;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
...@@ -5208,7 +5216,7 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -5208,7 +5216,7 @@ static int tg3_reset_hw(struct tg3 *tp)
} }
#if TG3_TSO_SUPPORT != 0 #if TG3_TSO_SUPPORT != 0
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
rdmac_mode |= (1 << 27); rdmac_mode |= (1 << 27);
#endif #endif
...@@ -5358,7 +5366,7 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -5358,7 +5366,7 @@ static int tg3_reset_hw(struct tg3 *tp)
tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ); tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ);
tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE); tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
#if TG3_TSO_SUPPORT != 0 #if TG3_TSO_SUPPORT != 0
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8); tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
#endif #endif
tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE); tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE);
...@@ -7867,6 +7875,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) ...@@ -7867,6 +7875,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
tp->pci_hdr_type = (cacheline_sz_reg >> 16) & 0xff; tp->pci_hdr_type = (cacheline_sz_reg >> 16) & 0xff;
tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff; tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
tp->tg3_flags2 |= TG3_FLG2_HW_TSO;
if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
...@@ -8762,11 +8773,13 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, ...@@ -8762,11 +8773,13 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
} }
#if TG3_TSO_SUPPORT != 0 #if TG3_TSO_SUPPORT != 0
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
}
else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 && (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750)) {
tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
} else { } else {
tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
......
...@@ -2105,6 +2105,7 @@ struct tg3 { ...@@ -2105,6 +2105,7 @@ struct tg3 {
#define TG3_FLG2_PHY_SERDES 0x00002000 #define TG3_FLG2_PHY_SERDES 0x00002000
#define TG3_FLG2_CAPACITIVE_COUPLING 0x00004000 #define TG3_FLG2_CAPACITIVE_COUPLING 0x00004000
#define TG3_FLG2_FLASH 0x00008000 #define TG3_FLG2_FLASH 0x00008000
#define TG3_FLG2_HW_TSO 0x00010000
u32 split_mode_max_reqs; u32 split_mode_max_reqs;
#define SPLIT_MODE_5704_MAX_REQ 3 #define SPLIT_MODE_5704_MAX_REQ 3
......
...@@ -113,6 +113,7 @@ static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -113,6 +113,7 @@ static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
/* Queue packet */ /* Queue packet */
skb_queue_tail(&tun->readq, skb); skb_queue_tail(&tun->readq, skb);
dev->trans_start = jiffies;
/* Notify and wake up reader process */ /* Notify and wake up reader process */
if (tun->flags & TUN_FASYNC) if (tun->flags & TUN_FASYNC)
...@@ -259,6 +260,7 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, ...@@ -259,6 +260,7 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv,
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
netif_rx_ni(skb); netif_rx_ni(skb);
tun->dev->last_rx = jiffies;
tun->stats.rx_packets++; tun->stats.rx_packets++;
tun->stats.rx_bytes += len; tun->stats.rx_bytes += len;
......
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_NUMA
#define NODES_SHIFT 6 #define NODES_SHIFT 6
#else
#define NODES_SHIFT 0
#endif
#endif #endif
...@@ -122,33 +122,6 @@ do { \ ...@@ -122,33 +122,6 @@ do { \
#define IP_NF_ASSERT(x) #define IP_NF_ASSERT(x)
#endif #endif
struct ip_conntrack_expect
{
/* Internal linked list (global expectation list) */
struct list_head list;
/* We expect this tuple, with the following mask */
struct ip_conntrack_tuple tuple, mask;
/* Function to call after setup and insertion */
void (*expectfn)(struct ip_conntrack *new,
struct ip_conntrack_expect *this);
/* The conntrack of the master connection */
struct ip_conntrack *master;
/* Timer function; deletes the expectation. */
struct timer_list timeout;
#ifdef CONFIG_IP_NF_NAT_NEEDED
/* This is the original per-proto part, used to map the
* expected connection the way the recipient expects. */
union ip_conntrack_manip_proto saved_proto;
/* Direction relative to the master connection. */
enum ip_conntrack_dir dir;
#endif
};
struct ip_conntrack_counter struct ip_conntrack_counter
{ {
u_int64_t packets; u_int64_t packets;
...@@ -206,6 +179,33 @@ struct ip_conntrack ...@@ -206,6 +179,33 @@ struct ip_conntrack
struct ip_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]; struct ip_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX];
}; };
struct ip_conntrack_expect
{
/* Internal linked list (global expectation list) */
struct list_head list;
/* We expect this tuple, with the following mask */
struct ip_conntrack_tuple tuple, mask;
/* Function to call after setup and insertion */
void (*expectfn)(struct ip_conntrack *new,
struct ip_conntrack_expect *this);
/* The conntrack of the master connection */
struct ip_conntrack *master;
/* Timer function; deletes the expectation. */
struct timer_list timeout;
#ifdef CONFIG_IP_NF_NAT_NEEDED
/* This is the original per-proto part, used to map the
* expected connection the way the recipient expects. */
union ip_conntrack_manip_proto saved_proto;
/* Direction relative to the master connection. */
enum ip_conntrack_dir dir;
#endif
};
static inline struct ip_conntrack * static inline struct ip_conntrack *
tuplehash_to_ctrack(const struct ip_conntrack_tuple_hash *hash) tuplehash_to_ctrack(const struct ip_conntrack_tuple_hash *hash)
{ {
...@@ -301,6 +301,7 @@ struct ip_conntrack_stat ...@@ -301,6 +301,7 @@ struct ip_conntrack_stat
#define CONNTRACK_STAT_INC(count) (__get_cpu_var(ip_conntrack_stat).count++) #define CONNTRACK_STAT_INC(count) (__get_cpu_var(ip_conntrack_stat).count++)
#ifdef CONFIG_IP_NF_NAT_NEEDED
static inline int ip_nat_initialized(struct ip_conntrack *conntrack, static inline int ip_nat_initialized(struct ip_conntrack *conntrack,
enum ip_nat_manip_type manip) enum ip_nat_manip_type manip)
{ {
...@@ -308,5 +309,7 @@ static inline int ip_nat_initialized(struct ip_conntrack *conntrack, ...@@ -308,5 +309,7 @@ static inline int ip_nat_initialized(struct ip_conntrack *conntrack,
return test_bit(IPS_SRC_NAT_DONE_BIT, &conntrack->status); return test_bit(IPS_SRC_NAT_DONE_BIT, &conntrack->status);
return test_bit(IPS_DST_NAT_DONE_BIT, &conntrack->status); return test_bit(IPS_DST_NAT_DONE_BIT, &conntrack->status);
} }
#endif /* CONFIG_IP_NF_NAT_NEEDED */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _IP_CONNTRACK_H */ #endif /* _IP_CONNTRACK_H */
...@@ -13,7 +13,7 @@ struct tftphdr { ...@@ -13,7 +13,7 @@ struct tftphdr {
#define TFTP_OPCODE_ACK 4 #define TFTP_OPCODE_ACK 4
#define TFTP_OPCODE_ERROR 5 #define TFTP_OPCODE_ERROR 5
unsigned int (*ip_nat_tftp_hook)(struct sk_buff **pskb, extern unsigned int (*ip_nat_tftp_hook)(struct sk_buff **pskb,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
struct ip_conntrack_expect *exp); struct ip_conntrack_expect *exp);
......
...@@ -22,11 +22,32 @@ ...@@ -22,11 +22,32 @@
#define IPT_CONNTRACK_STATUS 0x40 #define IPT_CONNTRACK_STATUS 0x40
#define IPT_CONNTRACK_EXPIRES 0x80 #define IPT_CONNTRACK_EXPIRES 0x80
/* This is exposed to userspace, so remains frozen in time. */
struct ip_conntrack_old_tuple
{
struct {
__u32 ip;
union {
__u16 all;
} u;
} src;
struct {
__u32 ip;
union {
__u16 all;
} u;
/* The protocol. */
u16 protonum;
} dst;
};
struct ipt_conntrack_info struct ipt_conntrack_info
{ {
unsigned int statemask, statusmask; unsigned int statemask, statusmask;
struct ip_conntrack_tuple tuple[IP_CT_DIR_MAX]; struct ip_conntrack_old_tuple tuple[IP_CT_DIR_MAX];
struct in_addr sipmsk[IP_CT_DIR_MAX], dipmsk[IP_CT_DIR_MAX]; struct in_addr sipmsk[IP_CT_DIR_MAX], dipmsk[IP_CT_DIR_MAX];
unsigned long expires_min, expires_max; unsigned long expires_min, expires_max;
......
...@@ -25,5 +25,6 @@ struct ipt_multiport_v1 ...@@ -25,5 +25,6 @@ struct ipt_multiport_v1
u_int8_t count; /* Number of ports */ u_int8_t count; /* Number of ports */
u_int16_t ports[IPT_MULTI_PORTS]; /* Ports */ u_int16_t ports[IPT_MULTI_PORTS]; /* Ports */
u_int8_t pflags[IPT_MULTI_PORTS]; /* Port flags */ u_int8_t pflags[IPT_MULTI_PORTS]; /* Port flags */
u_int8_t invert; /* Invert flag */
}; };
#endif /*_IPT_MULTIPORT_H*/ #endif /*_IPT_MULTIPORT_H*/
...@@ -53,6 +53,13 @@ static inline int is_kernel_text(unsigned long addr) ...@@ -53,6 +53,13 @@ static inline int is_kernel_text(unsigned long addr)
return in_gate_area_no_task(addr); return in_gate_area_no_task(addr);
} }
static inline int is_kernel(unsigned long addr)
{
if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end)
return 1;
return in_gate_area_no_task(addr);
}
/* expand a compressed symbol data into the resulting uncompressed string, /* expand a compressed symbol data into the resulting uncompressed string,
given the offset to where the symbol is in the compressed stream */ given the offset to where the symbol is in the compressed stream */
static unsigned int kallsyms_expand_symbol(unsigned int off, char *result) static unsigned int kallsyms_expand_symbol(unsigned int off, char *result)
...@@ -153,7 +160,8 @@ const char *kallsyms_lookup(unsigned long addr, ...@@ -153,7 +160,8 @@ const char *kallsyms_lookup(unsigned long addr,
namebuf[KSYM_NAME_LEN] = 0; namebuf[KSYM_NAME_LEN] = 0;
namebuf[0] = 0; namebuf[0] = 0;
if (all_var || is_kernel_text(addr) || is_kernel_inittext(addr)) { if ((all_var && is_kernel(addr)) ||
(!all_var && (is_kernel_text(addr) || is_kernel_inittext(addr)))) {
unsigned long symbol_end=0; unsigned long symbol_end=0;
/* do a binary search on the sorted kallsyms_addresses array */ /* do a binary search on the sorted kallsyms_addresses array */
......
...@@ -11,8 +11,8 @@ void vlan_proc_cleanup (void); ...@@ -11,8 +11,8 @@ void vlan_proc_cleanup (void);
#define vlan_proc_init() (0) #define vlan_proc_init() (0)
#define vlan_proc_cleanup() do {} while(0) #define vlan_proc_cleanup() do {} while(0)
#define vlan_proc_add_dev(dev) ((void)(dev), 0) #define vlan_proc_add_dev(dev) ({(void)(dev), 0;})
#define vlan_proc_rem_dev(dev) ((void)(dev), 0) #define vlan_proc_rem_dev(dev) ({(void)(dev), 0;})
#endif #endif
......
...@@ -65,27 +65,25 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh, ...@@ -65,27 +65,25 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
return csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)); return csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
} }
void netpoll_poll(struct netpoll *np) /*
* Check whether delayed processing was scheduled for our current CPU,
* and then manually invoke NAPI polling to pump data off the card.
*
* In cases where there is bi-directional communications, reading only
* one message at a time can lead to packets being dropped by the
* network adapter, forcing superfluous retries and possibly timeouts.
* Thus, we set our budget to greater than 1.
*/
static void poll_napi(struct netpoll *np)
{ {
/*
* In cases where there is bi-directional communications, reading
* only one message at a time can lead to packets being dropped by
* the network adapter, forcing superfluous retries and possibly
* timeouts. Thus, we set our budget to a more reasonable value.
*/
int budget = 16; int budget = 16;
unsigned long flags; unsigned long flags;
struct softnet_data *queue;
if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller)
return;
/* Process pending work on NIC */
np->dev->poll_controller(np->dev);
/* If scheduling is stopped, tickle NAPI bits */
spin_lock_irqsave(&netpoll_poll_lock, flags); spin_lock_irqsave(&netpoll_poll_lock, flags);
if (np->dev->poll && queue = &__get_cpu_var(softnet_data);
test_bit(__LINK_STATE_RX_SCHED, &np->dev->state)) { if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) &&
!list_empty(&queue->poll_list)) {
np->dev->netpoll_rx |= NETPOLL_RX_DROP; np->dev->netpoll_rx |= NETPOLL_RX_DROP;
atomic_inc(&trapped); atomic_inc(&trapped);
...@@ -95,6 +93,17 @@ void netpoll_poll(struct netpoll *np) ...@@ -95,6 +93,17 @@ void netpoll_poll(struct netpoll *np)
np->dev->netpoll_rx &= ~NETPOLL_RX_DROP; np->dev->netpoll_rx &= ~NETPOLL_RX_DROP;
} }
spin_unlock_irqrestore(&netpoll_poll_lock, flags); spin_unlock_irqrestore(&netpoll_poll_lock, flags);
}
void netpoll_poll(struct netpoll *np)
{
if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller)
return;
/* Process pending work on NIC */
np->dev->poll_controller(np->dev);
if (np->dev->poll)
poll_napi(np);
zap_completion_queue(); zap_completion_queue();
} }
......
...@@ -504,6 +504,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) ...@@ -504,6 +504,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
/* Prepare header of the next frame, /* Prepare header of the next frame,
* before previous one went down. */ * before previous one went down. */
if (frag) { if (frag) {
frag->ip_summed = CHECKSUM_NONE;
frag->h.raw = frag->data; frag->h.raw = frag->data;
frag->nh.raw = __skb_push(frag, hlen); frag->nh.raw = __skb_push(frag, hlen);
memcpy(frag->nh.raw, iph, hlen); memcpy(frag->nh.raw, iph, hlen);
......
...@@ -209,9 +209,14 @@ static int help(struct sk_buff **pskb, ...@@ -209,9 +209,14 @@ static int help(struct sk_buff **pskb,
DEBUGP("tcph->seq = %u\n", th->seq); DEBUGP("tcph->seq = %u\n", th->seq);
seq = ntohl(th->seq) + (addr_beg_p - ib_ptr); seq = ntohl(th->seq) + (addr_beg_p - ib_ptr);
/* We refer to the reverse direction ("!dir")
* tuples here, because we're expecting
* something in the other * direction.
* Doesn't matter unless NAT is happening. */
exp->tuple = ((struct ip_conntrack_tuple) exp->tuple = ((struct ip_conntrack_tuple)
{ { 0, { 0 } }, { { 0, { 0 } },
{ ct->tuplehash[dir].tuple.src.ip, { .tcp = { htons(dcc_port) } }, { ct->tuplehash[!dir].tuple.dst.ip,
{ .tcp = { htons(dcc_port) } },
IPPROTO_TCP }}); IPPROTO_TCP }});
exp->mask = ((struct ip_conntrack_tuple) exp->mask = ((struct ip_conntrack_tuple)
{ { 0, { 0 } }, { { 0, { 0 } },
......
...@@ -83,7 +83,10 @@ static unsigned int help(struct sk_buff **pskb, ...@@ -83,7 +83,10 @@ static unsigned int help(struct sk_buff **pskb,
* 0x01, \n: terminators * 0x01, \n: terminators
*/ */
sprintf(buffer, "%u %u", ntohl(exp->tuple.src.ip), port); /* AAA = "us", ie. where server normally talks to. */
sprintf(buffer, "%u %u",
ntohl(exp->master->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip),
port);
DEBUGP("ip_nat_irc: Inserting '%s' == %u.%u.%u.%u, port %u\n", DEBUGP("ip_nat_irc: Inserting '%s' == %u.%u.%u.%u, port %u\n",
buffer, NIPQUAD(exp->tuple.src.ip), port); buffer, NIPQUAD(exp->tuple.src.ip), port);
......
...@@ -181,7 +181,7 @@ static int ipt_snat_checkentry(const char *tablename, ...@@ -181,7 +181,7 @@ static int ipt_snat_checkentry(const char *tablename,
return 0; return 0;
} }
if (targinfosize != sizeof(struct ip_nat_multi_range_compat)) { if (targinfosize != IPT_ALIGN(sizeof(struct ip_nat_multi_range_compat))) {
DEBUGP("SNAT: Target size %u wrong for %u ranges\n", DEBUGP("SNAT: Target size %u wrong for %u ranges\n",
targinfosize, mr->rangesize); targinfosize, mr->rangesize);
return 0; return 0;
...@@ -214,7 +214,7 @@ static int ipt_dnat_checkentry(const char *tablename, ...@@ -214,7 +214,7 @@ static int ipt_dnat_checkentry(const char *tablename,
return 0; return 0;
} }
if (targinfosize != sizeof(struct ip_nat_multi_range_compat)) { if (targinfosize != IPT_ALIGN(sizeof(struct ip_nat_multi_range_compat))) {
DEBUGP("DNAT: Target size %u wrong for %u ranges\n", DEBUGP("DNAT: Target size %u wrong for %u ranges\n",
targinfosize, mr->rangesize); targinfosize, mr->rangesize);
return 0; return 0;
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/netfilter_ipv4/ip_tables.h> #include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_CLUSTERIP.h> #include <linux/netfilter_ipv4/ipt_CLUSTERIP.h>
#include <linux/netfilter_ipv4/ip_conntrack.h> #include <linux/netfilter_ipv4/ip_conntrack.h>
#include <linux/netfilter_ipv4/lockhelp.h>
#define CLUSTERIP_VERSION "0.6" #define CLUSTERIP_VERSION "0.6"
......
...@@ -64,30 +64,31 @@ ports_match_v1(const struct ipt_multiport_v1 *minfo, ...@@ -64,30 +64,31 @@ ports_match_v1(const struct ipt_multiport_v1 *minfo,
if (minfo->flags == IPT_MULTIPORT_SOURCE if (minfo->flags == IPT_MULTIPORT_SOURCE
&& src >= s && src <= e) && src >= s && src <= e)
return 1; return 1 ^ minfo->invert;
if (minfo->flags == IPT_MULTIPORT_DESTINATION if (minfo->flags == IPT_MULTIPORT_DESTINATION
&& dst >= s && dst <= e) && dst >= s && dst <= e)
return 1; return 1 ^ minfo->invert;
if (minfo->flags == IPT_MULTIPORT_EITHER if (minfo->flags == IPT_MULTIPORT_EITHER
&& ((dst >= s && dst <= e) && ((dst >= s && dst <= e)
|| (src >= s && src <= e))) || (src >= s && src <= e)))
return 1; return 1 ^ minfo->invert;
} else { } else {
/* exact port matching */ /* exact port matching */
duprintf("src or dst matches with %d?\n", s); duprintf("src or dst matches with %d?\n", s);
if (minfo->flags == IPT_MULTIPORT_SOURCE if (minfo->flags == IPT_MULTIPORT_SOURCE
&& src == s) && src == s)
return 1; return 1 ^ minfo->invert;
if (minfo->flags == IPT_MULTIPORT_DESTINATION if (minfo->flags == IPT_MULTIPORT_DESTINATION
&& dst == s) && dst == s)
return 1; return 1 ^ minfo->invert;
if (minfo->flags == IPT_MULTIPORT_EITHER if (minfo->flags == IPT_MULTIPORT_EITHER
&& (src == s || dst == s)) && (src == s || dst == s))
return 1; return 1 ^ minfo->invert;
} }
} }
return 0; return minfo->invert;
} }
static int static int
......
...@@ -592,6 +592,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) ...@@ -592,6 +592,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
/* Prepare header of the next frame, /* Prepare header of the next frame,
* before previous one went down. */ * before previous one went down. */
if (frag) { if (frag) {
frag->ip_summed = CHECKSUM_NONE;
frag->h.raw = frag->data; frag->h.raw = frag->data;
fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr)); fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr));
frag->nh.raw = __skb_push(frag, hlen); frag->nh.raw = __skb_push(frag, hlen);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment