Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [NETFILTER]: nf_conntrack_pptp: fix NAT setup of expected GRE connections [NETFILTER]: nf_nat_pptp: fix expectation removal [NETFILTER]: nf_nat: fix ICMP translation with statically linked conntrack [TCP]: Restore SKB socket owner setting in tcp_transmit_skb(). [AF_PACKET]: Check device down state before hard header callbacks. [DECNET]: Handle a failure in neigh_parms_alloc (take 2) [BNX2]: Fix 2nd port's MAC address. [TCP]: Fix sorting of SACK blocks. [AF_PACKET]: Fix BPF handling. [IPV4]: Fix the fib trie iterator to work with a single entry routing tables
This commit is contained in:
commit
d312c8f81c
16 changed files with 85 additions and 62 deletions
|
@ -57,8 +57,8 @@
|
||||||
|
|
||||||
#define DRV_MODULE_NAME "bnx2"
|
#define DRV_MODULE_NAME "bnx2"
|
||||||
#define PFX DRV_MODULE_NAME ": "
|
#define PFX DRV_MODULE_NAME ": "
|
||||||
#define DRV_MODULE_VERSION "1.5.3"
|
#define DRV_MODULE_VERSION "1.5.4"
|
||||||
#define DRV_MODULE_RELDATE "January 8, 2007"
|
#define DRV_MODULE_RELDATE "January 24, 2007"
|
||||||
|
|
||||||
#define RUN_AT(x) (jiffies + (x))
|
#define RUN_AT(x) (jiffies + (x))
|
||||||
|
|
||||||
|
@ -5845,9 +5845,11 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||||||
reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE);
|
reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE);
|
||||||
|
|
||||||
if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
|
if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
|
||||||
BNX2_SHM_HDR_SIGNATURE_SIG)
|
BNX2_SHM_HDR_SIGNATURE_SIG) {
|
||||||
bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0);
|
u32 off = PCI_FUNC(pdev->devfn) << 2;
|
||||||
else
|
|
||||||
|
bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0 + off);
|
||||||
|
} else
|
||||||
bp->shmem_base = HOST_VIEW_SHMEM_BASE;
|
bp->shmem_base = HOST_VIEW_SHMEM_BASE;
|
||||||
|
|
||||||
/* Get the permanent MAC address. First we need to make sure the
|
/* Get the permanent MAC address. First we need to make sure the
|
||||||
|
|
|
@ -38,5 +38,5 @@ extern void inet6_csk_reqsk_queue_hash_add(struct sock *sk,
|
||||||
|
|
||||||
extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||||
|
|
||||||
extern int inet6_csk_xmit(struct sk_buff *skb, struct sock *sk, int ipfragok);
|
extern int inet6_csk_xmit(struct sk_buff *skb, int ipfragok);
|
||||||
#endif /* _INET6_CONNECTION_SOCK_H */
|
#endif /* _INET6_CONNECTION_SOCK_H */
|
||||||
|
|
|
@ -37,8 +37,7 @@ struct tcp_congestion_ops;
|
||||||
* (i.e. things that depend on the address family)
|
* (i.e. things that depend on the address family)
|
||||||
*/
|
*/
|
||||||
struct inet_connection_sock_af_ops {
|
struct inet_connection_sock_af_ops {
|
||||||
int (*queue_xmit)(struct sk_buff *skb, struct sock *sk,
|
int (*queue_xmit)(struct sk_buff *skb, int ipfragok);
|
||||||
int ipfragok);
|
|
||||||
void (*send_check)(struct sock *sk, int len,
|
void (*send_check)(struct sock *sk, int len,
|
||||||
struct sk_buff *skb);
|
struct sk_buff *skb);
|
||||||
int (*rebuild_header)(struct sock *sk);
|
int (*rebuild_header)(struct sock *sk);
|
||||||
|
|
|
@ -97,7 +97,7 @@ extern int ip_mc_output(struct sk_buff *skb);
|
||||||
extern int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
|
extern int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
|
||||||
extern int ip_do_nat(struct sk_buff *skb);
|
extern int ip_do_nat(struct sk_buff *skb);
|
||||||
extern void ip_send_check(struct iphdr *ip);
|
extern void ip_send_check(struct iphdr *ip);
|
||||||
extern int ip_queue_xmit(struct sk_buff *skb, struct sock *sk, int ipfragok);
|
extern int ip_queue_xmit(struct sk_buff *skb, int ipfragok);
|
||||||
extern void ip_init(void);
|
extern void ip_init(void);
|
||||||
extern int ip_append_data(struct sock *sk,
|
extern int ip_append_data(struct sock *sk,
|
||||||
int getfrag(void *from, char *to, int offset, int len,
|
int getfrag(void *from, char *to, int offset, int len,
|
||||||
|
|
|
@ -124,7 +124,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
|
||||||
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
|
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
|
||||||
|
|
||||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||||
err = icsk->icsk_af_ops->queue_xmit(skb, sk, 0);
|
err = icsk->icsk_af_ops->queue_xmit(skb, 0);
|
||||||
return net_xmit_eval(err);
|
return net_xmit_eval(err);
|
||||||
}
|
}
|
||||||
return -ENOBUFS;
|
return -ENOBUFS;
|
||||||
|
@ -396,7 +396,7 @@ int dccp_send_reset(struct sock *sk, enum dccp_reset_codes code)
|
||||||
code);
|
code);
|
||||||
if (skb != NULL) {
|
if (skb != NULL) {
|
||||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||||
err = inet_csk(sk)->icsk_af_ops->queue_xmit(skb, sk, 0);
|
err = inet_csk(sk)->icsk_af_ops->queue_xmit(skb, 0);
|
||||||
return net_xmit_eval(err);
|
return net_xmit_eval(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1145,16 +1145,23 @@ struct dn_dev *dn_dev_create(struct net_device *dev, int *err)
|
||||||
init_timer(&dn_db->timer);
|
init_timer(&dn_db->timer);
|
||||||
|
|
||||||
dn_db->uptime = jiffies;
|
dn_db->uptime = jiffies;
|
||||||
|
|
||||||
|
dn_db->neigh_parms = neigh_parms_alloc(dev, &dn_neigh_table);
|
||||||
|
if (!dn_db->neigh_parms) {
|
||||||
|
dev->dn_ptr = NULL;
|
||||||
|
kfree(dn_db);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (dn_db->parms.up) {
|
if (dn_db->parms.up) {
|
||||||
if (dn_db->parms.up(dev) < 0) {
|
if (dn_db->parms.up(dev) < 0) {
|
||||||
|
neigh_parms_release(&dn_neigh_table, dn_db->neigh_parms);
|
||||||
dev->dn_ptr = NULL;
|
dev->dn_ptr = NULL;
|
||||||
kfree(dn_db);
|
kfree(dn_db);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dn_db->neigh_parms = neigh_parms_alloc(dev, &dn_neigh_table);
|
|
||||||
|
|
||||||
dn_dev_sysctl_register(dev, &dn_db->parms);
|
dn_dev_sysctl_register(dev, &dn_db->parms);
|
||||||
|
|
||||||
dn_dev_set_timer(dev);
|
dn_dev_set_timer(dev);
|
||||||
|
|
|
@ -1989,6 +1989,10 @@ static struct node *fib_trie_get_next(struct fib_trie_iter *iter)
|
||||||
unsigned cindex = iter->index;
|
unsigned cindex = iter->index;
|
||||||
struct tnode *p;
|
struct tnode *p;
|
||||||
|
|
||||||
|
/* A single entry routing table */
|
||||||
|
if (!tn)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
|
pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
|
||||||
iter->tnode, iter->index, iter->depth);
|
iter->tnode, iter->index, iter->depth);
|
||||||
rescan:
|
rescan:
|
||||||
|
@ -2037,11 +2041,18 @@ static struct node *fib_trie_get_first(struct fib_trie_iter *iter,
|
||||||
if(!iter)
|
if(!iter)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (n && IS_TNODE(n)) {
|
if (n) {
|
||||||
iter->tnode = (struct tnode *) n;
|
if (IS_TNODE(n)) {
|
||||||
iter->trie = t;
|
iter->tnode = (struct tnode *) n;
|
||||||
iter->index = 0;
|
iter->trie = t;
|
||||||
iter->depth = 1;
|
iter->index = 0;
|
||||||
|
iter->depth = 1;
|
||||||
|
} else {
|
||||||
|
iter->tnode = NULL;
|
||||||
|
iter->trie = t;
|
||||||
|
iter->index = 0;
|
||||||
|
iter->depth = 0;
|
||||||
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -281,8 +281,9 @@ int ip_output(struct sk_buff *skb)
|
||||||
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
||||||
}
|
}
|
||||||
|
|
||||||
int ip_queue_xmit(struct sk_buff *skb, struct sock *sk, int ipfragok)
|
int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
|
||||||
{
|
{
|
||||||
|
struct sock *sk = skb->sk;
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
struct ip_options *opt = inet->opt;
|
struct ip_options *opt = inet->opt;
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
|
|
|
@ -4,6 +4,14 @@
|
||||||
|
|
||||||
# objects for the standalone - connection tracking / NAT
|
# objects for the standalone - connection tracking / NAT
|
||||||
ip_conntrack-objs := ip_conntrack_standalone.o ip_conntrack_core.o ip_conntrack_proto_generic.o ip_conntrack_proto_tcp.o ip_conntrack_proto_udp.o ip_conntrack_proto_icmp.o
|
ip_conntrack-objs := ip_conntrack_standalone.o ip_conntrack_core.o ip_conntrack_proto_generic.o ip_conntrack_proto_tcp.o ip_conntrack_proto_udp.o ip_conntrack_proto_icmp.o
|
||||||
|
# objects for l3 independent conntrack
|
||||||
|
nf_conntrack_ipv4-objs := nf_conntrack_l3proto_ipv4.o nf_conntrack_proto_icmp.o
|
||||||
|
ifeq ($(CONFIG_NF_CONNTRACK_PROC_COMPAT),y)
|
||||||
|
ifeq ($(CONFIG_PROC_FS),y)
|
||||||
|
nf_conntrack_ipv4-objs += nf_conntrack_l3proto_ipv4_compat.o
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ip_nat-objs := ip_nat_core.o ip_nat_helper.o ip_nat_proto_unknown.o ip_nat_proto_tcp.o ip_nat_proto_udp.o ip_nat_proto_icmp.o
|
ip_nat-objs := ip_nat_core.o ip_nat_helper.o ip_nat_proto_unknown.o ip_nat_proto_tcp.o ip_nat_proto_udp.o ip_nat_proto_icmp.o
|
||||||
nf_nat-objs := nf_nat_core.o nf_nat_helper.o nf_nat_proto_unknown.o nf_nat_proto_tcp.o nf_nat_proto_udp.o nf_nat_proto_icmp.o
|
nf_nat-objs := nf_nat_core.o nf_nat_helper.o nf_nat_proto_unknown.o nf_nat_proto_tcp.o nf_nat_proto_udp.o nf_nat_proto_icmp.o
|
||||||
ifneq ($(CONFIG_NF_NAT),)
|
ifneq ($(CONFIG_NF_NAT),)
|
||||||
|
@ -20,6 +28,8 @@ ip_nat_h323-objs := ip_nat_helper_h323.o
|
||||||
|
|
||||||
# connection tracking
|
# connection tracking
|
||||||
obj-$(CONFIG_IP_NF_CONNTRACK) += ip_conntrack.o
|
obj-$(CONFIG_IP_NF_CONNTRACK) += ip_conntrack.o
|
||||||
|
obj-$(CONFIG_NF_CONNTRACK_IPV4) += nf_conntrack_ipv4.o
|
||||||
|
|
||||||
obj-$(CONFIG_IP_NF_NAT) += ip_nat.o
|
obj-$(CONFIG_IP_NF_NAT) += ip_nat.o
|
||||||
obj-$(CONFIG_NF_NAT) += nf_nat.o
|
obj-$(CONFIG_NF_NAT) += nf_nat.o
|
||||||
|
|
||||||
|
@ -106,13 +116,3 @@ obj-$(CONFIG_IP_NF_ARPFILTER) += arptable_filter.o
|
||||||
|
|
||||||
obj-$(CONFIG_IP_NF_QUEUE) += ip_queue.o
|
obj-$(CONFIG_IP_NF_QUEUE) += ip_queue.o
|
||||||
|
|
||||||
# objects for l3 independent conntrack
|
|
||||||
nf_conntrack_ipv4-objs := nf_conntrack_l3proto_ipv4.o nf_conntrack_proto_icmp.o
|
|
||||||
ifeq ($(CONFIG_NF_CONNTRACK_PROC_COMPAT),y)
|
|
||||||
ifeq ($(CONFIG_PROC_FS),y)
|
|
||||||
nf_conntrack_ipv4-objs += nf_conntrack_l3proto_ipv4_compat.o
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# l3 independent conntrack
|
|
||||||
obj-$(CONFIG_NF_CONNTRACK_IPV4) += nf_conntrack_ipv4.o
|
|
||||||
|
|
|
@ -72,9 +72,9 @@ static void pptp_nat_expected(struct nf_conn *ct,
|
||||||
DEBUGP("we are PAC->PNS\n");
|
DEBUGP("we are PAC->PNS\n");
|
||||||
/* build tuple for PNS->PAC */
|
/* build tuple for PNS->PAC */
|
||||||
t.src.l3num = AF_INET;
|
t.src.l3num = AF_INET;
|
||||||
t.src.u3.ip = master->tuplehash[exp->dir].tuple.src.u3.ip;
|
t.src.u3.ip = master->tuplehash[!exp->dir].tuple.src.u3.ip;
|
||||||
t.src.u.gre.key = nat_pptp_info->pns_call_id;
|
t.src.u.gre.key = nat_pptp_info->pns_call_id;
|
||||||
t.dst.u3.ip = master->tuplehash[exp->dir].tuple.dst.u3.ip;
|
t.dst.u3.ip = master->tuplehash[!exp->dir].tuple.dst.u3.ip;
|
||||||
t.dst.u.gre.key = nat_pptp_info->pac_call_id;
|
t.dst.u.gre.key = nat_pptp_info->pac_call_id;
|
||||||
t.dst.protonum = IPPROTO_GRE;
|
t.dst.protonum = IPPROTO_GRE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1011,10 +1011,11 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
|
||||||
for (j = 0; j < i; j++){
|
for (j = 0; j < i; j++){
|
||||||
if (after(ntohl(sp[j].start_seq),
|
if (after(ntohl(sp[j].start_seq),
|
||||||
ntohl(sp[j+1].start_seq))){
|
ntohl(sp[j+1].start_seq))){
|
||||||
sp[j].start_seq = htonl(tp->recv_sack_cache[j+1].start_seq);
|
struct tcp_sack_block_wire tmp;
|
||||||
sp[j].end_seq = htonl(tp->recv_sack_cache[j+1].end_seq);
|
|
||||||
sp[j+1].start_seq = htonl(tp->recv_sack_cache[j].start_seq);
|
tmp = sp[j];
|
||||||
sp[j+1].end_seq = htonl(tp->recv_sack_cache[j].end_seq);
|
sp[j] = sp[j+1];
|
||||||
|
sp[j+1] = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -467,6 +467,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
||||||
|
|
||||||
th = (struct tcphdr *) skb_push(skb, tcp_header_size);
|
th = (struct tcphdr *) skb_push(skb, tcp_header_size);
|
||||||
skb->h.th = th;
|
skb->h.th = th;
|
||||||
|
skb_set_owner_w(skb, sk);
|
||||||
|
|
||||||
/* Build TCP header and checksum it. */
|
/* Build TCP header and checksum it. */
|
||||||
th->source = inet->sport;
|
th->source = inet->sport;
|
||||||
|
@ -540,7 +541,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
||||||
if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq)
|
if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq)
|
||||||
TCP_INC_STATS(TCP_MIB_OUTSEGS);
|
TCP_INC_STATS(TCP_MIB_OUTSEGS);
|
||||||
|
|
||||||
err = icsk->icsk_af_ops->queue_xmit(skb, sk, 0);
|
err = icsk->icsk_af_ops->queue_xmit(skb, 0);
|
||||||
if (likely(err <= 0))
|
if (likely(err <= 0))
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
|
@ -139,8 +139,9 @@ void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(inet6_csk_addr2sockaddr);
|
EXPORT_SYMBOL_GPL(inet6_csk_addr2sockaddr);
|
||||||
|
|
||||||
int inet6_csk_xmit(struct sk_buff *skb, struct sock *sk, int ipfragok)
|
int inet6_csk_xmit(struct sk_buff *skb, int ipfragok)
|
||||||
{
|
{
|
||||||
|
struct sock *sk = skb->sk;
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
struct flowi fl;
|
struct flowi fl;
|
||||||
|
|
|
@ -113,7 +113,7 @@ static void pptp_expectfn(struct nf_conn *ct,
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
nf_nat_pptp_expectfn = rcu_dereference(nf_nat_pptp_hook_expectfn);
|
nf_nat_pptp_expectfn = rcu_dereference(nf_nat_pptp_hook_expectfn);
|
||||||
if (nf_nat_pptp_expectfn && ct->status & IPS_NAT_MASK)
|
if (nf_nat_pptp_expectfn && ct->master->status & IPS_NAT_MASK)
|
||||||
nf_nat_pptp_expectfn(ct, exp);
|
nf_nat_pptp_expectfn(ct, exp);
|
||||||
else {
|
else {
|
||||||
struct nf_conntrack_tuple inv_t;
|
struct nf_conntrack_tuple inv_t;
|
||||||
|
|
|
@ -359,6 +359,10 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
|
err = -ENETDOWN;
|
||||||
|
if (!(dev->flags & IFF_UP))
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* You may not queue a frame bigger than the mtu. This is the lowest level
|
* You may not queue a frame bigger than the mtu. This is the lowest level
|
||||||
* raw protocol and you must do your own fragmentation at this level.
|
* raw protocol and you must do your own fragmentation at this level.
|
||||||
|
@ -407,10 +411,6 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
|
||||||
if (err)
|
if (err)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
err = -ENETDOWN;
|
|
||||||
if (!(dev->flags & IFF_UP))
|
|
||||||
goto out_free;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now send it
|
* Now send it
|
||||||
*/
|
*/
|
||||||
|
@ -428,24 +428,18 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline int run_filter(struct sk_buff *skb, struct sock *sk,
|
static inline unsigned int run_filter(struct sk_buff *skb, struct sock *sk,
|
||||||
unsigned *snaplen)
|
unsigned int res)
|
||||||
{
|
{
|
||||||
struct sk_filter *filter;
|
struct sk_filter *filter;
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
rcu_read_lock_bh();
|
rcu_read_lock_bh();
|
||||||
filter = rcu_dereference(sk->sk_filter);
|
filter = rcu_dereference(sk->sk_filter);
|
||||||
if (filter != NULL) {
|
if (filter != NULL)
|
||||||
err = sk_run_filter(skb, filter->insns, filter->len);
|
res = sk_run_filter(skb, filter->insns, filter->len);
|
||||||
if (!err)
|
|
||||||
err = -EPERM;
|
|
||||||
else if (*snaplen > err)
|
|
||||||
*snaplen = err;
|
|
||||||
}
|
|
||||||
rcu_read_unlock_bh();
|
rcu_read_unlock_bh();
|
||||||
|
|
||||||
return err;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -467,7 +461,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet
|
||||||
struct packet_sock *po;
|
struct packet_sock *po;
|
||||||
u8 * skb_head = skb->data;
|
u8 * skb_head = skb->data;
|
||||||
int skb_len = skb->len;
|
int skb_len = skb->len;
|
||||||
unsigned snaplen;
|
unsigned int snaplen, res;
|
||||||
|
|
||||||
if (skb->pkt_type == PACKET_LOOPBACK)
|
if (skb->pkt_type == PACKET_LOOPBACK)
|
||||||
goto drop;
|
goto drop;
|
||||||
|
@ -495,8 +489,11 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet
|
||||||
|
|
||||||
snaplen = skb->len;
|
snaplen = skb->len;
|
||||||
|
|
||||||
if (run_filter(skb, sk, &snaplen) < 0)
|
res = run_filter(skb, sk, snaplen);
|
||||||
|
if (!res)
|
||||||
goto drop_n_restore;
|
goto drop_n_restore;
|
||||||
|
if (snaplen > res)
|
||||||
|
snaplen = res;
|
||||||
|
|
||||||
if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
|
if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
|
||||||
(unsigned)sk->sk_rcvbuf)
|
(unsigned)sk->sk_rcvbuf)
|
||||||
|
@ -568,7 +565,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
|
||||||
struct tpacket_hdr *h;
|
struct tpacket_hdr *h;
|
||||||
u8 * skb_head = skb->data;
|
u8 * skb_head = skb->data;
|
||||||
int skb_len = skb->len;
|
int skb_len = skb->len;
|
||||||
unsigned snaplen;
|
unsigned int snaplen, res;
|
||||||
unsigned long status = TP_STATUS_LOSING|TP_STATUS_USER;
|
unsigned long status = TP_STATUS_LOSING|TP_STATUS_USER;
|
||||||
unsigned short macoff, netoff;
|
unsigned short macoff, netoff;
|
||||||
struct sk_buff *copy_skb = NULL;
|
struct sk_buff *copy_skb = NULL;
|
||||||
|
@ -592,8 +589,11 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
|
||||||
|
|
||||||
snaplen = skb->len;
|
snaplen = skb->len;
|
||||||
|
|
||||||
if (run_filter(skb, sk, &snaplen) < 0)
|
res = run_filter(skb, sk, snaplen);
|
||||||
|
if (!res)
|
||||||
goto drop_n_restore;
|
goto drop_n_restore;
|
||||||
|
if (snaplen > res)
|
||||||
|
snaplen = res;
|
||||||
|
|
||||||
if (sk->sk_type == SOCK_DGRAM) {
|
if (sk->sk_type == SOCK_DGRAM) {
|
||||||
macoff = netoff = TPACKET_ALIGN(TPACKET_HDRLEN) + 16;
|
macoff = netoff = TPACKET_ALIGN(TPACKET_HDRLEN) + 16;
|
||||||
|
@ -738,6 +738,10 @@ static int packet_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||||
if (sock->type == SOCK_RAW)
|
if (sock->type == SOCK_RAW)
|
||||||
reserve = dev->hard_header_len;
|
reserve = dev->hard_header_len;
|
||||||
|
|
||||||
|
err = -ENETDOWN;
|
||||||
|
if (!(dev->flags & IFF_UP))
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
err = -EMSGSIZE;
|
err = -EMSGSIZE;
|
||||||
if (len > dev->mtu+reserve)
|
if (len > dev->mtu+reserve)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
@ -770,10 +774,6 @@ static int packet_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||||
skb->dev = dev;
|
skb->dev = dev;
|
||||||
skb->priority = sk->sk_priority;
|
skb->priority = sk->sk_priority;
|
||||||
|
|
||||||
err = -ENETDOWN;
|
|
||||||
if (!(dev->flags & IFF_UP))
|
|
||||||
goto out_free;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now send it
|
* Now send it
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -804,7 +804,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
|
||||||
NIPQUAD(((struct rtable *)skb->dst)->rt_dst));
|
NIPQUAD(((struct rtable *)skb->dst)->rt_dst));
|
||||||
|
|
||||||
SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
|
SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
|
||||||
return ip_queue_xmit(skb, skb->sk, ipfragok);
|
return ip_queue_xmit(skb, ipfragok);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sctp_af sctp_ipv4_specific;
|
static struct sctp_af sctp_ipv4_specific;
|
||||||
|
|
Loading…
Reference in a new issue