* Re: [PATCH v2] net: filter: Just In Time compiler
From: Eric Dumazet @ 2011-04-20 8:07 UTC (permalink / raw)
To: Avi Kivity
Cc: Hagen Paul Pfeifer, David Miller, netdev,
Arnaldo Carvalho de Melo, Ben Hutchings
In-Reply-To: <4DAE8E47.7040409@redhat.com>
Le mercredi 20 avril 2011 à 10:41 +0300, Avi Kivity a écrit :
> On 04/14/2011 07:05 PM, Eric Dumazet wrote:
> > Le jeudi 14 avril 2011 à 18:53 +0300, Avi Kivity a écrit :
> >
> > > IMO, it will. I'll try to have gcc optimize your example filter later.
> >
> > Sure you can JIT a C program from bpf. It should take maybe 30 minutes.
> > It certainly is more easy than JIT an binary/assembly code :)
> >
> > Now take a look how I call slowpath, I am not sure gcc will actually
> > generate better code because of C conventions.
>
> Some things will be the same (like calling a function outside the jit).
> Some things will be faster.
>
> > Loading a filter should be fast.
> > Invoking a compiler is just too much work for BPF.
> > Remember loading a filter is available to any user.
>
> Like I mentioned before, use the interpreter until the result of the
> jitter is available.
>
> > This idea would be good for netfilter stuff, because we dont load
> > iptables rules that often.
> >
> > But still, the netfilter mainloop can be converted as a kernel JIT, most
> > probably. All the complex stuff (matches, targets) must call external
> > procedures anyway.
>
> We could convert some matches to bytecode, probably.
>
> To avoid getting into an infinite loop (btw, does you jit avoid infinite
> loops in the generated code?) I'll restate what I think are an external
> jit's advantages and then stop harping on the subject:
>
> - less effort
> - less kernel code
> - better arch support
> - better optimization
> - better profiler/debugger integration
> - multiple optimization levels (can use your jitter in userspace, or
> gcc, or llvm)
>
No problem, I'll wait your work on this then.
I disagree having a gcc on production machines, I'm not sure it will
please admins...
Thanks
^ permalink raw reply
* Re: [PATCH v2] net: xen-netback: convert to hw_features
From: Ian Campbell @ 2011-04-20 7:58 UTC (permalink / raw)
To: Michał Mirosław
Cc: David S. Miller, netdev@vger.kernel.org,
xen-devel@lists.xensource.com
In-Reply-To: <20110419133905.GA4716@rere.qmqm.pl>
On Tue, 2011-04-19 at 14:39 +0100, Michał Mirosław wrote:
> On Tue, Apr 19, 2011 at 03:35:06PM +0200, Michał Mirosław wrote:
> > Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> > Acked-by: Ian Campbell <ian.campbell@citrix.com>
>
> David, I was too quick with this, so please wait with this patch until Ian
> acks it again.
Thanks Michał.
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Ian.
^ permalink raw reply
* Re: [Bugme-new] [Bug 33502] New: Caught 64-bit read from uninitialized memory in __alloc_skb
From: casteyde.christian @ 2011-04-20 7:45 UTC (permalink / raw)
To: Eric Dumazet
Cc: Pekka Enberg, Christoph Lameter, Andrew Morton, netdev,
bugzilla-daemon, bugme-daemon, casteyde.christian, Vegard Nossum
In-Reply-To: <1303279470.2756.17.camel@edumazet-laptop>
Quoting Eric Dumazet <eric.dumazet@gmail.com>:
> > Looks good to me! Can we get someone to test it as well?
>
> I tested first patch, but was not able to trigger the fault anyway
> without it. I'll try a bit more today if time permits...
>
> It would be nice if Christian can reproduce the initial problem easily
> and give us the steps...
>
>
>
>
Indeed I can reproduce each time I boot, however I didn't managed to apply the
patch to test it on -rc3 (neither -rc4), only the first hunk passed.
I simply boot on this laptop with kmemcheck activated to get the warning, with
vanilla -rc3. I've also tested -rc4 yersterday (without the patch therefore),
the warning was not the same (it's a bit later, I will post the dmesg output on
bugzilla tonight).
For info, my laptop is single core if that matters, it is preemptible, with
slub, 64bits, on an old CPU (Athlon64 3000 pre- lahf in 64bits).
^ permalink raw reply
* Re: [Bugme-new] [Bug 33502] New: Caught 64-bit read from uninitialized memory in __alloc_skb
From: Pekka Enberg @ 2011-04-20 7:49 UTC (permalink / raw)
To: casteyde.christian
Cc: Eric Dumazet, Christoph Lameter, Andrew Morton, netdev,
bugzilla-daemon, bugme-daemon, Vegard Nossum
In-Reply-To: <1303285519.4dae8f0fdf9b1@imp.free.fr>
On 4/20/11 10:45 AM, casteyde.christian@free.fr wrote:
> Indeed I can reproduce each time I boot, however I didn't managed to apply the
> patch to test it on -rc3 (neither -rc4), only the first hunk passed.
That's odd. Eric?
> I simply boot on this laptop with kmemcheck activated to get the warning, with
> vanilla -rc3. I've also tested -rc4 yersterday (without the patch therefore),
> the warning was not the same (it's a bit later, I will post the dmesg output on
> bugzilla tonight).
That's expected. You're unlikely to see the problem in the exact same
place across different kernel configs and versions.
Pekka
^ permalink raw reply
* Re: [PATCH v2] net: filter: Just In Time compiler
From: Avi Kivity @ 2011-04-20 7:41 UTC (permalink / raw)
To: Eric Dumazet
Cc: Hagen Paul Pfeifer, David Miller, netdev,
Arnaldo Carvalho de Melo, Ben Hutchings
In-Reply-To: <1302797147.3248.32.camel@edumazet-laptop>
On 04/14/2011 07:05 PM, Eric Dumazet wrote:
> Le jeudi 14 avril 2011 à 18:53 +0300, Avi Kivity a écrit :
>
> > IMO, it will. I'll try to have gcc optimize your example filter later.
>
> Sure you can JIT a C program from bpf. It should take maybe 30 minutes.
> It certainly is more easy than JIT an binary/assembly code :)
>
> Now take a look how I call slowpath, I am not sure gcc will actually
> generate better code because of C conventions.
Some things will be the same (like calling a function outside the jit).
Some things will be faster.
> Loading a filter should be fast.
> Invoking a compiler is just too much work for BPF.
> Remember loading a filter is available to any user.
Like I mentioned before, use the interpreter until the result of the
jitter is available.
> This idea would be good for netfilter stuff, because we dont load
> iptables rules that often.
>
> But still, the netfilter mainloop can be converted as a kernel JIT, most
> probably. All the complex stuff (matches, targets) must call external
> procedures anyway.
We could convert some matches to bytecode, probably.
To avoid getting into an infinite loop (btw, does you jit avoid infinite
loops in the generated code?) I'll restate what I think are an external
jit's advantages and then stop harping on the subject:
- less effort
- less kernel code
- better arch support
- better optimization
- better profiler/debugger integration
- multiple optimization levels (can use your jitter in userspace, or
gcc, or llvm)
--
error compiling committee.c: too many arguments to function
^ permalink raw reply
* [PATCH net-next-2.6 9/9] sctp: move chunk from retransmit queue to abandoned list
From: Wei Yongjun @ 2011-04-20 7:32 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
If there is still data waiting to retransmit and remain in
retransmit queue, while doing the next retransmit, if the
chunk is abandoned, we should move it to abandoned list.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
---
net/sctp/outqueue.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index 3e9d8d2..1c88c89 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -577,6 +577,13 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
* try to send as much as possible.
*/
list_for_each_entry_safe(chunk, chunk1, lqueue, transmitted_list) {
+ /* If the chunk is abandoned, move it to abandoned list. */
+ if (sctp_chunk_abandoned(chunk)) {
+ list_del_init(&chunk->transmitted_list);
+ sctp_insert_list(&q->abandoned,
+ &chunk->transmitted_list);
+ continue;
+ }
/* Make sure that Gap Acked TSNs are not retransmitted. A
* simple approach is just to move such TSNs out of the
--
1.6.5.2
^ permalink raw reply related
* [PATCH] bnx2x: dont dereference tcp header on non tcp frames
From: Eric Dumazet @ 2011-04-20 7:31 UTC (permalink / raw)
To: Dmitry Kravkov, David Miller; +Cc: Eilon Greenstein, netdev
In-Reply-To: <1303229503.3480.386.camel@edumazet-laptop>
Le mardi 19 avril 2011 à 18:11 +0200, Eric Dumazet a écrit :
> Hi guys
>
> bnx2x_set_pbd_csum() / bnx2x_set_pbd_csum_e2() seem to read
> tcp_hdrlen(skb) even for non TCP frames ?
>
> Also, (skb_network_header(skb) - skb->data) is signed, so
> (skb_network_header(skb) - skb->data) / 2 is a bit expensive...
>
I managed to trigger a kmemcheck fault using netperf -t UDP_RR
02:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM57711E 10Gigabit PCIe
[ 341.246514] WARNING: kmemcheck: Caught 8-bit read from uninitialized memory (ffff88011800ec30)
[ 341.247155] c0a8146ea907c4550009aa456ed2000008000400040000001400030000000000
[ 341.249789] i i i i i i i i i i i i i u u u u u u u u u u u u u u u u u u u
[ 341.252425] ^
[ 341.252773]
[ 341.252937] Pid: 4122, comm: netperf Not tainted 2.6.39-rc4-00237-ge3de956-dirty #549 HP ProLiant BL460c G6
[ 341.253768] RIP: 0010:[<ffffffff812f5224>] [<ffffffff812f5224>] bnx2x_start_xmit+0xce4/0x13f0
[ 341.254476] RSP: 0018:ffff8801158b38b8 EFLAGS: 00010286
[ 341.254879] RAX: ffff88011800ec24 RBX: ffff880118e44820 RCX: 0000000000000007
[ 341.255400] RDX: 000000000000000a RSI: ffff880118e44820 RDI: ffff88011800ec40
[ 341.255918] RBP: ffff8801158b39b8 R08: ffff88011800ec40 R09: ffff88011800ec00
[ 341.256439] R10: 0000000000000000 R11: 000000006e14a8c0 R12: ffff880118f4db00
[ 341.256958] R13: 0000000000000481 R14: 0000000000000040 R15: ffff880118ff18e0
[ 341.257479] FS: 0000000000000000(0000) GS:ffff88011fc00000(0063) knlGS:00000000f77e16c0
[ 341.258081] CS: 0010 DS: 002b ES: 002b CR0: 000000008005003b
[ 341.258511] CR2: ffff880119856058 CR3: 0000000115879000 CR4: 00000000000006f0
[ 341.259033] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 341.259551] DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
[ 341.260072] [<ffffffff8137fac5>] dev_hard_start_xmit+0x365/0x690
[ 341.260593] [<ffffffff81398bf7>] sch_direct_xmit+0xb7/0x1c0
[ 341.261091] [<ffffffff81383da8>] dev_queue_xmit+0x1a8/0x5d0
[ 341.261583] [<ffffffff813c2842>] ip_finish_output+0x122/0x2f0
[ 341.262122] [<ffffffff813c163e>] ip_output+0x7e/0xc0
[ 341.262609] [<ffffffff813c1194>] ip_local_out+0x24/0x30
[ 341.263114] [<ffffffff813c11b6>] ip_send_skb+0x16/0x70
[ 341.263611] [<ffffffff813e1326>] udp_send_skb+0x126/0x380
[ 341.264129] [<ffffffff813e300c>] udp_sendmsg+0x2cc/0x790
[ 341.264637] [<ffffffff813eaf44>] inet_sendmsg+0x84/0xc0
[ 341.265143] [<ffffffff8136d98b>] sock_sendmsg+0xbb/0xf0
[ 341.265646] [<ffffffff8136e1e5>] sys_sendto+0x105/0x140
[ 341.266151] [<ffffffff8136e22f>] sys_send+0xf/0x20
[ 341.266625] [<ffffffff813969fd>] compat_sys_socketcall+0xfd/0x1f0
[ 341.267186] [<ffffffff8146b8e9>] sysenter_dispatch+0x7/0x27
[PATCH] bnx2x: dont dereference tcp header on non tcp frames
bnx2x_set_pbd_csum() & bnx2x_set_pbd_csum_e2() use
tcp_hdrlen(skb) even for non TCP frames
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Dmitry Kravkov <dmitry@broadcom.com>
Cc: Eilon Greenstein <eilong@broadcom.com>
---
drivers/net/bnx2x/bnx2x_cmn.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c
index e83ac6d..a16a638 100644
--- a/drivers/net/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/bnx2x/bnx2x_cmn.c
@@ -2019,7 +2019,9 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
u32 *parsing_data, u32 xmit_type)
{
- *parsing_data |= ((tcp_hdrlen(skb)/4) <<
+ u8 tcphlen = (xmit_type & XMIT_CSUM_TCP) ? tcp_hdrlen(skb) : 0;
+
+ *parsing_data |= ((tcphlen/4) <<
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
@@ -2027,7 +2029,7 @@ static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
- return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
+ return skb_transport_header(skb) + tcphlen - skb->data;
}
/**
@@ -2044,6 +2046,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
u32 xmit_type)
{
u8 hlen = (skb_network_header(skb) - skb->data) / 2;
+ u8 tcphlen = (xmit_type & XMIT_CSUM_TCP) ? tcp_hdrlen(skb) : 0;
/* for now NS flag is not used in Linux */
pbd->global_data =
@@ -2053,7 +2056,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
pbd->ip_hlen_w = (skb_transport_header(skb) -
skb_network_header(skb)) / 2;
- hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2;
+ hlen += pbd->ip_hlen_w + tcphlen / 2;
pbd->total_hlen_w = cpu_to_le16(hlen);
hlen = hlen*2;
^ permalink raw reply related
* [PATCH net-next-2.6 8/9] sctp: make heartbeat information in sctp_make_heartbeat()
From: Wei Yongjun @ 2011-04-20 7:31 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
Make heartbeat information in sctp_make_heartbeat() instead
of make it in sctp_sf_heartbeat() directly for common using.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
---
include/net/sctp/sm.h | 4 +---
net/sctp/sm_make_chunk.c | 18 +++++++++++++-----
net/sctp/sm_statefuns.c | 11 +----------
3 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
index 9352d12..652f09b 100644
--- a/include/net/sctp/sm.h
+++ b/include/net/sctp/sm.h
@@ -232,9 +232,7 @@ struct sctp_chunk *sctp_make_violation_paramlen(const struct sctp_association *,
const struct sctp_chunk *,
struct sctp_paramhdr *);
struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *,
- const struct sctp_transport *,
- const void *payload,
- const size_t paylen);
+ const struct sctp_transport *);
struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *,
const struct sctp_chunk *,
const void *payload,
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index a7b65e9..58eb27f 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -1075,20 +1075,28 @@ nodata:
/* Make a HEARTBEAT chunk. */
struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc,
- const struct sctp_transport *transport,
- const void *payload, const size_t paylen)
+ const struct sctp_transport *transport)
{
- struct sctp_chunk *retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT,
- 0, paylen);
+ struct sctp_chunk *retval;
+ sctp_sender_hb_info_t hbinfo;
+
+ retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT, 0, sizeof(hbinfo));
if (!retval)
goto nodata;
+ hbinfo.param_hdr.type = SCTP_PARAM_HEARTBEAT_INFO;
+ hbinfo.param_hdr.length = htons(sizeof(sctp_sender_hb_info_t));
+ hbinfo.daddr = transport->ipaddr;
+ hbinfo.sent_at = jiffies;
+ hbinfo.hb_nonce = transport->hb_nonce;
+
/* Cast away the 'const', as this is just telling the chunk
* what transport it belongs to.
*/
retval->transport = (struct sctp_transport *) transport;
- retval->subh.hbs_hdr = sctp_addto_chunk(retval, paylen, payload);
+ retval->subh.hbs_hdr = sctp_addto_chunk(retval, sizeof(hbinfo),
+ &hbinfo);
nodata:
return retval;
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index ab94932..736847e 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -941,18 +941,9 @@ static sctp_disposition_t sctp_sf_heartbeat(const struct sctp_endpoint *ep,
{
struct sctp_transport *transport = (struct sctp_transport *) arg;
struct sctp_chunk *reply;
- sctp_sender_hb_info_t hbinfo;
- size_t paylen = 0;
-
- hbinfo.param_hdr.type = SCTP_PARAM_HEARTBEAT_INFO;
- hbinfo.param_hdr.length = htons(sizeof(sctp_sender_hb_info_t));
- hbinfo.daddr = transport->ipaddr;
- hbinfo.sent_at = jiffies;
- hbinfo.hb_nonce = transport->hb_nonce;
/* Send a heartbeat to our peer. */
- paylen = sizeof(sctp_sender_hb_info_t);
- reply = sctp_make_heartbeat(asoc, transport, &hbinfo, paylen);
+ reply = sctp_make_heartbeat(asoc, transport);
if (!reply)
return SCTP_DISPOSITION_NOMEM;
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 7/9] sctp: fix to check the source address of COOKIE-ECHO chunk
From: Wei Yongjun @ 2011-04-20 7:30 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
SCTP does not check whether the source address of COOKIE-ECHO
chunk is the original address of INIT chunk or part of the any
address parameters saved in COOKIE in CLOSED state. So even if
the COOKIE-ECHO chunk is from any address but with correct COOKIE,
the COOKIE-ECHO chunk still be accepted. If the COOKIE is not from
a valid address, the assoc should not be established.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
---
include/net/sctp/structs.h | 2 +-
net/sctp/sm_make_chunk.c | 26 +++++++++++++++++++++-----
net/sctp/sm_sideeffect.c | 3 +--
net/sctp/sm_statefuns.c | 14 +++++---------
4 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 0f6e60a..5c9bada 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -1400,7 +1400,7 @@ int sctp_has_association(const union sctp_addr *laddr,
int sctp_verify_init(const struct sctp_association *asoc, sctp_cid_t,
sctp_init_chunk_t *peer_init, struct sctp_chunk *chunk,
struct sctp_chunk **err_chunk);
-int sctp_process_init(struct sctp_association *, sctp_cid_t cid,
+int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk,
const union sctp_addr *peer,
sctp_init_chunk_t *init, gfp_t gfp);
__u32 sctp_generate_tag(const struct sctp_endpoint *);
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index f87ccb1..a7b65e9 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -2242,14 +2242,17 @@ int sctp_verify_init(const struct sctp_association *asoc,
* Returns 0 on failure, else success.
* FIXME: This is an association method.
*/
-int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
+int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
const union sctp_addr *peer_addr,
sctp_init_chunk_t *peer_init, gfp_t gfp)
{
union sctp_params param;
struct sctp_transport *transport;
struct list_head *pos, *temp;
+ struct sctp_af *af;
+ union sctp_addr addr;
char *cookie;
+ int src_match = 0;
/* We must include the address that the INIT packet came from.
* This is the only address that matters for an INIT packet.
@@ -2261,18 +2264,31 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
* added as the primary transport. The source address seems to
* be a a better choice than any of the embedded addresses.
*/
- if (peer_addr) {
- if(!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
- goto nomem;
- }
+ if(!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
+ goto nomem;
+
+ if (sctp_cmp_addr_exact(sctp_source(chunk), peer_addr))
+ src_match = 1;
/* Process the initialization parameters. */
sctp_walk_params(param, peer_init, init_hdr.params) {
+ if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
+ param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
+ af = sctp_get_af_specific(param_type2af(param.p->type));
+ af->from_addr_param(&addr, param.addr,
+ chunk->sctp_hdr->source, 0);
+ if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
+ src_match = 1;
+ }
if (!sctp_process_param(asoc, param, peer_addr, gfp))
goto clean_up;
}
+ /* source address of chunk may not match any valid address */
+ if (!src_match)
+ goto clean_up;
+
/* AUTH: After processing the parameters, make sure that we
* have all the required info to potentially do authentications.
*/
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
index 3b80fe2..d612ca1 100644
--- a/net/sctp/sm_sideeffect.c
+++ b/net/sctp/sm_sideeffect.c
@@ -595,8 +595,7 @@ static int sctp_cmd_process_init(sctp_cmd_seq_t *commands,
* fail during INIT processing (due to malloc problems),
* just return the error and stop processing the stack.
*/
- if (!sctp_process_init(asoc, chunk->chunk_hdr->type,
- sctp_source(chunk), peer_init, gfp))
+ if (!sctp_process_init(asoc, chunk, sctp_source(chunk), peer_init, gfp))
error = -ENOMEM;
else
error = 0;
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index ad3b43b..ab94932 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -393,8 +393,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
goto nomem_init;
/* The call, sctp_process_init(), can fail on memory allocation. */
- if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type,
- sctp_source(chunk),
+ if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk),
(sctp_init_chunk_t *)chunk->chunk_hdr,
GFP_ATOMIC))
goto nomem_init;
@@ -725,7 +724,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
*/
peer_init = &chunk->subh.cookie_hdr->c.peer_init[0];
- if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type,
+ if (!sctp_process_init(new_asoc, chunk,
&chunk->subh.cookie_hdr->c.peer_addr,
peer_init, GFP_ATOMIC))
goto nomem_init;
@@ -1464,8 +1463,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
* Verification Tag and Peers Verification tag into a reserved
* place (local tie-tag and per tie-tag) within the state cookie.
*/
- if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type,
- sctp_source(chunk),
+ if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk),
(sctp_init_chunk_t *)chunk->chunk_hdr,
GFP_ATOMIC))
goto nomem;
@@ -1694,8 +1692,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(const struct sctp_endpoint *ep,
*/
peer_init = &chunk->subh.cookie_hdr->c.peer_init[0];
- if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type,
- sctp_source(chunk), peer_init,
+ if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk), peer_init,
GFP_ATOMIC))
goto nomem;
@@ -1780,8 +1777,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep,
* side effects--it is safe to run them here.
*/
peer_init = &chunk->subh.cookie_hdr->c.peer_init[0];
- if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type,
- sctp_source(chunk), peer_init,
+ if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk), peer_init,
GFP_ATOMIC))
goto nomem;
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 6/9] sctp: handle ootb packet in chunk order as defined
From: Wei Yongjun @ 2011-04-20 7:30 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
From: Shan Wei <shanwei@cn.fujitsu.com>
Changed the order of processing SHUTDOWN ACK and COOKIE ACK
refer to section 8.4:Handle "Out of the Blue" Packets.
SHUTDOWN ACK chunk should be processed before processing
"Stale Cookie" ERROR or a COOKIE ACK.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Shan Wei <shanwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
---
net/sctp/input.c | 15 ---------------
net/sctp/sm_statefuns.c | 21 +++++++++++++++++++++
2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/net/sctp/input.c b/net/sctp/input.c
index 30cec77..3a8eb79 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -661,7 +661,6 @@ static int sctp_rcv_ootb(struct sk_buff *skb)
{
sctp_chunkhdr_t *ch;
__u8 *ch_end;
- sctp_errhdr_t *err;
ch = (sctp_chunkhdr_t *) skb->data;
@@ -697,20 +696,6 @@ static int sctp_rcv_ootb(struct sk_buff *skb)
if (SCTP_CID_INIT == ch->type && (void *)ch != skb->data)
goto discard;
- /* RFC 8.4, 7) If the packet contains a "Stale cookie" ERROR
- * or a COOKIE ACK the SCTP Packet should be silently
- * discarded.
- */
- if (SCTP_CID_COOKIE_ACK == ch->type)
- goto discard;
-
- if (SCTP_CID_ERROR == ch->type) {
- sctp_walk_errors(err, ch) {
- if (SCTP_ERROR_STALE_COOKIE == err->cause)
- goto discard;
- }
- }
-
ch = (sctp_chunkhdr_t *) ch_end;
} while (ch_end < skb_tail_pointer(skb));
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index 194d5ec..ad3b43b 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -3332,8 +3332,10 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
struct sctp_chunk *chunk = arg;
struct sk_buff *skb = chunk->skb;
sctp_chunkhdr_t *ch;
+ sctp_errhdr_t *err;
__u8 *ch_end;
int ootb_shut_ack = 0;
+ int ootb_cookie_ack = 0;
SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
@@ -3358,6 +3360,23 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
if (SCTP_CID_ABORT == ch->type)
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
+ /* RFC 8.4, 7) If the packet contains a "Stale cookie" ERROR
+ * or a COOKIE ACK the SCTP Packet should be silently
+ * discarded.
+ */
+
+ if (SCTP_CID_COOKIE_ACK == ch->type)
+ ootb_cookie_ack = 1;
+
+ if (SCTP_CID_ERROR == ch->type) {
+ sctp_walk_errors(err, ch) {
+ if (SCTP_ERROR_STALE_COOKIE == err->cause) {
+ ootb_cookie_ack = 1;
+ break;
+ }
+ }
+ }
+
/* Report violation if chunk len overflows */
ch_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length));
if (ch_end > skb_tail_pointer(skb))
@@ -3369,6 +3388,8 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
if (ootb_shut_ack)
return sctp_sf_shut_8_4_5(ep, asoc, type, arg, commands);
+ else if (ootb_cookie_ack)
+ return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
else
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
}
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 5/9] sctp: bail from sctp_endpoint_lookup_assoc() if not bound
From: Wei Yongjun @ 2011-04-20 7:29 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
From: Vlad Yasevich <vladislav.yasevich@hp.com>
The sctp_endpoint_lookup_assoc() function uses a port hash
to lookup the association and then checks to see if any of
them are on the current endpoint. However, if the current
endpoint is not bound, there can't be any associations on
it, thus we can bail early.
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
net/sctp/endpointola.c | 20 ++++++++++++++------
1 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
index e10acc0..c8cc24e 100644
--- a/net/sctp/endpointola.c
+++ b/net/sctp/endpointola.c
@@ -325,6 +325,7 @@ static struct sctp_association *__sctp_endpoint_lookup_assoc(
struct sctp_transport **transport)
{
struct sctp_association *asoc = NULL;
+ struct sctp_association *tmp;
struct sctp_transport *t = NULL;
struct sctp_hashbucket *head;
struct sctp_ep_common *epb;
@@ -333,25 +334,32 @@ static struct sctp_association *__sctp_endpoint_lookup_assoc(
int rport;
*transport = NULL;
+
+ /* If the local port is not set, there can't be any associations
+ * on this endpoint.
+ */
+ if (!ep->base.bind_addr.port)
+ goto out;
+
rport = ntohs(paddr->v4.sin_port);
hash = sctp_assoc_hashfn(ep->base.bind_addr.port, rport);
head = &sctp_assoc_hashtable[hash];
read_lock(&head->lock);
sctp_for_each_hentry(epb, node, &head->chain) {
- asoc = sctp_assoc(epb);
- if (asoc->ep != ep || rport != asoc->peer.port)
- goto next;
+ tmp = sctp_assoc(epb);
+ if (tmp->ep != ep || rport != tmp->peer.port)
+ continue;
- t = sctp_assoc_lookup_paddr(asoc, paddr);
+ t = sctp_assoc_lookup_paddr(tmp, paddr);
if (t) {
+ asoc = tmp;
*transport = t;
break;
}
-next:
- asoc = NULL;
}
read_unlock(&head->lock);
+out:
return asoc;
}
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 4/9] sctp: remove completely unsed EMPTY state
From: Wei Yongjun @ 2011-04-20 7:28 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
From: Vlad Yasevich <vladislav.yasevich@hp.com>
SCTP does not SCTP_STATE_EMPTY and we can never be in
that state. Remove useless code.
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
include/net/sctp/constants.h | 17 ++++-----
net/sctp/debug.c | 1 -
net/sctp/outqueue.c | 1 -
net/sctp/sm_statetable.c | 76 ------------------------------------------
4 files changed, 8 insertions(+), 87 deletions(-)
diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h
index deac13d..942b864 100644
--- a/include/net/sctp/constants.h
+++ b/include/net/sctp/constants.h
@@ -187,15 +187,14 @@ typedef enum {
/* SCTP state defines for internal state machine */
typedef enum {
- SCTP_STATE_EMPTY = 0,
- SCTP_STATE_CLOSED = 1,
- SCTP_STATE_COOKIE_WAIT = 2,
- SCTP_STATE_COOKIE_ECHOED = 3,
- SCTP_STATE_ESTABLISHED = 4,
- SCTP_STATE_SHUTDOWN_PENDING = 5,
- SCTP_STATE_SHUTDOWN_SENT = 6,
- SCTP_STATE_SHUTDOWN_RECEIVED = 7,
- SCTP_STATE_SHUTDOWN_ACK_SENT = 8,
+ SCTP_STATE_CLOSED = 0,
+ SCTP_STATE_COOKIE_WAIT = 1,
+ SCTP_STATE_COOKIE_ECHOED = 2,
+ SCTP_STATE_ESTABLISHED = 3,
+ SCTP_STATE_SHUTDOWN_PENDING = 4,
+ SCTP_STATE_SHUTDOWN_SENT = 5,
+ SCTP_STATE_SHUTDOWN_RECEIVED = 6,
+ SCTP_STATE_SHUTDOWN_ACK_SENT = 7,
} sctp_state_t;
diff --git a/net/sctp/debug.c b/net/sctp/debug.c
index bf24fa6..ec997cf 100644
--- a/net/sctp/debug.c
+++ b/net/sctp/debug.c
@@ -98,7 +98,6 @@ const char *sctp_cname(const sctp_subtype_t cid)
/* These are printable forms of the states. */
const char *const sctp_state_tbl[SCTP_STATE_NUM_STATES] = {
- "STATE_EMPTY",
"STATE_CLOSED",
"STATE_COOKIE_WAIT",
"STATE_COOKIE_ECHOED",
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index 7812772..3e9d8d2 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -320,7 +320,6 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
* chunk.
*/
switch (q->asoc->state) {
- case SCTP_STATE_EMPTY:
case SCTP_STATE_CLOSED:
case SCTP_STATE_SHUTDOWN_PENDING:
case SCTP_STATE_SHUTDOWN_SENT:
diff --git a/net/sctp/sm_statetable.c b/net/sctp/sm_statetable.c
index 546d438..881196b 100644
--- a/net/sctp/sm_statetable.c
+++ b/net/sctp/sm_statetable.c
@@ -107,8 +107,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
#define TYPE_SCTP_FUNC(func) {.fn = func, .name = #func}
#define TYPE_SCTP_DATA { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -128,8 +126,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_DATA */
#define TYPE_SCTP_INIT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_do_5_1B_init), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -149,8 +145,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_INIT */
#define TYPE_SCTP_INIT_ACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_do_5_2_3_initack), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -170,8 +164,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_INIT_ACK */
#define TYPE_SCTP_SACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -191,8 +183,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_SACK */
#define TYPE_SCTP_HEARTBEAT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -213,8 +203,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_HEARTBEAT */
#define TYPE_SCTP_HEARTBEAT_ACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -234,8 +222,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_HEARTBEAT_ACK */
#define TYPE_SCTP_ABORT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_pdiscard), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -255,8 +241,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_ABORT */
#define TYPE_SCTP_SHUTDOWN { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -276,8 +260,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_SHUTDOWN */
#define TYPE_SCTP_SHUTDOWN_ACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -297,8 +279,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_SHUTDOWN_ACK */
#define TYPE_SCTP_ERROR { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -318,8 +298,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_ERROR */
#define TYPE_SCTP_COOKIE_ECHO { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_do_5_1D_ce), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -339,8 +317,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_COOKIE_ECHO */
#define TYPE_SCTP_COOKIE_ACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -360,8 +336,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_COOKIE_ACK */
#define TYPE_SCTP_ECN_ECNE { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -381,8 +355,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_ECN_ECNE */
#define TYPE_SCTP_ECN_CWR { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -402,8 +374,6 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
} /* TYPE_SCTP_ECN_CWR */
#define TYPE_SCTP_SHUTDOWN_COMPLETE { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -446,8 +416,6 @@ static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][
}; /* state_fn_t chunk_event_table[][] */
#define TYPE_SCTP_ASCONF { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -467,8 +435,6 @@ static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][
} /* TYPE_SCTP_ASCONF */
#define TYPE_SCTP_ASCONF_ACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -496,8 +462,6 @@ static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_
}; /*state_fn_t addip_chunk_event_table[][] */
#define TYPE_SCTP_FWD_TSN { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -524,8 +488,6 @@ static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUN
}; /*state_fn_t prsctp_chunk_event_table[][] */
#define TYPE_SCTP_AUTH { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ootb), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -553,8 +515,6 @@ static const sctp_sm_table_entry_t auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TY
static const sctp_sm_table_entry_t
chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
- /* SCTP_STATE_EMPTY */
- TYPE_SCTP_FUNC(sctp_sf_ootb),
/* SCTP_STATE_CLOSED */
TYPE_SCTP_FUNC(sctp_sf_ootb),
/* SCTP_STATE_COOKIE_WAIT */
@@ -575,8 +535,6 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
#define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -596,8 +554,6 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
#define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -617,8 +573,6 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
#define TYPE_SCTP_PRIMITIVE_ABORT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -638,8 +592,6 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
} /* TYPE_SCTP_PRIMITIVE_ABORT */
#define TYPE_SCTP_PRIMITIVE_SEND { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -659,8 +611,6 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
} /* TYPE_SCTP_PRIMITIVE_SEND */
#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -680,8 +630,6 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
#define TYPE_SCTP_PRIMITIVE_ASCONF { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -713,8 +661,6 @@ static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPE
};
#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -734,8 +680,6 @@ static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPE
}
#define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -760,8 +704,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
};
#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -781,8 +723,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -802,8 +742,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -823,8 +761,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -844,8 +780,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -865,8 +799,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -886,8 +818,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -907,8 +837,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -928,8 +856,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_bug), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
@@ -949,8 +875,6 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
}
#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
- /* SCTP_STATE_EMPTY */ \
- TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_COOKIE_WAIT */ \
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 3/9] sctp: remove redundant check when walking through a list of TLV parameters
From: Wei Yongjun @ 2011-04-20 7:27 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
From: Shan Wei <shanwei@cn.fujitsu.com>
When pos.v <= (void *)chunk + end - ntohs(pos.p->length) and
ntohs(pos.p->length) >= sizeof(sctp_paramhdr_t) these two expressions are all true,
pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) *must* be true.
This patch removes this kind of redundant check.
It's same to _sctp_walk_errors macro.
Signed-off-by: Shan Wei <shanwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
include/net/sctp/sctp.h | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 505845d..7e8e34c 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -531,7 +531,6 @@ _sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member)
#define _sctp_walk_params(pos, chunk, end, member)\
for (pos.v = chunk->member;\
- pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) &&\
pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
ntohs(pos.p->length) >= sizeof(sctp_paramhdr_t);\
pos.v += WORD_ROUND(ntohs(pos.p->length)))
@@ -542,7 +541,6 @@ _sctp_walk_errors((err), (chunk_hdr), ntohs((chunk_hdr)->length))
#define _sctp_walk_errors(err, chunk_hdr, end)\
for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \
sizeof(sctp_chunkhdr_t));\
- (void *)err <= (void *)chunk_hdr + end - sizeof(sctp_errhdr_t) &&\
(void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\
ntohs(err->length) >= sizeof(sctp_errhdr_t); \
err = (sctp_errhdr_t *)((void *)err + WORD_ROUND(ntohs(err->length))))
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 2/9] sctp: check invalid value of length parameter in error cause
From: Wei Yongjun @ 2011-04-20 7:26 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
From: Shan Wei <shanwei@cn.fujitsu.com>
RFC4960, section 3.3.7 said:
If an endpoint receives an ABORT with a format error or no TCB is
found, it MUST silently discard it.
When an endpoint receives ABORT that parameter value is invalid,
drop it.
Signed-off-by: Shan Wei <shanwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
net/sctp/sm_statefuns.c | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index fe2036d..194d5ec 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -2412,8 +2412,15 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
/* See if we have an error cause code in the chunk. */
len = ntohs(chunk->chunk_hdr->length);
- if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr))
+ if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr)) {
+
+ sctp_errhdr_t *err;
+ sctp_walk_errors(err, chunk->chunk_hdr);
+ if ((void *)err != (void *)chunk->chunk_end)
+ return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
+
error = ((sctp_errhdr_t *)chunk->skb->data)->cause;
+ }
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
/* ASSOC_FAILED will DELETE_TCB. */
--
1.6.5.2
^ permalink raw reply related
* [PATCH net-next-2.6 1/9] sctp: check parameter value of length in ERROR chunk
From: Wei Yongjun @ 2011-04-20 7:25 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
In-Reply-To: <4DAE8A27.3040007@cn.fujitsu.com>
From: Shan Wei <shanwei@cn.fujitsu.com>
When an endpoint receives ERROR that parameter value is invalid,
send an ABORT to peer with a Protocol Violation error code.
Signed-off-by: Shan Wei <shanwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
net/sctp/sm_statefuns.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index c085472..fe2036d 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -3204,6 +3204,7 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
sctp_cmd_seq_t *commands)
{
struct sctp_chunk *chunk = arg;
+ sctp_errhdr_t *err;
if (!sctp_vtag_verify(chunk, asoc))
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
@@ -3212,6 +3213,10 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_operr_chunk_t)))
return sctp_sf_violation_chunklen(ep, asoc, type, arg,
commands);
+ sctp_walk_errors(err, chunk->chunk_hdr);
+ if ((void *)err != (void *)chunk->chunk_end)
+ return sctp_sf_violation_paramlen(ep, asoc, type, arg,
+ (void *)err, commands);
sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
SCTP_CHUNK(chunk));
--
1.6.5.2
^ permalink raw reply related
* Re: [RFC v3 5/6] j1939: rename NAME to UUID?
From: Kurt Van Dijck @ 2011-04-20 7:24 UTC (permalink / raw)
To: Oliver Hartkopp
Cc: socketcan-core-0fE9KPoRgkgATYTw5x5z8w,
netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <4DA88705.5040203-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
On Fri, Apr 15, 2011 at 07:57:25PM +0200, Oliver Hartkopp wrote:
> On 13.04.2011 06:49, Kurt Van Dijck wrote:
> > Oliver et.al.,
>
> Thinking about the approach to implement the j1939 address claiming (AC) in
> userspace, i discovered two ways which could both be hidden inside some
> easy-to-use helper functions:
>
> 1. implement a thread (e.g. within a library) which opens a CAN_RAW socket on
> a specific CAN-interface and takes care of the AC procedure and monitors
> ongoing AC procedures on the bus. In this case every j1939 application
> requiring AC internally would monitor all the AC handling on itself (which
> should be no general problem - written only once).
>
> 2. create j1939ac daemon(s) using PF_UNIX-sockets to be named e.g.
> j1939ac_can0, j1939ac_can1, etc. - these daemons take care for all AC
> requirements of the host it is running on. The PF_UNIX-sockets are used in
> SOCK_DGRAM mode and only the j1939 processes that need AC can then register
> their NAME by sending a request datagram, and get back the j1939-address once
> it is claimed (and all the updates on changes). As the j1939ac daemons are
> running on the same host as the j1939 application processes, optional the
> process' PID could be provided to the daemon during the registering process,
> so that the daemon can send a signal to a signal handler of the application
> process (if you would like to omit the select() syscall to handle both the
> j1939 and PF_UNIX sockets).
>
> -> <Req><Name="A3B5667799332242" PID="12345">
> <- <Resp><ACState="claimed" Name="A3B5667799332242" Address="1B">
> (some time)
> <- <Resp><ACState="changed" Name="A3B5667799332242" Address="1C">
>
> This is a sketch that could be put into simple C-structs that are sent via the
> PF_UNIX DGRAM socket.
>
> In all suggested cases (using a thread, daemon with/without signal) the AC
> procedure can be managed in userspace without real pain.
I seriously doubt this statement.
define 'real pain'.
> But especially with
> less pain than putting the AC process into kernelspace and provide your
> suggested socket API with bind/connect/... in very different manners.
* You're only counting LOC in kernel, and not in userspace.
* The constructs you present create some kind of infrastructure. You will
need a torough documentation of the 'good practice' since that's crucial
to the correct operation of the stack. Did you ever consider the impact
on the userspace application side.
Remember that userspace programs should be easy to write.
I found your proposals impact application development very hard.
I still think my passive support in kernel performs better and gives an
easier API to get things done with.
I have it all operating, both embedded and on dual-core 64bit system.
I need to git pull the latest updates, and I'll send a revised patchset
tomorrow.
Kind regards,
Kurt
^ permalink raw reply
* [PATCH net-next-2.6 0/9] SCTP updates for net-next-2.6
From: Wei Yongjun @ 2011-04-20 7:24 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, lksctp
Hi David
Here is a set of SCTP patches for net-next-2.6, also from vlad's
lksctp-dev tree. Please apply.
Shan Wei (4):
sctp: check parameter value of length in ERROR chunk
sctp: check invalid value of length parameter in error cause
sctp: remove redundant check when walking through a list of TLV parameters
sctp: handle ootb packet in chunk order as defined
Vlad Yasevich (2):
sctp: remove completely unsed EMPTY state
sctp: bail from sctp_endpoint_lookup_assoc() if not bound.
Wei Yongjun (3):
sctp: fix to check the source address of COOKIE-ECHO chunk
sctp: make heartbeat information in sctp_make_heartbeat()
sctp: move chunk from retransmit queue to abandoned list
include/net/sctp/constants.h | 17 ++++-----
include/net/sctp/sctp.h | 2 -
include/net/sctp/sm.h | 4 +--
include/net/sctp/structs.h | 2 +-
net/sctp/debug.c | 1 -
net/sctp/endpointola.c | 20 ++++++++---
net/sctp/input.c | 15 --------
net/sctp/outqueue.c | 8 ++++-
net/sctp/sm_make_chunk.c | 44 +++++++++++++++++++-----
net/sctp/sm_sideeffect.c | 3 +-
net/sctp/sm_statefuns.c | 60 ++++++++++++++++++++++-----------
net/sctp/sm_statetable.c | 76 ------------------------------------------
12 files changed, 106 insertions(+), 146 deletions(-)
^ permalink raw reply
* Re: [RFC v3 5/6] j1939: rename NAME to UUID?
From: Kurt Van Dijck @ 2011-04-20 7:10 UTC (permalink / raw)
To: Oliver Hartkopp
Cc: socketcan-core-0fE9KPoRgkgATYTw5x5z8w,
netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <4DA88705.5040203-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
On Fri, Apr 15, 2011 at 07:57:25PM +0200, Oliver Hartkopp wrote:
> On 13.04.2011 06:49, Kurt Van Dijck wrote:
> > Oliver et.al.,
> >
> > On Sun, Mar 20, 2011 at 04:56:46PM +0100, Oliver Hartkopp wrote:
> >> On 14.03.2011 14:59, Kurt Van Dijck wrote:
> >>
> >> Then you suggest to attach static and/or dynamic addresses to the interface.
> >>
> >>> + Assigning addresses is done via
> >>> + $ ip addr add dev canX j1939 0xXX
> >>> + statically or
> >>> + $ ip addr add dev canX j1939 name 0xXX
> >>> + dynamically. In the latter case, address claiming must take place
> >>> + before other traffic can leave.
> >>
> >> like you would have using DHCP/DNS (adapted for j1939) ...
> >>
> > I suspect the confustion with DHCP/DNS comes free with the used terminology.
> >
> > Specifications talk about a 64bit NAME, where is actually is a 64bit UUID.
> > Calling this number a UUID may clarify things, but leaves the spec in the
> > terminology.
> >
> > one would then do:
> > $ ip addr add dev canX j1939 uuid XXXX
> >
> > Would that be a good way to progress?
>
> Hello Kurt,
>
> i don't know if it helps - at least for j1939 users - to rename the NAME for
> j1939 address claiming to UUID which is usually 128 bit long an has a pretty
> different understanding than the J1939 NAME which stands for
>
> 1. Arbitrary address bit
> 2. Industry group, length 3 bits
> 3. Vehicle system instance, length 4 bits
> 4. Vehicle system, length 7 bits
> 5. Reserved bit
> 6. Function, length 8 bits
> 7. Function instance, length 5 bits
> 8. ECU instance, length 3 bits
> 9. Manufacturer code, length 11 bits
> 10. Identity number, length 21 bits
>
> (from http://www.kvaser.com/en/about-can/higher-layer-protocols/36.html)
>
> This is not comparable to the ideas from RFC 4122 ...
please note that for address claiming, this interpretation should not be used
as such, and the whole 64bit NAME is regarded as a 'Unique Number' :-)
I was not aware of RFC 4122 :-)
Never mind this idea, I'll stick to 'NAME' as that is what j1939 users
are used to. I wanted to avoid people thinking on DNS, but I should not
introduce other misunderstandings.
Kurt
^ permalink raw reply
* Re: [Bugme-new] [Bug 33502] New: Caught 64-bit read from uninitialized memory in __alloc_skb
From: Eric Dumazet @ 2011-04-20 6:04 UTC (permalink / raw)
To: Pekka Enberg
Cc: Christoph Lameter, Andrew Morton, netdev, bugzilla-daemon,
bugme-daemon, casteyde.christian, Vegard Nossum
In-Reply-To: <4DAE7579.3020400@cs.helsinki.fi>
Le mercredi 20 avril 2011 à 08:56 +0300, Pekka Enberg a écrit :
> On 4/19/11 11:17 PM, Eric Dumazet wrote:
> > Le mardi 19 avril 2011 à 12:10 -0500, Christoph Lameter a écrit :
> >> On Tue, 19 Apr 2011, Eric Dumazet wrote:
> >>
> >>> }
> >>> }
> >>>
> >>> -#ifdef CONFIG_CMPXCHG_LOCAL
> >>> +#if defined(CONFIG_CMPXCHG_LOCAL)&& \
> >>> + !defined(CONFIG_KMEMCHECK)&& !defined(DEBUG_PAGEALLOC)
> >>> +#define SLUB_USE_CMPXCHG_DOUBLE
> >>> +#endif
> >>> +
> >>> +#ifdef SLUB_USE_CMPXCHG_DOUBLE
> >>> #ifdef CONFIG_PREEMPT
> >>> /*
> >> Ugg.. Isnt there some way to indicate to kmemcheck that a speculative
> >> access is occurring?
> > Yes, here is a totally untested patch (only compiled here), to keep
> > kmemcheck& cmpxchg_double together.
>
> Looks good to me! Can we get someone to test it as well?
I tested first patch, but was not able to trigger the fault anyway
without it. I'll try a bit more today if time permits...
It would be nice if Christian can reproduce the initial problem easily
and give us the steps...
^ permalink raw reply
* Re: [PATCH v2] net: qlcnic: convert to hw_features
From: Anirban Chakraborty @ 2011-04-20 5:56 UTC (permalink / raw)
To: Michał Mirosław; +Cc: netdev, Amit Salecha, Linux Driver
In-Reply-To: <20110419130357.40FA813909@rere.qmqm.pl>
On Apr 19, 2011, at 6:03 AM, Michał Mirosław wrote:
> Bit more than minimal conversion. There might be some issues because
> of qlcnic_set_netdev_features() if it's called after netdev init.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> v2: fix compilation issues (I forgot to 'stg refresh' before sending v1)
>
> drivers/net/qlcnic/qlcnic.h | 3 +-
> drivers/net/qlcnic/qlcnic_ethtool.c | 120 -----------------------------------
> drivers/net/qlcnic/qlcnic_hw.c | 37 +++++++++++
> drivers/net/qlcnic/qlcnic_init.c | 4 +-
> drivers/net/qlcnic/qlcnic_main.c | 35 +++++------
> 5 files changed, 57 insertions(+), 142 deletions(-)
>
> diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h
> index e5d3053..fa5b15c 100644
> --- a/drivers/net/qlcnic/qlcnic.h
> +++ b/drivers/net/qlcnic/qlcnic.h
> @@ -926,7 +926,6 @@ struct qlcnic_adapter {
> u8 max_rds_rings;
> u8 max_sds_rings;
> u8 msix_supported;
> - u8 rx_csum;
> u8 portnum;
> u8 physical_port;
> u8 reset_context;
> @@ -1247,6 +1246,8 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup);
>
> int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
> int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
> +u32 qlcnic_fix_features(struct net_device *netdev, u32 features);
> +int qlcnic_set_features(struct net_device *netdev, u32 features);
> int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter, int enable);
> int qlcnic_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable);
> int qlcnic_send_lro_cleanup(struct qlcnic_adapter *adapter);
> diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c
> index 3cd8a16..615a5ab 100644
> --- a/drivers/net/qlcnic/qlcnic_ethtool.c
> +++ b/drivers/net/qlcnic/qlcnic_ethtool.c
> @@ -764,73 +764,6 @@ qlcnic_get_ethtool_stats(struct net_device *dev,
> qlcnic_fill_device_stats(&index, data, &port_stats.tx);
> }
>
> -static int qlcnic_set_tx_csum(struct net_device *dev, u32 data)
> -{
> - struct qlcnic_adapter *adapter = netdev_priv(dev);
> -
> - if ((adapter->flags & QLCNIC_ESWITCH_ENABLED))
> - return -EOPNOTSUPP;
> - if (data)
> - dev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
> - else
> - dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
> -
> - return 0;
> -
> -}
> -static u32 qlcnic_get_tx_csum(struct net_device *dev)
> -{
> - return dev->features & NETIF_F_IP_CSUM;
> -}
> -
> -static u32 qlcnic_get_rx_csum(struct net_device *dev)
> -{
> - struct qlcnic_adapter *adapter = netdev_priv(dev);
> - return adapter->rx_csum;
> -}
> -
> -static int qlcnic_set_rx_csum(struct net_device *dev, u32 data)
> -{
> - struct qlcnic_adapter *adapter = netdev_priv(dev);
> -
> - if ((adapter->flags & QLCNIC_ESWITCH_ENABLED))
> - return -EOPNOTSUPP;
> - if (!!data) {
> - adapter->rx_csum = !!data;
> - return 0;
> - }
> -
> - if (dev->features & NETIF_F_LRO) {
> - if (qlcnic_config_hw_lro(adapter, QLCNIC_LRO_DISABLED))
> - return -EIO;
> -
> - dev->features &= ~NETIF_F_LRO;
> - qlcnic_send_lro_cleanup(adapter);
> - dev_info(&adapter->pdev->dev,
> - "disabling LRO as rx_csum is off\n");
> - }
> - adapter->rx_csum = !!data;
> - return 0;
> -}
> -
> -static u32 qlcnic_get_tso(struct net_device *dev)
> -{
> - return (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) != 0;
> -}
> -
> -static int qlcnic_set_tso(struct net_device *dev, u32 data)
> -{
> - struct qlcnic_adapter *adapter = netdev_priv(dev);
> - if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO))
> - return -EOPNOTSUPP;
> - if (data)
> - dev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
> - else
> - dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
> -
> - return 0;
> -}
> -
> static int qlcnic_set_led(struct net_device *dev,
> enum ethtool_phys_id_state state)
> {
> @@ -993,50 +926,6 @@ static int qlcnic_get_intr_coalesce(struct net_device *netdev,
> return 0;
> }
>
> -static int qlcnic_set_flags(struct net_device *netdev, u32 data)
> -{
> - struct qlcnic_adapter *adapter = netdev_priv(netdev);
> - int hw_lro;
> -
> - if (ethtool_invalid_flags(netdev, data, ETH_FLAG_LRO))
> - return -EINVAL;
> -
> - if (data & ETH_FLAG_LRO) {
> -
> - if (netdev->features & NETIF_F_LRO)
> - return 0;
> -
> - if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
> - return -EINVAL;
> -
> - if (!adapter->rx_csum) {
> - dev_info(&adapter->pdev->dev, "rx csum is off, "
> - "cannot toggle lro\n");
> - return -EINVAL;
> - }
> -
> - hw_lro = QLCNIC_LRO_ENABLED;
> - netdev->features |= NETIF_F_LRO;
> -
> - } else {
> -
> - if (!(netdev->features & NETIF_F_LRO))
> - return 0;
> -
> - hw_lro = 0;
> - netdev->features &= ~NETIF_F_LRO;
> - }
> -
> - if (qlcnic_config_hw_lro(adapter, hw_lro))
> - return -EIO;
> -
> - if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter))
> - return -EIO;
> -
> -
> - return 0;
> -}
> -
> static u32 qlcnic_get_msglevel(struct net_device *netdev)
> {
> struct qlcnic_adapter *adapter = netdev_priv(netdev);
> @@ -1064,23 +953,14 @@ const struct ethtool_ops qlcnic_ethtool_ops = {
> .set_ringparam = qlcnic_set_ringparam,
> .get_pauseparam = qlcnic_get_pauseparam,
> .set_pauseparam = qlcnic_set_pauseparam,
> - .get_tx_csum = qlcnic_get_tx_csum,
> - .set_tx_csum = qlcnic_set_tx_csum,
> - .set_sg = ethtool_op_set_sg,
> - .get_tso = qlcnic_get_tso,
> - .set_tso = qlcnic_set_tso,
> .get_wol = qlcnic_get_wol,
> .set_wol = qlcnic_set_wol,
> .self_test = qlcnic_diag_test,
> .get_strings = qlcnic_get_strings,
> .get_ethtool_stats = qlcnic_get_ethtool_stats,
> .get_sset_count = qlcnic_get_sset_count,
> - .get_rx_csum = qlcnic_get_rx_csum,
> - .set_rx_csum = qlcnic_set_rx_csum,
> .get_coalesce = qlcnic_get_intr_coalesce,
> .set_coalesce = qlcnic_set_intr_coalesce,
> - .get_flags = ethtool_op_get_flags,
> - .set_flags = qlcnic_set_flags,
> .set_phys_id = qlcnic_set_led,
> .set_msglevel = qlcnic_set_msglevel,
> .get_msglevel = qlcnic_get_msglevel,
> diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c
> index 498cca9..cbb27f2 100644
> --- a/drivers/net/qlcnic/qlcnic_hw.c
> +++ b/drivers/net/qlcnic/qlcnic_hw.c
> @@ -758,6 +758,43 @@ int qlcnic_change_mtu(struct net_device *netdev, int mtu)
> return rc;
> }
>
> +
> +u32 qlcnic_fix_features(struct net_device *netdev, u32 features)
> +{
> + struct qlcnic_adapter *adapter = netdev_priv(netdev);
> +
> + if ((adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
> + u32 changed = features ^ netdev->features;
> + features ^= changed & (NETIF_F_ALL_CSUM | NETIF_F_RXCSUM);
> + }
> +
> + if (!(features & NETIF_F_RXCSUM))
> + features &= ~NETIF_F_LRO;
> +
> + return features;
> +}
> +
> +
> +int qlcnic_set_features(struct net_device *netdev, u32 features)
> +{
> + struct qlcnic_adapter *adapter = netdev_priv(netdev);
> + u32 changed = netdev->features ^ features;
> + int hw_lro = (features & NETIF_F_LRO) ? QLCNIC_LRO_ENABLED : 0;
> +
> + if (!(changed & NETIF_F_LRO))
> + return 0;
> +
> + netdev->features = features ^ NETIF_F_LRO;
> +
> + if (qlcnic_config_hw_lro(adapter, hw_lro))
> + return -EIO;
> +
> + if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter))
> + return -EIO;
> +
> + return 0;
> +}
> +
> /*
> * Changes the CRB window to the specified window.
> */
> diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c
> index 4ec0eeb..d0f338b 100644
> --- a/drivers/net/qlcnic/qlcnic_init.c
> +++ b/drivers/net/qlcnic/qlcnic_init.c
> @@ -1390,8 +1390,8 @@ static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter,
>
> skb = buffer->skb;
>
> - if (likely(adapter->rx_csum && (cksum == STATUS_CKSUM_OK ||
> - cksum == STATUS_CKSUM_LOOP))) {
> + if (likely((adapter->netdev->features & NETIF_F_RXCSUM) &&
> + (cksum == STATUS_CKSUM_OK || cksum == STATUS_CKSUM_LOOP))) {
> adapter->stats.csummed++;
> skb->ip_summed = CHECKSUM_UNNECESSARY;
> } else {
> diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c
> index e9e9ba6..6e61951 100644
> --- a/drivers/net/qlcnic/qlcnic_main.c
> +++ b/drivers/net/qlcnic/qlcnic_main.c
> @@ -328,6 +328,8 @@ static const struct net_device_ops qlcnic_netdev_ops = {
> .ndo_set_multicast_list = qlcnic_set_multi,
> .ndo_set_mac_address = qlcnic_set_mac,
> .ndo_change_mtu = qlcnic_change_mtu,
> + .ndo_fix_features = qlcnic_fix_features,
> + .ndo_set_features = qlcnic_set_features,
> .ndo_tx_timeout = qlcnic_tx_timeout,
> .ndo_vlan_rx_add_vid = qlcnic_vlan_rx_add,
> .ndo_vlan_rx_kill_vid = qlcnic_vlan_rx_del,
> @@ -764,7 +766,7 @@ qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
> struct net_device *netdev = adapter->netdev;
> unsigned long features, vlan_features;
>
> - features = (NETIF_F_SG | NETIF_F_IP_CSUM |
> + features = (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
> NETIF_F_IPV6_CSUM | NETIF_F_GRO);
> vlan_features = (NETIF_F_SG | NETIF_F_IP_CSUM |
> NETIF_F_IPV6_CSUM | NETIF_F_HW_VLAN_FILTER);
> @@ -779,14 +781,12 @@ qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
>
> if (esw_cfg->offload_flags & BIT_0) {
> netdev->features |= features;
> - adapter->rx_csum = 1;
> if (!(esw_cfg->offload_flags & BIT_1))
> netdev->features &= ~NETIF_F_TSO;
> if (!(esw_cfg->offload_flags & BIT_2))
> netdev->features &= ~NETIF_F_TSO6;
> } else {
> netdev->features &= ~features;
> - adapter->rx_csum = 0;
> }
>
> netdev->vlan_features = (features & vlan_features);
> @@ -1436,7 +1436,6 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter,
> int err;
> struct pci_dev *pdev = adapter->pdev;
>
> - adapter->rx_csum = 1;
> adapter->mc_enabled = 0;
> adapter->max_mc_count = 38;
>
> @@ -1447,26 +1446,24 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter,
>
> SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_ops);
>
> - netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
> - NETIF_F_IPV6_CSUM | NETIF_F_GRO | NETIF_F_HW_VLAN_RX);
> - netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
> - NETIF_F_IPV6_CSUM | NETIF_F_HW_VLAN_FILTER);
> + netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
> + NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM;
>
> - if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO) {
> - netdev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
> - netdev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO6);
> - }
> + if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO)
> + netdev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;
> + if (pci_using_dac)
> + netdev->hw_features |= NETIF_F_HIGHDMA;
>
> - if (pci_using_dac) {
> - netdev->features |= NETIF_F_HIGHDMA;
> - netdev->vlan_features |= NETIF_F_HIGHDMA;
> - }
> + netdev->vlan_features = netdev->hw_features;
>
> if (adapter->capabilities & QLCNIC_FW_CAPABILITY_FVLANTX)
> - netdev->features |= (NETIF_F_HW_VLAN_TX);
> -
> + netdev->hw_features |= NETIF_F_HW_VLAN_TX;
> if (adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
> - netdev->features |= NETIF_F_LRO;
> + netdev->hw_features |= NETIF_F_LRO;
> +
> + netdev->features |= netdev->hw_features |
> + NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER;
> +
> netdev->irq = adapter->msix_entries[0].vector;
>
> netif_carrier_off(netdev);
> --
> 1.7.2.5
Looks fine to me. Thanks.
-Anirban
^ permalink raw reply
* Re: [Bugme-new] [Bug 33502] New: Caught 64-bit read from uninitialized memory in __alloc_skb
From: Pekka Enberg @ 2011-04-20 5:56 UTC (permalink / raw)
To: Eric Dumazet
Cc: Christoph Lameter, Andrew Morton, netdev, bugzilla-daemon,
bugme-daemon, casteyde.christian, Vegard Nossum
In-Reply-To: <1303244270.2756.3.camel@edumazet-laptop>
On 4/19/11 11:17 PM, Eric Dumazet wrote:
> Le mardi 19 avril 2011 à 12:10 -0500, Christoph Lameter a écrit :
>> On Tue, 19 Apr 2011, Eric Dumazet wrote:
>>
>>> }
>>> }
>>>
>>> -#ifdef CONFIG_CMPXCHG_LOCAL
>>> +#if defined(CONFIG_CMPXCHG_LOCAL)&& \
>>> + !defined(CONFIG_KMEMCHECK)&& !defined(DEBUG_PAGEALLOC)
>>> +#define SLUB_USE_CMPXCHG_DOUBLE
>>> +#endif
>>> +
>>> +#ifdef SLUB_USE_CMPXCHG_DOUBLE
>>> #ifdef CONFIG_PREEMPT
>>> /*
>> Ugg.. Isnt there some way to indicate to kmemcheck that a speculative
>> access is occurring?
> Yes, here is a totally untested patch (only compiled here), to keep
> kmemcheck& cmpxchg_double together.
Looks good to me! Can we get someone to test it as well?
^ permalink raw reply
* Re: ipqueue allocation failure.
From: Eric Dumazet @ 2011-04-20 5:27 UTC (permalink / raw)
To: David Miller; +Cc: davej, netdev
In-Reply-To: <20110419.204105.68144653.davem@davemloft.net>
Le mardi 19 avril 2011 à 20:41 -0700, David Miller a écrit :
> From: Dave Jones <davej@redhat.com>
> Date: Tue, 19 Apr 2011 21:42:22 -0400
>
> > Not catastrophic, but ipqueue seems to be too trusting of what it gets
> > passed from userspace, and passes it on down to the page allocator,
> > where it will spew warnings if the page order is too high.
> >
> > __ipq_rcv_skb has several checks for lengths too small, but doesn't
> > seem to have any for oversized ones. I'm not sure what the maximum
> > we should check for is. I'll code up a diff if anyone has any ideas
> > on a sane maximum.
>
> Maybe the thing to do is to simply pass __GFP_NOWARN to nlmsg_new()
> in netlink_ack()?
>
> Anyone else have a better idea?
> --
It should be fine, since we already checked sk->sk_sndbuf in
netlink_sendmsg()
if (len > sk->sk_sndbuf - 32)
goto out;
Maybe the 32 magic value is too small to take into account
struct nlmsgerr that is prepended in netlink_ack()
Hmm, no, sizeof(struct nlmsgerr) is 20
^ permalink raw reply
* Re: [Bugme-new] [Bug 33502] New: Caught 64-bit read from uninitialized memory in __alloc_skb
From: Eric Dumazet @ 2011-04-20 5:04 UTC (permalink / raw)
To: Christoph Lameter
Cc: Andrew Morton, netdev, bugzilla-daemon, bugme-daemon,
casteyde.christian, Vegard Nossum, Pekka Enberg
In-Reply-To: <alpine.DEB.2.00.1104191617070.23077@router.home>
Le mardi 19 avril 2011 à 16:18 -0500, Christoph Lameter a écrit :
> On Tue, 19 Apr 2011, Eric Dumazet wrote:
>
> > > Ugg.. Isnt there some way to indicate to kmemcheck that a speculative
> > > access is occurring?
> >
> > Yes, here is a totally untested patch (only compiled here), to keep
> > kmemcheck & cmpxchg_double together.
>
> Ok looks somewhat saner. Why does DEBUG_PAGEALLOC need this? Pages are
> never freed as long as a page is frozen and a page needs to be frozen to
> be allocated from. I dont see how we could reference a free page.
We run lockless and IRQ enabled, are you sure we cannot at this point :
CPU0 - Receive an IRQ
CPU0 - Allocate this same object consume the page(s) containing this object
CPU0 - Pass this object/memory to another cpu1
CPU1 - Free memory and free the page(s)
CPU0 - Return from IRQ
CPU0 - Access now unreachable memory ?
^ permalink raw reply
* Re: [PATCH net-next-2.6 8/8] sctp: Release all routes when processing acks ADD_IP or DEL_IP
From: David Miller @ 2011-04-20 4:47 UTC (permalink / raw)
To: yjwei; +Cc: netdev, linux-sctp
In-Reply-To: <4DAD1A6A.1090805@cn.fujitsu.com>
From: Wei Yongjun <yjwei@cn.fujitsu.com>
Date: Tue, 19 Apr 2011 13:15:22 +0800
> From: Vlad Yasevich <vladislav.yasevich@hp.com>
>
> When processing an ACK for ADD_IP parameter, we only release
> the routes on non-active transports. This can cause a wrong
> source address to be used. We can release the routes and
> cause new route lookups and source address selection so that
> new addresses can be used as source. Additionally, we don't need
> to lookup routes for all transports at the same time. We can let
> the transmit code path update the cached route when the transport
> actually sends something.
>
> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
> Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next-2.6 7/8] sctp: Allow bindx_del to accept 0 port
From: David Miller @ 2011-04-20 4:47 UTC (permalink / raw)
To: yjwei; +Cc: netdev, linux-sctp
In-Reply-To: <4DAD1A47.5080007@cn.fujitsu.com>
From: Wei Yongjun <yjwei@cn.fujitsu.com>
Date: Tue, 19 Apr 2011 13:14:47 +0800
> From: Vlad Yasevich <vladislav.yasevich@hp.com>
>
> We allow 0 port when adding new addresses. It only
> makes sence to allow 0 port when removing addresses.
> When removing the currently bound port will be used
> when the port in the address is set to 0.
>
> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
> Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Applied.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox