Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (32 commits)
  [NetLabel]: correct usage of RCU locking
  [TCP]: fix D-SACK cwnd handling
  [NET] napi: use non-interruptible sleep in napi_disable
  [SCTP] net/sctp/auth.c: make 3 functions static
  [TCP]: Add missing I/O AT code to ipv6 side.
  [SCTP]: #if 0 sctp_update_copy_cksum()
  [INET]: Unexport icmpmsg_statistics
  [NET]: Unexport sock_enable_timestamp().
  [TCP]: Make tcp_match_skb_to_sack() static.
  [IRDA]: Make ircomm_tty static.
  [NET] fs/proc/proc_net.c: make a struct static
  [NET] dev_change_name: ignore changes to same name
  [NET]: Document some simple rules for actions
  [NET_CLS_ACT]: Use skb_act_clone
  [NET_CLS_ACT]: Introduce skb_act_clone
  [TCP]: Fix scatterlist handling in MD5 signature support.
  [IPSEC]: Fix scatterlist handling in skb_icv_walk().
  [IPSEC]: Add missing sg_init_table() calls to ESP.
  [CRYPTO]: Initialize TCRYPT on-stack scatterlist objects correctly.
  [CRYPTO]: HMAC needs some more scatterlist fixups.
  ...
This commit is contained in:
Linus Torvalds 2007-10-26 08:43:05 -07:00
Родитель e868171a94 4be2700fb7
Коммит ec3b67c11d
41 изменённых файлов: 228 добавлений и 181 удалений

Просмотреть файл

@ -184,14 +184,14 @@ tcp_frto - INTEGER
F-RTO is an enhanced recovery algorithm for TCP retransmission F-RTO is an enhanced recovery algorithm for TCP retransmission
timeouts. It is particularly beneficial in wireless environments timeouts. It is particularly beneficial in wireless environments
where packet loss is typically due to random radio interference where packet loss is typically due to random radio interference
rather than intermediate router congestion. FRTO is sender-side rather than intermediate router congestion. F-RTO is sender-side
only modification. Therefore it does not require any support from only modification. Therefore it does not require any support from
the peer, but in a typical case, however, where wireless link is the peer, but in a typical case, however, where wireless link is
the local access link and most of the data flows downlink, the the local access link and most of the data flows downlink, the
faraway servers should have FRTO enabled to take advantage of it. faraway servers should have F-RTO enabled to take advantage of it.
If set to 1, basic version is enabled. 2 enables SACK enhanced If set to 1, basic version is enabled. 2 enables SACK enhanced
F-RTO if flow uses SACK. The basic version can be used also when F-RTO if flow uses SACK. The basic version can be used also when
SACK is in use though scenario(s) with it exists where FRTO SACK is in use though scenario(s) with it exists where F-RTO
interacts badly with the packet counting of the SACK enabled TCP interacts badly with the packet counting of the SACK enabled TCP
flow. flow.

Просмотреть файл

@ -0,0 +1,29 @@
The "enviromental" rules for authors of any new tc actions are:
1) If you stealeth or borroweth any packet thou shalt be branching
from the righteous path and thou shalt cloneth.
For example if your action queues a packet to be processed later
or intentionaly branches by redirecting a packet then you need to
clone the packet.
There are certain fields in the skb tc_verd that need to be reset so we
avoid loops etc. A few are generic enough so much so that skb_act_clone()
resets them for you. So invoke skb_act_clone() rather than skb_clone()
2) If you munge any packet thou shalt call pskb_expand_head in the case
someone else is referencing the skb. After that you "own" the skb.
You must also tell us if it is ok to munge the packet (TC_OK2MUNGE),
this way any action downstream can stomp on the packet.
3) dropping packets you dont own is a nono. You simply return
TC_ACT_SHOT to the caller and they will drop it.
The "enviromental" rules for callers of actions (qdiscs etc) are:
*) thou art responsible for freeing anything returned as being
TC_ACT_SHOT/STOLEN/QUEUED. If none of TC_ACT_SHOT/STOLEN/QUEUED is
returned then all is great and you dont need to do anything.
Post on netdev if something is unclear.

Просмотреть файл

@ -2449,13 +2449,15 @@ W: http://www.tazenda.demon.co.uk/phil/linux-hp
S: Maintained S: Maintained
MAC80211 MAC80211
P: Jiri Benc
M: jbenc@suse.cz
P: Michael Wu P: Michael Wu
M: flamingice@sourmilk.net M: flamingice@sourmilk.net
P: Johannes Berg
M: johannes@sipsolutions.net
P: Jiri Benc
M: jbenc@suse.cz
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
W: http://linuxwireless.org/ W: http://linuxwireless.org/
T: git kernel.org:/pub/scm/linux/kernel/git/jbenc/mac80211.git T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
S: Maintained S: Maintained
MACVLAN DRIVER MACVLAN DRIVER

Просмотреть файл

@ -61,7 +61,7 @@ static int hmac_setkey(struct crypto_hash *parent,
desc.tfm = tfm; desc.tfm = tfm;
desc.flags = crypto_hash_get_flags(parent); desc.flags = crypto_hash_get_flags(parent);
desc.flags &= CRYPTO_TFM_REQ_MAY_SLEEP; desc.flags &= CRYPTO_TFM_REQ_MAY_SLEEP;
sg_set_buf(&tmp, inkey, keylen); sg_init_one(&tmp, inkey, keylen);
err = crypto_hash_digest(&desc, &tmp, keylen, digest); err = crypto_hash_digest(&desc, &tmp, keylen, digest);
if (err) if (err)
@ -96,7 +96,7 @@ static int hmac_init(struct hash_desc *pdesc)
desc.tfm = ctx->child; desc.tfm = ctx->child;
desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP; desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP;
sg_set_buf(&tmp, ipad, bs); sg_init_one(&tmp, ipad, bs);
err = crypto_hash_init(&desc); err = crypto_hash_init(&desc);
if (unlikely(err)) if (unlikely(err))
@ -131,7 +131,7 @@ static int hmac_final(struct hash_desc *pdesc, u8 *out)
desc.tfm = ctx->child; desc.tfm = ctx->child;
desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP; desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP;
sg_set_buf(&tmp, opad, bs + ds); sg_init_one(&tmp, opad, bs + ds);
err = crypto_hash_final(&desc, digest); err = crypto_hash_final(&desc, digest);
if (unlikely(err)) if (unlikely(err))
@ -158,9 +158,11 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg,
desc.tfm = ctx->child; desc.tfm = ctx->child;
desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP; desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP;
sg_init_table(sg1, 2);
sg_set_buf(sg1, ipad, bs); sg_set_buf(sg1, ipad, bs);
sg_set_page(&sg1[1], (void *) sg, 0, 0);
sg_set_page(&sg[1], (void *) sg, 0, 0); sg_init_table(sg2, 1);
sg_set_buf(sg2, opad, bs + ds); sg_set_buf(sg2, opad, bs + ds);
err = crypto_hash_digest(&desc, sg1, nbytes + bs, digest); err = crypto_hash_digest(&desc, sg1, nbytes + bs, digest);

Просмотреть файл

@ -139,7 +139,7 @@ static void test_hash(char *algo, struct hash_testvec *template,
printk("test %u:\n", i + 1); printk("test %u:\n", i + 1);
memset(result, 0, 64); memset(result, 0, 64);
sg_set_buf(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize); sg_init_one(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);
if (hash_tv[i].ksize) { if (hash_tv[i].ksize) {
ret = crypto_hash_setkey(tfm, hash_tv[i].key, ret = crypto_hash_setkey(tfm, hash_tv[i].key,
@ -176,6 +176,7 @@ static void test_hash(char *algo, struct hash_testvec *template,
memset(result, 0, 64); memset(result, 0, 64);
temp = 0; temp = 0;
sg_init_table(sg, hash_tv[i].np);
for (k = 0; k < hash_tv[i].np; k++) { for (k = 0; k < hash_tv[i].np; k++) {
memcpy(&xbuf[IDX[k]], memcpy(&xbuf[IDX[k]],
hash_tv[i].plaintext + temp, hash_tv[i].plaintext + temp,
@ -289,7 +290,7 @@ static void test_cipher(char *algo, int enc,
goto out; goto out;
} }
sg_set_buf(&sg[0], cipher_tv[i].input, sg_init_one(&sg[0], cipher_tv[i].input,
cipher_tv[i].ilen); cipher_tv[i].ilen);
ablkcipher_request_set_crypt(req, sg, sg, ablkcipher_request_set_crypt(req, sg, sg,
@ -353,6 +354,7 @@ static void test_cipher(char *algo, int enc,
} }
temp = 0; temp = 0;
sg_init_table(sg, cipher_tv[i].np);
for (k = 0; k < cipher_tv[i].np; k++) { for (k = 0; k < cipher_tv[i].np; k++) {
memcpy(&xbuf[IDX[k]], memcpy(&xbuf[IDX[k]],
cipher_tv[i].input + temp, cipher_tv[i].input + temp,
@ -414,7 +416,7 @@ static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
int bcount; int bcount;
int ret; int ret;
sg_set_buf(sg, p, blen); sg_init_one(sg, p, blen);
for (start = jiffies, end = start + sec * HZ, bcount = 0; for (start = jiffies, end = start + sec * HZ, bcount = 0;
time_before(jiffies, end); bcount++) { time_before(jiffies, end); bcount++) {
@ -440,7 +442,7 @@ static int test_cipher_cycles(struct blkcipher_desc *desc, int enc, char *p,
int ret = 0; int ret = 0;
int i; int i;
sg_set_buf(sg, p, blen); sg_init_one(sg, p, blen);
local_bh_disable(); local_bh_disable();
local_irq_disable(); local_irq_disable();
@ -572,7 +574,7 @@ static int test_hash_jiffies_digest(struct hash_desc *desc, char *p, int blen,
for (start = jiffies, end = start + sec * HZ, bcount = 0; for (start = jiffies, end = start + sec * HZ, bcount = 0;
time_before(jiffies, end); bcount++) { time_before(jiffies, end); bcount++) {
sg_set_buf(sg, p, blen); sg_init_one(sg, p, blen);
ret = crypto_hash_digest(desc, sg, blen, out); ret = crypto_hash_digest(desc, sg, blen, out);
if (ret) if (ret)
return ret; return ret;
@ -601,7 +603,7 @@ static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen,
if (ret) if (ret)
return ret; return ret;
for (pcount = 0; pcount < blen; pcount += plen) { for (pcount = 0; pcount < blen; pcount += plen) {
sg_set_buf(sg, p + pcount, plen); sg_init_one(sg, p + pcount, plen);
ret = crypto_hash_update(desc, sg, plen); ret = crypto_hash_update(desc, sg, plen);
if (ret) if (ret)
return ret; return ret;
@ -631,7 +633,7 @@ static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen,
/* Warm-up run. */ /* Warm-up run. */
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
sg_set_buf(sg, p, blen); sg_init_one(sg, p, blen);
ret = crypto_hash_digest(desc, sg, blen, out); ret = crypto_hash_digest(desc, sg, blen, out);
if (ret) if (ret)
goto out; goto out;
@ -643,7 +645,7 @@ static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen,
start = get_cycles(); start = get_cycles();
sg_set_buf(sg, p, blen); sg_init_one(sg, p, blen);
ret = crypto_hash_digest(desc, sg, blen, out); ret = crypto_hash_digest(desc, sg, blen, out);
if (ret) if (ret)
goto out; goto out;
@ -686,7 +688,7 @@ static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
if (ret) if (ret)
goto out; goto out;
for (pcount = 0; pcount < blen; pcount += plen) { for (pcount = 0; pcount < blen; pcount += plen) {
sg_set_buf(sg, p + pcount, plen); sg_init_one(sg, p + pcount, plen);
ret = crypto_hash_update(desc, sg, plen); ret = crypto_hash_update(desc, sg, plen);
if (ret) if (ret)
goto out; goto out;
@ -706,7 +708,7 @@ static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
if (ret) if (ret)
goto out; goto out;
for (pcount = 0; pcount < blen; pcount += plen) { for (pcount = 0; pcount < blen; pcount += plen) {
sg_set_buf(sg, p + pcount, plen); sg_init_one(sg, p + pcount, plen);
ret = crypto_hash_update(desc, sg, plen); ret = crypto_hash_update(desc, sg, plen);
if (ret) if (ret)
goto out; goto out;

Просмотреть файл

@ -185,7 +185,7 @@ static __net_exit void proc_net_ns_exit(struct net *net)
kfree(net->proc_net_root); kfree(net->proc_net_root);
} }
struct pernet_operations __net_initdata proc_net_ns_ops = { static struct pernet_operations __net_initdata proc_net_ns_ops = {
.init = proc_net_ns_init, .init = proc_net_ns_init,
.exit = proc_net_ns_exit, .exit = proc_net_ns_exit,
}; };

Просмотреть файл

@ -144,6 +144,8 @@ enum dccp_reset_codes {
DCCP_RESET_CODE_TOO_BUSY, DCCP_RESET_CODE_TOO_BUSY,
DCCP_RESET_CODE_BAD_INIT_COOKIE, DCCP_RESET_CODE_BAD_INIT_COOKIE,
DCCP_RESET_CODE_AGGRESSION_PENALTY, DCCP_RESET_CODE_AGGRESSION_PENALTY,
DCCP_MAX_RESET_CODES /* Leave at the end! */
}; };
/* DCCP options */ /* DCCP options */
@ -270,10 +272,9 @@ static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
return memset(skb_transport_header(skb), 0, headlen); return memset(skb_transport_header(skb), 0, headlen);
} }
static inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb) static inline struct dccp_hdr_ext *dccp_hdrx(const struct dccp_hdr *dh)
{ {
return (struct dccp_hdr_ext *)(skb_transport_header(skb) + return (struct dccp_hdr_ext *)((unsigned char *)dh + sizeof(*dh));
sizeof(struct dccp_hdr));
} }
static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh) static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
@ -287,13 +288,12 @@ static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
return __dccp_basic_hdr_len(dh); return __dccp_basic_hdr_len(dh);
} }
static inline __u64 dccp_hdr_seq(const struct sk_buff *skb) static inline __u64 dccp_hdr_seq(const struct dccp_hdr *dh)
{ {
const struct dccp_hdr *dh = dccp_hdr(skb);
__u64 seq_nr = ntohs(dh->dccph_seq); __u64 seq_nr = ntohs(dh->dccph_seq);
if (dh->dccph_x != 0) if (dh->dccph_x != 0)
seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low); seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(dh)->dccph_seq_low);
else else
seq_nr += (u32)dh->dccph_seq2 << 16; seq_nr += (u32)dh->dccph_seq2 << 16;

Просмотреть файл

@ -390,7 +390,7 @@ static inline void napi_complete(struct napi_struct *n)
static inline void napi_disable(struct napi_struct *n) static inline void napi_disable(struct napi_struct *n)
{ {
while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
msleep_interruptible(1); msleep(1);
} }
/** /**

Просмотреть файл

@ -26,7 +26,6 @@
#include <net/inet_connection_sock.h> #include <net/inet_connection_sock.h>
#include <net/inet_sock.h> #include <net/inet_sock.h>
#include <net/route.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/tcp_states.h> #include <net/tcp_states.h>
@ -266,11 +265,6 @@ out:
wake_up(&hashinfo->lhash_wait); wake_up(&hashinfo->lhash_wait);
} }
static inline int inet_iif(const struct sk_buff *skb)
{
return ((struct rtable *)skb->dst)->rt_iif;
}
extern struct sock *__inet_lookup_listener(struct inet_hashinfo *hashinfo, extern struct sock *__inet_lookup_listener(struct inet_hashinfo *hashinfo,
const __be32 daddr, const __be32 daddr,
const unsigned short hnum, const unsigned short hnum,

Просмотреть файл

@ -24,6 +24,7 @@
#include <net/flow.h> #include <net/flow.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/request_sock.h> #include <net/request_sock.h>
#include <net/route.h>
/** struct ip_options - IP Options /** struct ip_options - IP Options
* *
@ -190,4 +191,10 @@ static inline int inet_sk_ehashfn(const struct sock *sk)
return inet_ehashfn(laddr, lport, faddr, fport); return inet_ehashfn(laddr, lport, faddr, fport);
} }
static inline int inet_iif(const struct sk_buff *skb)
{
return ((struct rtable *)skb->dst)->rt_iif;
}
#endif /* _INET_SOCK_H */ #endif /* _INET_SOCK_H */

Просмотреть файл

@ -127,7 +127,6 @@ extern int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
extern void ircomm_tty_set_termios(struct tty_struct *tty, extern void ircomm_tty_set_termios(struct tty_struct *tty,
struct ktermios *old_termios); struct ktermios *old_termios);
extern hashbin_t *ircomm_tty;
#endif #endif

Просмотреть файл

@ -316,4 +316,19 @@ static inline u32 qdisc_l2t(struct qdisc_rate_table* rtab, unsigned int pktlen)
return rtab->data[slot]; return rtab->data[slot];
} }
#ifdef CONFIG_NET_CLS_ACT
static inline struct sk_buff *skb_act_clone(struct sk_buff *skb, gfp_t gfp_mask)
{
struct sk_buff *n = skb_clone(skb, gfp_mask);
if (n) {
n->tc_verd = SET_TC_VERD(n->tc_verd, 0);
n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd);
n->tc_verd = CLR_TC_MUNGED(n->tc_verd);
n->iif = skb->iif;
}
return n;
}
#endif
#endif #endif

Просмотреть файл

@ -88,7 +88,6 @@ static inline void sctp_auth_key_hold(struct sctp_auth_bytes *key)
void sctp_auth_key_put(struct sctp_auth_bytes *key); void sctp_auth_key_put(struct sctp_auth_bytes *key);
struct sctp_shared_key *sctp_auth_shkey_create(__u16 key_id, gfp_t gfp); struct sctp_shared_key *sctp_auth_shkey_create(__u16 key_id, gfp_t gfp);
void sctp_auth_shkey_free(struct sctp_shared_key *sh_key);
void sctp_auth_destroy_keys(struct list_head *keys); void sctp_auth_destroy_keys(struct list_head *keys);
int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp); int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp);
struct sctp_shared_key *sctp_auth_get_shkey( struct sctp_shared_key *sctp_auth_get_shkey(

Просмотреть файл

@ -156,7 +156,6 @@ int sctp_primitive_ASCONF(struct sctp_association *, void *arg);
__u32 sctp_start_cksum(__u8 *ptr, __u16 count); __u32 sctp_start_cksum(__u8 *ptr, __u16 count);
__u32 sctp_update_cksum(__u8 *ptr, __u16 count, __u32 cksum); __u32 sctp_update_cksum(__u8 *ptr, __u16 count, __u32 cksum);
__u32 sctp_end_cksum(__u32 cksum); __u32 sctp_end_cksum(__u32 cksum);
__u32 sctp_update_copy_cksum(__u8 *, __u8 *, __u16 count, __u32 cksum);
/* /*
* sctp/input.c * sctp/input.c

Просмотреть файл

@ -883,6 +883,9 @@ int dev_change_name(struct net_device *dev, char *newname)
if (!dev_valid_name(newname)) if (!dev_valid_name(newname))
return -EINVAL; return -EINVAL;
if (strncmp(newname, dev->name, IFNAMSIZ) == 0)
return 0;
memcpy(oldname, dev->name, IFNAMSIZ); memcpy(oldname, dev->name, IFNAMSIZ);
if (strchr(newname, '%')) { if (strchr(newname, '%')) {

Просмотреть файл

@ -415,13 +415,6 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb)
n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len;
n->nohdr = 0; n->nohdr = 0;
n->destructor = NULL; n->destructor = NULL;
#ifdef CONFIG_NET_CLS_ACT
/* FIXME What is this and why don't we do it in copy_skb_header? */
n->tc_verd = SET_TC_VERD(n->tc_verd,0);
n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd);
n->tc_verd = CLR_TC_MUNGED(n->tc_verd);
C(iif);
#endif
C(truesize); C(truesize);
atomic_set(&n->users, 1); atomic_set(&n->users, 1);
C(head); C(head);

Просмотреть файл

@ -1649,7 +1649,6 @@ void sock_enable_timestamp(struct sock *sk)
net_enable_timestamp(); net_enable_timestamp();
} }
} }
EXPORT_SYMBOL(sock_enable_timestamp);
/* /*
* Get a socket option on an socket. * Get a socket option on an socket.

Просмотреть файл

@ -750,20 +750,16 @@ static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
*/ */
hctx->ccid2hctx_ssthresh = ~0; hctx->ccid2hctx_ssthresh = ~0;
hctx->ccid2hctx_numdupack = 3; hctx->ccid2hctx_numdupack = 3;
hctx->ccid2hctx_seqbufc = 0;
/* XXX init ~ to window size... */ /* XXX init ~ to window size... */
if (ccid2_hc_tx_alloc_seq(hctx)) if (ccid2_hc_tx_alloc_seq(hctx))
return -ENOMEM; return -ENOMEM;
hctx->ccid2hctx_sent = 0;
hctx->ccid2hctx_rto = 3 * HZ; hctx->ccid2hctx_rto = 3 * HZ;
ccid2_change_srtt(hctx, -1); ccid2_change_srtt(hctx, -1);
hctx->ccid2hctx_rttvar = -1; hctx->ccid2hctx_rttvar = -1;
hctx->ccid2hctx_lastrtt = 0;
hctx->ccid2hctx_rpdupack = -1; hctx->ccid2hctx_rpdupack = -1;
hctx->ccid2hctx_last_cong = jiffies; hctx->ccid2hctx_last_cong = jiffies;
hctx->ccid2hctx_high_ack = 0;
hctx->ccid2hctx_rtotimer.function = &ccid2_hc_tx_rto_expire; hctx->ccid2hctx_rtotimer.function = &ccid2_hc_tx_rto_expire;
hctx->ccid2hctx_rtotimer.data = (unsigned long)sk; hctx->ccid2hctx_rtotimer.data = (unsigned long)sk;

Просмотреть файл

@ -40,6 +40,8 @@
#include "lib/tfrc.h" #include "lib/tfrc.h"
#include "ccid3.h" #include "ccid3.h"
#include <asm/unaligned.h>
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG #ifdef CONFIG_IP_DCCP_CCID3_DEBUG
static int ccid3_debug; static int ccid3_debug;
#define ccid3_pr_debug(format, a...) DCCP_PR_DEBUG(ccid3_debug, format, ##a) #define ccid3_pr_debug(format, a...) DCCP_PR_DEBUG(ccid3_debug, format, ##a)
@ -544,6 +546,7 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
const struct dccp_sock *dp = dccp_sk(sk); const struct dccp_sock *dp = dccp_sk(sk);
struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
struct ccid3_options_received *opt_recv; struct ccid3_options_received *opt_recv;
__be32 opt_val;
opt_recv = &hctx->ccid3hctx_options_received; opt_recv = &hctx->ccid3hctx_options_received;
@ -563,8 +566,8 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
dccp_role(sk), sk, len); dccp_role(sk), sk, len);
rc = -EINVAL; rc = -EINVAL;
} else { } else {
opt_recv->ccid3or_loss_event_rate = opt_val = get_unaligned((__be32 *)value);
ntohl(*(__be32 *)value); opt_recv->ccid3or_loss_event_rate = ntohl(opt_val);
ccid3_pr_debug("%s(%p), LOSS_EVENT_RATE=%u\n", ccid3_pr_debug("%s(%p), LOSS_EVENT_RATE=%u\n",
dccp_role(sk), sk, dccp_role(sk), sk,
opt_recv->ccid3or_loss_event_rate); opt_recv->ccid3or_loss_event_rate);
@ -585,8 +588,8 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
dccp_role(sk), sk, len); dccp_role(sk), sk, len);
rc = -EINVAL; rc = -EINVAL;
} else { } else {
opt_recv->ccid3or_receive_rate = opt_val = get_unaligned((__be32 *)value);
ntohl(*(__be32 *)value); opt_recv->ccid3or_receive_rate = ntohl(opt_val);
ccid3_pr_debug("%s(%p), RECEIVE_RATE=%u\n", ccid3_pr_debug("%s(%p), RECEIVE_RATE=%u\n",
dccp_role(sk), sk, dccp_role(sk), sk,
opt_recv->ccid3or_receive_rate); opt_recv->ccid3or_receive_rate);
@ -601,8 +604,6 @@ static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
{ {
struct ccid3_hc_tx_sock *hctx = ccid_priv(ccid); struct ccid3_hc_tx_sock *hctx = ccid_priv(ccid);
hctx->ccid3hctx_s = 0;
hctx->ccid3hctx_rtt = 0;
hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT; hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
INIT_LIST_HEAD(&hctx->ccid3hctx_hist); INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
@ -963,8 +964,6 @@ static int ccid3_hc_rx_init(struct ccid *ccid, struct sock *sk)
INIT_LIST_HEAD(&hcrx->ccid3hcrx_li_hist); INIT_LIST_HEAD(&hcrx->ccid3hcrx_li_hist);
hcrx->ccid3hcrx_tstamp_last_feedback = hcrx->ccid3hcrx_tstamp_last_feedback =
hcrx->ccid3hcrx_tstamp_last_ack = ktime_get_real(); hcrx->ccid3hcrx_tstamp_last_ack = ktime_get_real();
hcrx->ccid3hcrx_s = 0;
hcrx->ccid3hcrx_rtt = 0;
return 0; return 0;
} }

Просмотреть файл

@ -58,6 +58,42 @@ static void dccp_rcv_closereq(struct sock *sk, struct sk_buff *skb)
dccp_send_close(sk, 0); dccp_send_close(sk, 0);
} }
static u8 dccp_reset_code_convert(const u8 code)
{
const u8 error_code[] = {
[DCCP_RESET_CODE_CLOSED] = 0, /* normal termination */
[DCCP_RESET_CODE_UNSPECIFIED] = 0, /* nothing known */
[DCCP_RESET_CODE_ABORTED] = ECONNRESET,
[DCCP_RESET_CODE_NO_CONNECTION] = ECONNREFUSED,
[DCCP_RESET_CODE_CONNECTION_REFUSED] = ECONNREFUSED,
[DCCP_RESET_CODE_TOO_BUSY] = EUSERS,
[DCCP_RESET_CODE_AGGRESSION_PENALTY] = EDQUOT,
[DCCP_RESET_CODE_PACKET_ERROR] = ENOMSG,
[DCCP_RESET_CODE_BAD_INIT_COOKIE] = EBADR,
[DCCP_RESET_CODE_BAD_SERVICE_CODE] = EBADRQC,
[DCCP_RESET_CODE_OPTION_ERROR] = EILSEQ,
[DCCP_RESET_CODE_MANDATORY_ERROR] = EOPNOTSUPP,
};
return code >= DCCP_MAX_RESET_CODES ? 0 : error_code[code];
}
static void dccp_rcv_reset(struct sock *sk, struct sk_buff *skb)
{
u8 err = dccp_reset_code_convert(dccp_hdr_reset(skb)->dccph_reset_code);
sk->sk_err = err;
/* Queue the equivalent of TCP fin so that dccp_recvmsg exits the loop */
dccp_fin(sk, skb);
if (err && !sock_flag(sk, SOCK_DEAD))
sk_wake_async(sk, 0, POLL_ERR);
dccp_time_wait(sk, DCCP_TIME_WAIT, 0);
}
static void dccp_event_ack_recv(struct sock *sk, struct sk_buff *skb) static void dccp_event_ack_recv(struct sock *sk, struct sk_buff *skb)
{ {
struct dccp_sock *dp = dccp_sk(sk); struct dccp_sock *dp = dccp_sk(sk);
@ -192,8 +228,7 @@ static int __dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
* Set TIMEWAIT timer * Set TIMEWAIT timer
* Drop packet and return * Drop packet and return
*/ */
dccp_fin(sk, skb); dccp_rcv_reset(sk, skb);
dccp_time_wait(sk, DCCP_TIME_WAIT, 0);
return 0; return 0;
case DCCP_PKT_CLOSEREQ: case DCCP_PKT_CLOSEREQ:
dccp_rcv_closereq(sk, skb); dccp_rcv_closereq(sk, skb);
@ -521,12 +556,7 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
* Drop packet and return * Drop packet and return
*/ */
if (dh->dccph_type == DCCP_PKT_RESET) { if (dh->dccph_type == DCCP_PKT_RESET) {
/* dccp_rcv_reset(sk, skb);
* Queue the equivalent of TCP fin so that dccp_recvmsg
* exits the loop
*/
dccp_fin(sk, skb);
dccp_time_wait(sk, DCCP_TIME_WAIT, 0);
return 0; return 0;
/* /*
* Step 7: Check for unexpected packet types * Step 7: Check for unexpected packet types

Просмотреть файл

@ -241,8 +241,8 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
goto out; goto out;
dp = dccp_sk(sk); dp = dccp_sk(sk);
seq = dccp_hdr_seq(skb); seq = dccp_hdr_seq(dh);
if (sk->sk_state != DCCP_LISTEN && if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_LISTEN) &&
!between48(seq, dp->dccps_swl, dp->dccps_swh)) { !between48(seq, dp->dccps_swl, dp->dccps_swh)) {
NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS); NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
goto out; goto out;
@ -795,7 +795,7 @@ static int dccp_v4_rcv(struct sk_buff *skb)
dh = dccp_hdr(skb); dh = dccp_hdr(skb);
DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(skb); DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh);
DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type; DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
dccp_pr_debug("%8.8s " dccp_pr_debug("%8.8s "

Просмотреть файл

@ -173,7 +173,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
icmpv6_err_convert(type, code, &err); icmpv6_err_convert(type, code, &err);
seq = DCCP_SKB_CB(skb)->dccpd_seq; seq = dccp_hdr_seq(dh);
/* Might be for an request_sock */ /* Might be for an request_sock */
switch (sk->sk_state) { switch (sk->sk_state) {
struct request_sock *req, **prev; struct request_sock *req, **prev;
@ -787,7 +787,7 @@ static int dccp_v6_rcv(struct sk_buff *skb)
dh = dccp_hdr(skb); dh = dccp_hdr(skb);
DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(skb); DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh);
DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type; DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
if (dccp_packet_without_ack(skb)) if (dccp_packet_without_ack(skb))

Просмотреть файл

@ -14,6 +14,7 @@
#include <linux/dccp.h> #include <linux/dccp.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <asm/unaligned.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
@ -59,6 +60,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
unsigned char opt, len; unsigned char opt, len;
unsigned char *value; unsigned char *value;
u32 elapsed_time; u32 elapsed_time;
__be32 opt_val;
int rc; int rc;
int mandatory = 0; int mandatory = 0;
@ -145,7 +147,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
if (len != 4) if (len != 4)
goto out_invalid_option; goto out_invalid_option;
opt_recv->dccpor_timestamp = ntohl(*(__be32 *)value); opt_val = get_unaligned((__be32 *)value);
opt_recv->dccpor_timestamp = ntohl(opt_val);
dp->dccps_timestamp_echo = opt_recv->dccpor_timestamp; dp->dccps_timestamp_echo = opt_recv->dccpor_timestamp;
dp->dccps_timestamp_time = ktime_get_real(); dp->dccps_timestamp_time = ktime_get_real();
@ -159,7 +162,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
if (len != 4 && len != 6 && len != 8) if (len != 4 && len != 6 && len != 8)
goto out_invalid_option; goto out_invalid_option;
opt_recv->dccpor_timestamp_echo = ntohl(*(__be32 *)value); opt_val = get_unaligned((__be32 *)value);
opt_recv->dccpor_timestamp_echo = ntohl(opt_val);
dccp_pr_debug("%s rx opt: TIMESTAMP_ECHO=%u, len=%d, " dccp_pr_debug("%s rx opt: TIMESTAMP_ECHO=%u, len=%d, "
"ackno=%llu", dccp_role(sk), "ackno=%llu", dccp_role(sk),
@ -168,16 +172,20 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
(unsigned long long) (unsigned long long)
DCCP_SKB_CB(skb)->dccpd_ack_seq); DCCP_SKB_CB(skb)->dccpd_ack_seq);
value += 4;
if (len == 4) { if (len == 4) { /* no elapsed time included */
dccp_pr_debug_cat("\n"); dccp_pr_debug_cat("\n");
break; break;
} }
if (len == 6) if (len == 6) { /* 2-byte elapsed time */
elapsed_time = ntohs(*(__be16 *)(value + 4)); __be16 opt_val2 = get_unaligned((__be16 *)value);
else elapsed_time = ntohs(opt_val2);
elapsed_time = ntohl(*(__be32 *)(value + 4)); } else { /* 4-byte elapsed time */
opt_val = get_unaligned((__be32 *)value);
elapsed_time = ntohl(opt_val);
}
dccp_pr_debug_cat(", ELAPSED_TIME=%u\n", elapsed_time); dccp_pr_debug_cat(", ELAPSED_TIME=%u\n", elapsed_time);
@ -192,10 +200,13 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
if (pkt_type == DCCP_PKT_DATA) if (pkt_type == DCCP_PKT_DATA)
continue; continue;
if (len == 2) if (len == 2) {
elapsed_time = ntohs(*(__be16 *)value); __be16 opt_val2 = get_unaligned((__be16 *)value);
else elapsed_time = ntohs(opt_val2);
elapsed_time = ntohl(*(__be32 *)value); } else {
opt_val = get_unaligned((__be32 *)value);
elapsed_time = ntohl(opt_val);
}
if (elapsed_time > opt_recv->dccpor_elapsed_time) if (elapsed_time > opt_recv->dccpor_elapsed_time)
opt_recv->dccpor_elapsed_time = elapsed_time; opt_recv->dccpor_elapsed_time = elapsed_time;

Просмотреть файл

@ -504,22 +504,16 @@ int cipso_v4_doi_add(struct cipso_v4_doi *doi_def)
INIT_RCU_HEAD(&doi_def->rcu); INIT_RCU_HEAD(&doi_def->rcu);
INIT_LIST_HEAD(&doi_def->dom_list); INIT_LIST_HEAD(&doi_def->dom_list);
rcu_read_lock();
if (cipso_v4_doi_search(doi_def->doi) != NULL)
goto doi_add_failure_rlock;
spin_lock(&cipso_v4_doi_list_lock); spin_lock(&cipso_v4_doi_list_lock);
if (cipso_v4_doi_search(doi_def->doi) != NULL) if (cipso_v4_doi_search(doi_def->doi) != NULL)
goto doi_add_failure_slock; goto doi_add_failure;
list_add_tail_rcu(&doi_def->list, &cipso_v4_doi_list); list_add_tail_rcu(&doi_def->list, &cipso_v4_doi_list);
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_unlock();
return 0; return 0;
doi_add_failure_slock: doi_add_failure:
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
doi_add_failure_rlock:
rcu_read_unlock();
return -EEXIST; return -EEXIST;
} }
@ -543,29 +537,23 @@ int cipso_v4_doi_remove(u32 doi,
struct cipso_v4_doi *doi_def; struct cipso_v4_doi *doi_def;
struct cipso_v4_domhsh_entry *dom_iter; struct cipso_v4_domhsh_entry *dom_iter;
rcu_read_lock();
if (cipso_v4_doi_search(doi) != NULL) {
spin_lock(&cipso_v4_doi_list_lock); spin_lock(&cipso_v4_doi_list_lock);
doi_def = cipso_v4_doi_search(doi); doi_def = cipso_v4_doi_search(doi);
if (doi_def == NULL) { if (doi_def != NULL) {
spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_unlock();
return -ENOENT;
}
doi_def->valid = 0; doi_def->valid = 0;
list_del_rcu(&doi_def->list); list_del_rcu(&doi_def->list);
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_lock();
list_for_each_entry_rcu(dom_iter, &doi_def->dom_list, list) list_for_each_entry_rcu(dom_iter, &doi_def->dom_list, list)
if (dom_iter->valid) if (dom_iter->valid)
netlbl_domhsh_remove(dom_iter->domain, netlbl_domhsh_remove(dom_iter->domain,
audit_info); audit_info);
cipso_v4_cache_invalidate();
rcu_read_unlock(); rcu_read_unlock();
cipso_v4_cache_invalidate();
call_rcu(&doi_def->rcu, callback); call_rcu(&doi_def->rcu, callback);
return 0; return 0;
} }
rcu_read_unlock(); spin_unlock(&cipso_v4_doi_list_lock);
return -ENOENT; return -ENOENT;
} }
@ -653,22 +641,19 @@ int cipso_v4_doi_domhsh_add(struct cipso_v4_doi *doi_def, const char *domain)
new_dom->valid = 1; new_dom->valid = 1;
INIT_RCU_HEAD(&new_dom->rcu); INIT_RCU_HEAD(&new_dom->rcu);
rcu_read_lock();
spin_lock(&cipso_v4_doi_list_lock); spin_lock(&cipso_v4_doi_list_lock);
list_for_each_entry_rcu(iter, &doi_def->dom_list, list) list_for_each_entry(iter, &doi_def->dom_list, list)
if (iter->valid && if (iter->valid &&
((domain != NULL && iter->domain != NULL && ((domain != NULL && iter->domain != NULL &&
strcmp(iter->domain, domain) == 0) || strcmp(iter->domain, domain) == 0) ||
(domain == NULL && iter->domain == NULL))) { (domain == NULL && iter->domain == NULL))) {
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_unlock();
kfree(new_dom->domain); kfree(new_dom->domain);
kfree(new_dom); kfree(new_dom);
return -EEXIST; return -EEXIST;
} }
list_add_tail_rcu(&new_dom->list, &doi_def->dom_list); list_add_tail_rcu(&new_dom->list, &doi_def->dom_list);
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_unlock();
return 0; return 0;
} }
@ -689,9 +674,8 @@ int cipso_v4_doi_domhsh_remove(struct cipso_v4_doi *doi_def,
{ {
struct cipso_v4_domhsh_entry *iter; struct cipso_v4_domhsh_entry *iter;
rcu_read_lock();
spin_lock(&cipso_v4_doi_list_lock); spin_lock(&cipso_v4_doi_list_lock);
list_for_each_entry_rcu(iter, &doi_def->dom_list, list) list_for_each_entry(iter, &doi_def->dom_list, list)
if (iter->valid && if (iter->valid &&
((domain != NULL && iter->domain != NULL && ((domain != NULL && iter->domain != NULL &&
strcmp(iter->domain, domain) == 0) || strcmp(iter->domain, domain) == 0) ||
@ -699,13 +683,10 @@ int cipso_v4_doi_domhsh_remove(struct cipso_v4_doi *doi_def,
iter->valid = 0; iter->valid = 0;
list_del_rcu(&iter->list); list_del_rcu(&iter->list);
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_unlock();
call_rcu(&iter->rcu, cipso_v4_doi_domhsh_free); call_rcu(&iter->rcu, cipso_v4_doi_domhsh_free);
return 0; return 0;
} }
spin_unlock(&cipso_v4_doi_list_lock); spin_unlock(&cipso_v4_doi_list_lock);
rcu_read_unlock();
return -ENOENT; return -ENOENT;
} }

Просмотреть файл

@ -110,6 +110,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
if (!sg) if (!sg)
goto unlock; goto unlock;
} }
sg_init_table(sg, nfrags);
skb_to_sgvec(skb, sg, esph->enc_data+esp->conf.ivlen-skb->data, clen); skb_to_sgvec(skb, sg, esph->enc_data+esp->conf.ivlen-skb->data, clen);
err = crypto_blkcipher_encrypt(&desc, sg, sg, clen); err = crypto_blkcipher_encrypt(&desc, sg, sg, clen);
if (unlikely(sg != &esp->sgbuf[0])) if (unlikely(sg != &esp->sgbuf[0]))
@ -201,6 +202,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
if (!sg) if (!sg)
goto out; goto out;
} }
sg_init_table(sg, nfrags);
skb_to_sgvec(skb, sg, sizeof(*esph) + esp->conf.ivlen, elen); skb_to_sgvec(skb, sg, sizeof(*esph) + esp->conf.ivlen, elen);
err = crypto_blkcipher_decrypt(&desc, sg, sg, elen); err = crypto_blkcipher_decrypt(&desc, sg, sg, elen);
if (unlikely(sg != &esp->sgbuf[0])) if (unlikely(sg != &esp->sgbuf[0]))

Просмотреть файл

@ -1104,5 +1104,4 @@ void __init icmp_init(struct net_proto_family *ops)
EXPORT_SYMBOL(icmp_err_convert); EXPORT_SYMBOL(icmp_err_convert);
EXPORT_SYMBOL(icmp_send); EXPORT_SYMBOL(icmp_send);
EXPORT_SYMBOL(icmp_statistics); EXPORT_SYMBOL(icmp_statistics);
EXPORT_SYMBOL(icmpmsg_statistics);
EXPORT_SYMBOL(xrlim_allow); EXPORT_SYMBOL(xrlim_allow);

Просмотреть файл

@ -121,14 +121,6 @@ static const struct snmp_mib snmp4_ipextstats_list[] = {
SNMP_MIB_SENTINEL SNMP_MIB_SENTINEL
}; };
static const struct snmp_mib snmp4_icmp_list[] = {
SNMP_MIB_ITEM("InMsgs", ICMP_MIB_INMSGS),
SNMP_MIB_ITEM("InErrors", ICMP_MIB_INERRORS),
SNMP_MIB_ITEM("OutMsgs", ICMP_MIB_OUTMSGS),
SNMP_MIB_ITEM("OutErrors", ICMP_MIB_OUTERRORS),
SNMP_MIB_SENTINEL
};
static struct { static struct {
char *name; char *name;
int index; int index;

Просмотреть файл

@ -103,7 +103,7 @@ int sysctl_tcp_abc __read_mostly;
#define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/ #define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/
#define FLAG_ONLY_ORIG_SACKED 0x200 /* SACKs only non-rexmit sent before RTO */ #define FLAG_ONLY_ORIG_SACKED 0x200 /* SACKs only non-rexmit sent before RTO */
#define FLAG_SND_UNA_ADVANCED 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */ #define FLAG_SND_UNA_ADVANCED 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */
#define FLAG_DSACKING_ACK 0x800 /* SACK blocks contained DSACK info */ #define FLAG_DSACKING_ACK 0x800 /* SACK blocks contained D-SACK info */
#define FLAG_NONHEAD_RETRANS_ACKED 0x1000 /* Non-head rexmitted data was ACKed */ #define FLAG_NONHEAD_RETRANS_ACKED 0x1000 /* Non-head rexmitted data was ACKed */
#define FLAG_ACKED (FLAG_DATA_ACKED|FLAG_SYN_ACKED) #define FLAG_ACKED (FLAG_DATA_ACKED|FLAG_SYN_ACKED)
@ -866,7 +866,7 @@ static void tcp_disable_fack(struct tcp_sock *tp)
tp->rx_opt.sack_ok &= ~2; tp->rx_opt.sack_ok &= ~2;
} }
/* Take a notice that peer is sending DSACKs */ /* Take a notice that peer is sending D-SACKs */
static void tcp_dsack_seen(struct tcp_sock *tp) static void tcp_dsack_seen(struct tcp_sock *tp)
{ {
tp->rx_opt.sack_ok |= 4; tp->rx_opt.sack_ok |= 4;
@ -1058,7 +1058,7 @@ static void tcp_update_reordering(struct sock *sk, const int metric,
* *
* With D-SACK the lower bound is extended to cover sequence space below * With D-SACK the lower bound is extended to cover sequence space below
* SND.UNA down to undo_marker, which is the last point of interest. Yet * SND.UNA down to undo_marker, which is the last point of interest. Yet
* again, DSACK block must not to go across snd_una (for the same reason as * again, D-SACK block must not to go across snd_una (for the same reason as
* for the normal SACK blocks, explained above). But there all simplicity * for the normal SACK blocks, explained above). But there all simplicity
* ends, TCP might receive valid D-SACKs below that. As long as they reside * ends, TCP might receive valid D-SACKs below that. As long as they reside
* fully below undo_marker they do not affect behavior in anyway and can * fully below undo_marker they do not affect behavior in anyway and can
@ -1080,7 +1080,7 @@ static int tcp_is_sackblock_valid(struct tcp_sock *tp, int is_dsack,
if (!before(start_seq, tp->snd_nxt)) if (!before(start_seq, tp->snd_nxt))
return 0; return 0;
/* In outstanding window? ...This is valid exit for DSACKs too. /* In outstanding window? ...This is valid exit for D-SACKs too.
* start_seq == snd_una is non-sensical (see comments above) * start_seq == snd_una is non-sensical (see comments above)
*/ */
if (after(start_seq, tp->snd_una)) if (after(start_seq, tp->snd_una))
@ -1204,7 +1204,7 @@ static int tcp_check_dsack(struct tcp_sock *tp, struct sk_buff *ack_skb,
* which may fail and creates some hassle (caller must handle error case * which may fail and creates some hassle (caller must handle error case
* returns). * returns).
*/ */
int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb, static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb,
u32 start_seq, u32 end_seq) u32 start_seq, u32 end_seq)
{ {
int in_sack, err; int in_sack, err;
@ -1248,6 +1248,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
int cached_fack_count; int cached_fack_count;
int i; int i;
int first_sack_index; int first_sack_index;
int force_one_sack;
if (!tp->sacked_out) { if (!tp->sacked_out) {
if (WARN_ON(tp->fackets_out)) if (WARN_ON(tp->fackets_out))
@ -1272,18 +1273,18 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
* if the only SACK change is the increase of the end_seq of * if the only SACK change is the increase of the end_seq of
* the first block then only apply that SACK block * the first block then only apply that SACK block
* and use retrans queue hinting otherwise slowpath */ * and use retrans queue hinting otherwise slowpath */
flag = 1; force_one_sack = 1;
for (i = 0; i < num_sacks; i++) { for (i = 0; i < num_sacks; i++) {
__be32 start_seq = sp[i].start_seq; __be32 start_seq = sp[i].start_seq;
__be32 end_seq = sp[i].end_seq; __be32 end_seq = sp[i].end_seq;
if (i == 0) { if (i == 0) {
if (tp->recv_sack_cache[i].start_seq != start_seq) if (tp->recv_sack_cache[i].start_seq != start_seq)
flag = 0; force_one_sack = 0;
} else { } else {
if ((tp->recv_sack_cache[i].start_seq != start_seq) || if ((tp->recv_sack_cache[i].start_seq != start_seq) ||
(tp->recv_sack_cache[i].end_seq != end_seq)) (tp->recv_sack_cache[i].end_seq != end_seq))
flag = 0; force_one_sack = 0;
} }
tp->recv_sack_cache[i].start_seq = start_seq; tp->recv_sack_cache[i].start_seq = start_seq;
tp->recv_sack_cache[i].end_seq = end_seq; tp->recv_sack_cache[i].end_seq = end_seq;
@ -1295,7 +1296,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
} }
first_sack_index = 0; first_sack_index = 0;
if (flag) if (force_one_sack)
num_sacks = 1; num_sacks = 1;
else { else {
int j; int j;
@ -1321,9 +1322,6 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
} }
} }
/* clear flag as used for different purpose in following code */
flag = 0;
/* Use SACK fastpath hint if valid */ /* Use SACK fastpath hint if valid */
cached_skb = tp->fastpath_skb_hint; cached_skb = tp->fastpath_skb_hint;
cached_fack_count = tp->fastpath_cnt_hint; cached_fack_count = tp->fastpath_cnt_hint;
@ -1615,7 +1613,7 @@ void tcp_enter_frto(struct sock *sk)
!icsk->icsk_retransmits)) { !icsk->icsk_retransmits)) {
tp->prior_ssthresh = tcp_current_ssthresh(sk); tp->prior_ssthresh = tcp_current_ssthresh(sk);
/* Our state is too optimistic in ssthresh() call because cwnd /* Our state is too optimistic in ssthresh() call because cwnd
* is not reduced until tcp_enter_frto_loss() when previous FRTO * is not reduced until tcp_enter_frto_loss() when previous F-RTO
* recovery has not yet completed. Pattern would be this: RTO, * recovery has not yet completed. Pattern would be this: RTO,
* Cumulative ACK, RTO (2xRTO for the same segment does not end * Cumulative ACK, RTO (2xRTO for the same segment does not end
* up here twice). * up here twice).
@ -1801,7 +1799,7 @@ void tcp_enter_loss(struct sock *sk, int how)
tcp_set_ca_state(sk, TCP_CA_Loss); tcp_set_ca_state(sk, TCP_CA_Loss);
tp->high_seq = tp->snd_nxt; tp->high_seq = tp->snd_nxt;
TCP_ECN_queue_cwr(tp); TCP_ECN_queue_cwr(tp);
/* Abort FRTO algorithm if one is in progress */ /* Abort F-RTO algorithm if one is in progress */
tp->frto_counter = 0; tp->frto_counter = 0;
} }
@ -1946,7 +1944,7 @@ static int tcp_time_to_recover(struct sock *sk)
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
__u32 packets_out; __u32 packets_out;
/* Do not perform any recovery during FRTO algorithm */ /* Do not perform any recovery during F-RTO algorithm */
if (tp->frto_counter) if (tp->frto_counter)
return 0; return 0;
@ -2962,7 +2960,7 @@ static int tcp_process_frto(struct sock *sk, int flag)
} }
if (tp->frto_counter == 1) { if (tp->frto_counter == 1) {
/* Sending of the next skb must be allowed or no FRTO */ /* Sending of the next skb must be allowed or no F-RTO */
if (!tcp_send_head(sk) || if (!tcp_send_head(sk) ||
after(TCP_SKB_CB(tcp_send_head(sk))->end_seq, after(TCP_SKB_CB(tcp_send_head(sk))->end_seq,
tp->snd_una + tp->snd_wnd)) { tp->snd_una + tp->snd_wnd)) {

Просмотреть файл

@ -1055,6 +1055,9 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
bp->pad = 0; bp->pad = 0;
bp->protocol = protocol; bp->protocol = protocol;
bp->len = htons(tcplen); bp->len = htons(tcplen);
sg_init_table(sg, 4);
sg_set_buf(&sg[block++], bp, sizeof(*bp)); sg_set_buf(&sg[block++], bp, sizeof(*bp));
nbytes += sizeof(*bp); nbytes += sizeof(*bp);
@ -1080,6 +1083,8 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
sg_set_buf(&sg[block++], key->key, key->keylen); sg_set_buf(&sg[block++], key->key, key->keylen);
nbytes += key->keylen; nbytes += key->keylen;
sg_mark_end(sg, block);
/* Now store the Hash into the packet */ /* Now store the Hash into the packet */
err = crypto_hash_init(desc); err = crypto_hash_init(desc);
if (err) if (err)

Просмотреть файл

@ -1152,7 +1152,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
return __udp4_lib_mcast_deliver(skb, uh, saddr, daddr, udptable); return __udp4_lib_mcast_deliver(skb, uh, saddr, daddr, udptable);
sk = __udp4_lib_lookup(saddr, uh->source, daddr, uh->dest, sk = __udp4_lib_lookup(saddr, uh->source, daddr, uh->dest,
skb->dev->ifindex, udptable ); inet_iif(skb), udptable);
if (sk != NULL) { if (sk != NULL) {
int ret = udp_queue_rcv_skb(sk, skb); int ret = udp_queue_rcv_skb(sk, skb);

Просмотреть файл

@ -109,6 +109,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
if (!sg) if (!sg)
goto unlock; goto unlock;
} }
sg_init_table(sg, nfrags);
skb_to_sgvec(skb, sg, esph->enc_data+esp->conf.ivlen-skb->data, clen); skb_to_sgvec(skb, sg, esph->enc_data+esp->conf.ivlen-skb->data, clen);
err = crypto_blkcipher_encrypt(&desc, sg, sg, clen); err = crypto_blkcipher_encrypt(&desc, sg, sg, clen);
if (unlikely(sg != &esp->sgbuf[0])) if (unlikely(sg != &esp->sgbuf[0]))
@ -205,6 +206,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
goto out; goto out;
} }
} }
sg_init_table(sg, nfrags);
skb_to_sgvec(skb, sg, sizeof(*esph) + esp->conf.ivlen, elen); skb_to_sgvec(skb, sg, sizeof(*esph) + esp->conf.ivlen, elen);
ret = crypto_blkcipher_decrypt(&desc, sg, sg, elen); ret = crypto_blkcipher_decrypt(&desc, sg, sg, elen);
if (unlikely(sg != &esp->sgbuf[0])) if (unlikely(sg != &esp->sgbuf[0]))

Просмотреть файл

@ -757,6 +757,8 @@ static int tcp_v6_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
bp->len = htonl(tcplen); bp->len = htonl(tcplen);
bp->protocol = htonl(protocol); bp->protocol = htonl(protocol);
sg_init_table(sg, 4);
sg_set_buf(&sg[block++], bp, sizeof(*bp)); sg_set_buf(&sg[block++], bp, sizeof(*bp));
nbytes += sizeof(*bp); nbytes += sizeof(*bp);
@ -778,6 +780,8 @@ static int tcp_v6_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
sg_set_buf(&sg[block++], key->key, key->keylen); sg_set_buf(&sg[block++], key->key, key->keylen);
nbytes += key->keylen; nbytes += key->keylen;
sg_mark_end(sg, block);
/* Now store the hash into the packet */ /* Now store the hash into the packet */
err = crypto_hash_init(desc); err = crypto_hash_init(desc);
if (err) { if (err) {
@ -1728,6 +1732,8 @@ process:
if (!sock_owned_by_user(sk)) { if (!sock_owned_by_user(sk)) {
#ifdef CONFIG_NET_DMA #ifdef CONFIG_NET_DMA
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
tp->ucopy.dma_chan = get_softnet_dma();
if (tp->ucopy.dma_chan) if (tp->ucopy.dma_chan)
ret = tcp_v6_do_rcv(sk, skb); ret = tcp_v6_do_rcv(sk, skb);
else else

Просмотреть файл

@ -77,7 +77,7 @@ static int ircomm_tty_read_proc(char *buf, char **start, off_t offset, int len,
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
static struct tty_driver *driver; static struct tty_driver *driver;
hashbin_t *ircomm_tty = NULL; static hashbin_t *ircomm_tty = NULL;
static const struct tty_operations ops = { static const struct tty_operations ops = {
.open = ircomm_tty_open, .open = ircomm_tty_open,

Просмотреть файл

@ -1184,7 +1184,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev,
printk(KERN_DEBUG "%s: RX %sssocResp from %s (capab=0x%x " printk(KERN_DEBUG "%s: RX %sssocResp from %s (capab=0x%x "
"status=%d aid=%d)\n", "status=%d aid=%d)\n",
dev->name, reassoc ? "Rea" : "A", print_mac(mac, mgmt->sa), dev->name, reassoc ? "Rea" : "A", print_mac(mac, mgmt->sa),
capab_info, status_code, aid & ~(BIT(15) | BIT(14))); capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
if (status_code != WLAN_STATUS_SUCCESS) { if (status_code != WLAN_STATUS_SUCCESS) {
printk(KERN_DEBUG "%s: AP denied association (code=%d)\n", printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
@ -2096,7 +2096,8 @@ static int ieee80211_sta_match_ssid(struct ieee80211_if_sta *ifsta,
{ {
int tmp, hidden_ssid; int tmp, hidden_ssid;
if (!memcmp(ifsta->ssid, ssid, ssid_len)) if (ssid_len == ifsta->ssid_len &&
!memcmp(ifsta->ssid, ssid, ssid_len))
return 1; return 1;
if (ifsta->flags & IEEE80211_STA_AUTO_BSSID_SEL) if (ifsta->flags & IEEE80211_STA_AUTO_BSSID_SEL)

Просмотреть файл

@ -178,11 +178,9 @@ int netlbl_domhsh_init(u32 size)
for (iter = 0; iter < hsh_tbl->size; iter++) for (iter = 0; iter < hsh_tbl->size; iter++)
INIT_LIST_HEAD(&hsh_tbl->tbl[iter]); INIT_LIST_HEAD(&hsh_tbl->tbl[iter]);
rcu_read_lock();
spin_lock(&netlbl_domhsh_lock); spin_lock(&netlbl_domhsh_lock);
rcu_assign_pointer(netlbl_domhsh, hsh_tbl); rcu_assign_pointer(netlbl_domhsh, hsh_tbl);
spin_unlock(&netlbl_domhsh_lock); spin_unlock(&netlbl_domhsh_lock);
rcu_read_unlock();
return 0; return 0;
} }
@ -222,7 +220,6 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
entry->valid = 1; entry->valid = 1;
INIT_RCU_HEAD(&entry->rcu); INIT_RCU_HEAD(&entry->rcu);
ret_val = 0;
rcu_read_lock(); rcu_read_lock();
if (entry->domain != NULL) { if (entry->domain != NULL) {
bkt = netlbl_domhsh_hash(entry->domain); bkt = netlbl_domhsh_hash(entry->domain);
@ -233,7 +230,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
else else
ret_val = -EEXIST; ret_val = -EEXIST;
spin_unlock(&netlbl_domhsh_lock); spin_unlock(&netlbl_domhsh_lock);
} else if (entry->domain == NULL) { } else {
INIT_LIST_HEAD(&entry->list); INIT_LIST_HEAD(&entry->list);
spin_lock(&netlbl_domhsh_def_lock); spin_lock(&netlbl_domhsh_def_lock);
if (rcu_dereference(netlbl_domhsh_def) == NULL) if (rcu_dereference(netlbl_domhsh_def) == NULL)
@ -241,9 +238,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
else else
ret_val = -EEXIST; ret_val = -EEXIST;
spin_unlock(&netlbl_domhsh_def_lock); spin_unlock(&netlbl_domhsh_def_lock);
} else }
ret_val = -EINVAL;
audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_ADD, audit_info); audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_ADD, audit_info);
if (audit_buf != NULL) { if (audit_buf != NULL) {
audit_log_format(audit_buf, audit_log_format(audit_buf,
@ -262,7 +257,6 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0);
audit_log_end(audit_buf); audit_log_end(audit_buf);
} }
rcu_read_unlock(); rcu_read_unlock();
if (ret_val != 0) { if (ret_val != 0) {
@ -313,38 +307,30 @@ int netlbl_domhsh_remove(const char *domain, struct netlbl_audit *audit_info)
struct audit_buffer *audit_buf; struct audit_buffer *audit_buf;
rcu_read_lock(); rcu_read_lock();
if (domain != NULL) entry = netlbl_domhsh_search(domain, (domain != NULL ? 0 : 1));
entry = netlbl_domhsh_search(domain, 0);
else
entry = netlbl_domhsh_search(domain, 1);
if (entry == NULL) if (entry == NULL)
goto remove_return; goto remove_return;
switch (entry->type) { switch (entry->type) {
case NETLBL_NLTYPE_UNLABELED:
break;
case NETLBL_NLTYPE_CIPSOV4: case NETLBL_NLTYPE_CIPSOV4:
ret_val = cipso_v4_doi_domhsh_remove(entry->type_def.cipsov4, cipso_v4_doi_domhsh_remove(entry->type_def.cipsov4,
entry->domain); entry->domain);
if (ret_val != 0)
goto remove_return;
break; break;
} }
ret_val = 0;
if (entry != rcu_dereference(netlbl_domhsh_def)) { if (entry != rcu_dereference(netlbl_domhsh_def)) {
spin_lock(&netlbl_domhsh_lock); spin_lock(&netlbl_domhsh_lock);
if (entry->valid) { if (entry->valid) {
entry->valid = 0; entry->valid = 0;
list_del_rcu(&entry->list); list_del_rcu(&entry->list);
} else ret_val = 0;
ret_val = -ENOENT; }
spin_unlock(&netlbl_domhsh_lock); spin_unlock(&netlbl_domhsh_lock);
} else { } else {
spin_lock(&netlbl_domhsh_def_lock); spin_lock(&netlbl_domhsh_def_lock);
if (entry->valid) { if (entry->valid) {
entry->valid = 0; entry->valid = 0;
rcu_assign_pointer(netlbl_domhsh_def, NULL); rcu_assign_pointer(netlbl_domhsh_def, NULL);
} else ret_val = 0;
ret_val = -ENOENT; }
spin_unlock(&netlbl_domhsh_def_lock); spin_unlock(&netlbl_domhsh_def_lock);
} }
@ -357,11 +343,10 @@ int netlbl_domhsh_remove(const char *domain, struct netlbl_audit *audit_info)
audit_log_end(audit_buf); audit_log_end(audit_buf);
} }
if (ret_val == 0)
call_rcu(&entry->rcu, netlbl_domhsh_free_entry);
remove_return: remove_return:
rcu_read_unlock(); rcu_read_unlock();
if (ret_val == 0)
call_rcu(&entry->rcu, netlbl_domhsh_free_entry);
return ret_val; return ret_val;
} }

Просмотреть файл

@ -85,11 +85,9 @@ static const struct nla_policy netlbl_mgmt_genl_policy[NLBL_MGMT_A_MAX + 1] = {
*/ */
void netlbl_mgmt_protocount_inc(void) void netlbl_mgmt_protocount_inc(void)
{ {
rcu_read_lock();
spin_lock(&netlabel_mgmt_protocount_lock); spin_lock(&netlabel_mgmt_protocount_lock);
netlabel_mgmt_protocount++; netlabel_mgmt_protocount++;
spin_unlock(&netlabel_mgmt_protocount_lock); spin_unlock(&netlabel_mgmt_protocount_lock);
rcu_read_unlock();
} }
/** /**
@ -103,12 +101,10 @@ void netlbl_mgmt_protocount_inc(void)
*/ */
void netlbl_mgmt_protocount_dec(void) void netlbl_mgmt_protocount_dec(void)
{ {
rcu_read_lock();
spin_lock(&netlabel_mgmt_protocount_lock); spin_lock(&netlabel_mgmt_protocount_lock);
if (netlabel_mgmt_protocount > 0) if (netlabel_mgmt_protocount > 0)
netlabel_mgmt_protocount--; netlabel_mgmt_protocount--;
spin_unlock(&netlabel_mgmt_protocount_lock); spin_unlock(&netlabel_mgmt_protocount_lock);
rcu_read_unlock();
} }
/** /**

Просмотреть файл

@ -84,12 +84,10 @@ static void netlbl_unlabel_acceptflg_set(u8 value,
struct audit_buffer *audit_buf; struct audit_buffer *audit_buf;
u8 old_val; u8 old_val;
rcu_read_lock();
old_val = netlabel_unlabel_acceptflg;
spin_lock(&netlabel_unlabel_acceptflg_lock); spin_lock(&netlabel_unlabel_acceptflg_lock);
old_val = netlabel_unlabel_acceptflg;
netlabel_unlabel_acceptflg = value; netlabel_unlabel_acceptflg = value;
spin_unlock(&netlabel_unlabel_acceptflg_lock); spin_unlock(&netlabel_unlabel_acceptflg_lock);
rcu_read_unlock();
audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_ALLOW, audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_ALLOW,
audit_info); audit_info);

Просмотреть файл

@ -166,7 +166,7 @@ bad_mirred:
return TC_ACT_SHOT; return TC_ACT_SHOT;
} }
skb2 = skb_clone(skb, GFP_ATOMIC); skb2 = skb_act_clone(skb, GFP_ATOMIC);
if (skb2 == NULL) if (skb2 == NULL)
goto bad_mirred; goto bad_mirred;
if (m->tcfm_eaction != TCA_EGRESS_MIRROR && if (m->tcfm_eaction != TCA_EGRESS_MIRROR &&

Просмотреть файл

@ -107,7 +107,7 @@ struct sctp_shared_key *sctp_auth_shkey_create(__u16 key_id, gfp_t gfp)
} }
/* Free the shared key stucture */ /* Free the shared key stucture */
void sctp_auth_shkey_free(struct sctp_shared_key *sh_key) static void sctp_auth_shkey_free(struct sctp_shared_key *sh_key)
{ {
BUG_ON(!list_empty(&sh_key->key_list)); BUG_ON(!list_empty(&sh_key->key_list));
sctp_auth_key_put(sh_key->key); sctp_auth_key_put(sh_key->key);
@ -220,7 +220,7 @@ static struct sctp_auth_bytes *sctp_auth_make_key_vector(
/* Make a key vector based on our local parameters */ /* Make a key vector based on our local parameters */
struct sctp_auth_bytes *sctp_auth_make_local_vector( static struct sctp_auth_bytes *sctp_auth_make_local_vector(
const struct sctp_association *asoc, const struct sctp_association *asoc,
gfp_t gfp) gfp_t gfp)
{ {
@ -232,7 +232,7 @@ struct sctp_auth_bytes *sctp_auth_make_local_vector(
} }
/* Make a key vector based on peer's parameters */ /* Make a key vector based on peer's parameters */
struct sctp_auth_bytes *sctp_auth_make_peer_vector( static struct sctp_auth_bytes *sctp_auth_make_peer_vector(
const struct sctp_association *asoc, const struct sctp_association *asoc,
gfp_t gfp) gfp_t gfp)
{ {

Просмотреть файл

@ -170,6 +170,7 @@ __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32)
return crc32; return crc32;
} }
#if 0
__u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32) __u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32)
{ {
__u32 i; __u32 i;
@ -186,6 +187,7 @@ __u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32)
return crc32; return crc32;
} }
#endif /* 0 */
__u32 sctp_end_cksum(__u32 crc32) __u32 sctp_end_cksum(__u32 crc32)
{ {

Просмотреть файл

@ -553,7 +553,7 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,
if (copy > len) if (copy > len)
copy = len; copy = len;
sg_set_buf(&sg, skb->data + offset, copy); sg_init_one(&sg, skb->data + offset, copy);
err = icv_update(desc, &sg, copy); err = icv_update(desc, &sg, copy);
if (unlikely(err)) if (unlikely(err))
@ -576,6 +576,7 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,
if (copy > len) if (copy > len)
copy = len; copy = len;
sg_init_table(&sg, 1);
sg_set_page(&sg, frag->page, copy, sg_set_page(&sg, frag->page, copy,
frag->page_offset + offset-start); frag->page_offset + offset-start);