From: Xin Long <lucien.xin@gmail.com> Date: 2017-05-23 05:29:04
After introducing transport hashtable and per stream info into sctp,
some regressions were caused when processing dupcookie, this patchset
is to fix them.
Xin Long (2):
sctp: fix stream update when processing dupcookie
sctp: set new_asoc temp when processing dupcookie
net/sctp/associola.c | 4 +++-
net/sctp/sm_make_chunk.c | 13 ++++---------
net/sctp/sm_statefuns.c | 3 +++
3 files changed, 10 insertions(+), 10 deletions(-)
--
2.1.0
From: Xin Long <lucien.xin@gmail.com> Date: 2017-05-23 05:29:12
Since commit 3dbcc105d556 ("sctp: alloc stream info when initializing
asoc"), stream and stream.out info are always alloced when creating
an asoc.
So it's not correct to check !asoc->stream before updating stream
info when processing dupcookie, but would be better to check asoc
state instead.
Fixes: 3dbcc105d556 ("sctp: alloc stream info when initializing asoc")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/sctp/associola.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
From: Xin Long <lucien.xin@gmail.com> Date: 2017-05-23 05:29:20
After sctp changed to use transport hashtable, a transport would be
added into global hashtable when adding the peer to an asoc, then
the asoc can be got by searching the transport in the hashtbale.
The problem is when processing dupcookie in sctp_sf_do_5_2_4_dupcook,
a new asoc would be created. A peer with the same addr and port as
the one in the old asoc might be added into the new asoc, but fail
to be added into the hashtable, as they also belong to the same sk.
It causes that sctp's dupcookie processing can not really work.
Since the new asoc will be freed after copying it's information to
the old asoc, it's more like a temp asoc. So this patch is to fix
it by setting it as a temp asoc to avoid adding it's any transport
into the hashtable and also avoid allocing assoc_id.
An extra thing it has to do is to also alloc stream info for any
temp asoc, as sctp dupcookie process needs it to update old asoc.
But I don't think it would hurt something, as a temp asoc would
always be freed after finishing processing cookie echo packet.
Reported-by: Jianwen Ji <redacted>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/sctp/sm_make_chunk.c | 13 ++++---------
net/sctp/sm_statefuns.c | 3 +++
2 files changed, 7 insertions(+), 9 deletions(-)
@@ -2454,16 +2454,11 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,*streamsequencenumbershallbesetto0.*/-/* Allocate storage for the negotiated streams if it is not a temporary-*association.-*/-if(!asoc->temp){-if(sctp_stream_init(asoc,gfp))-gotoclean_up;+if(sctp_stream_init(asoc,gfp))+gotoclean_up;-if(sctp_assoc_set_id(asoc,gfp))-gotoclean_up;-}+if(!asoc->temp&&sctp_assoc_set_id(asoc,gfp))+gotoclean_up;/* ADDIP Section 4.1 ASCONF Chunk Procedures*
@@ -2088,6 +2088,9 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net,}}+/* Set temp so that it won't be added into hashtable */+new_asoc->temp=1;+/* Compare the tie_tag in cookie with the verification tag of*currentassociation.*/
From: Neil Horman <nhorman@tuxdriver.com> Date: 2017-05-23 11:26:45
On Tue, May 23, 2017 at 01:28:54PM +0800, Xin Long wrote:
quoted hunk
Since commit 3dbcc105d556 ("sctp: alloc stream info when initializing
asoc"), stream and stream.out info are always alloced when creating
an asoc.
So it's not correct to check !asoc->stream before updating stream
info when processing dupcookie, but would be better to check asoc
state instead.
Fixes: 3dbcc105d556 ("sctp: alloc stream info when initializing asoc")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/sctp/associola.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
From: Neil Horman <nhorman@tuxdriver.com> Date: 2017-05-23 11:26:59
On Tue, May 23, 2017 at 01:28:55PM +0800, Xin Long wrote:
quoted hunk
After sctp changed to use transport hashtable, a transport would be
added into global hashtable when adding the peer to an asoc, then
the asoc can be got by searching the transport in the hashtbale.
The problem is when processing dupcookie in sctp_sf_do_5_2_4_dupcook,
a new asoc would be created. A peer with the same addr and port as
the one in the old asoc might be added into the new asoc, but fail
to be added into the hashtable, as they also belong to the same sk.
It causes that sctp's dupcookie processing can not really work.
Since the new asoc will be freed after copying it's information to
the old asoc, it's more like a temp asoc. So this patch is to fix
it by setting it as a temp asoc to avoid adding it's any transport
into the hashtable and also avoid allocing assoc_id.
An extra thing it has to do is to also alloc stream info for any
temp asoc, as sctp dupcookie process needs it to update old asoc.
But I don't think it would hurt something, as a temp asoc would
always be freed after finishing processing cookie echo packet.
Reported-by: Jianwen Ji <redacted>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/sctp/sm_make_chunk.c | 13 ++++---------
net/sctp/sm_statefuns.c | 3 +++
2 files changed, 7 insertions(+), 9 deletions(-)
@@ -2454,16 +2454,11 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,*streamsequencenumbershallbesetto0.*/-/* Allocate storage for the negotiated streams if it is not a temporary-*association.-*/-if(!asoc->temp){-if(sctp_stream_init(asoc,gfp))-gotoclean_up;+if(sctp_stream_init(asoc,gfp))+gotoclean_up;-if(sctp_assoc_set_id(asoc,gfp))-gotoclean_up;-}+if(!asoc->temp&&sctp_assoc_set_id(asoc,gfp))+gotoclean_up;/* ADDIP Section 4.1 ASCONF Chunk Procedures*
@@ -2088,6 +2088,9 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net,}}+/* Set temp so that it won't be added into hashtable */+new_asoc->temp=1;+/* Compare the tie_tag in cookie with the verification tag of*currentassociation.*/
Since commit 3dbcc105d556 ("sctp: alloc stream info when initializing
asoc"), stream and stream.out info are always alloced when creating
an asoc.
So it's not correct to check !asoc->stream before updating stream
info when processing dupcookie, but would be better to check asoc
state instead.
Fixes: 3dbcc105d556 ("sctp: alloc stream info when initializing asoc")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
After sctp changed to use transport hashtable, a transport would be
added into global hashtable when adding the peer to an asoc, then
the asoc can be got by searching the transport in the hashtbale.
The problem is when processing dupcookie in sctp_sf_do_5_2_4_dupcook,
a new asoc would be created. A peer with the same addr and port as
the one in the old asoc might be added into the new asoc, but fail
to be added into the hashtable, as they also belong to the same sk.
It causes that sctp's dupcookie processing can not really work.
Since the new asoc will be freed after copying it's information to
the old asoc, it's more like a temp asoc. So this patch is to fix
it by setting it as a temp asoc to avoid adding it's any transport
into the hashtable and also avoid allocing assoc_id.
An extra thing it has to do is to also alloc stream info for any
temp asoc, as sctp dupcookie process needs it to update old asoc.
But I don't think it would hurt something, as a temp asoc would
always be freed after finishing processing cookie echo packet.
Reported-by: Jianwen Ji <redacted>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
@@ -2454,16 +2454,11 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,*streamsequencenumbershallbesetto0.*/-/* Allocate storage for the negotiated streams if it is not a temporary-*association.-*/-if(!asoc->temp){-if(sctp_stream_init(asoc,gfp))-gotoclean_up;+if(sctp_stream_init(asoc,gfp))+gotoclean_up;-if(sctp_assoc_set_id(asoc,gfp))-gotoclean_up;-}+if(!asoc->temp&&sctp_assoc_set_id(asoc,gfp))+gotoclean_up;/* ADDIP Section 4.1 ASCONF Chunk Procedures*
@@ -2088,6 +2088,9 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net,}}+/* Set temp so that it won't be added into hashtable */+new_asoc->temp=1;+/* Compare the tie_tag in cookie with the verification tag of*currentassociation.*/
From: David Miller <davem@davemloft.net> Date: 2017-05-24 19:23:05
From: Xin Long <lucien.xin@gmail.com>
Date: Tue, 23 May 2017 13:28:53 +0800
After introducing transport hashtable and per stream info into sctp,
some regressions were caused when processing dupcookie, this patchset
is to fix them.