Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
bd8b01e5
Commit
bd8b01e5
authored
Jan 28, 2003
by
Sridhar Samudrala
Committed by
Jon Grimm
Jan 28, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SCTP] Cleanup of association bind address list initialization.
parent
69ab3709
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
72 additions
and
103 deletions
+72
-103
include/net/sctp/command.h
include/net/sctp/command.h
+0
-1
include/net/sctp/structs.h
include/net/sctp/structs.h
+4
-0
net/sctp/associola.c
net/sctp/associola.c
+37
-0
net/sctp/sm_make_chunk.c
net/sctp/sm_make_chunk.c
+5
-41
net/sctp/sm_sideeffect.c
net/sctp/sm_sideeffect.c
+0
-24
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+8
-37
net/sctp/socket.c
net/sctp/socket.c
+18
-0
No files found.
include/net/sctp/command.h
View file @
bd8b01e5
...
...
@@ -69,7 +69,6 @@ typedef enum {
SCTP_CMD_INIT_FAILED
,
/* High level, do init failure work. */
SCTP_CMD_REPORT_DUP
,
/* Report a duplicate TSN. */
SCTP_CMD_REPORT_BIGGAP
,
/* Narc on a TSN (it was too high). */
SCTP_CMD_SET_BIND_ADDR
,
/* Set the association bind_addr. */
SCTP_CMD_STRIKE
,
/* Mark a strike against a transport. */
SCTP_CMD_TRANSMIT
,
/* Transmit the outqueue. */
SCTP_CMD_HB_TIMERS_START
,
/* Start the heartbeat timers. */
...
...
include/net/sctp/structs.h
View file @
bd8b01e5
...
...
@@ -1636,6 +1636,10 @@ void sctp_assoc_sync_pmtu(sctp_association_t *);
void
sctp_assoc_rwnd_increase
(
sctp_association_t
*
,
int
);
void
sctp_assoc_rwnd_decrease
(
sctp_association_t
*
,
int
);
int
sctp_assoc_set_bind_addr_from_ep
(
sctp_association_t
*
,
int
);
int
sctp_assoc_set_bind_addr_from_cookie
(
sctp_association_t
*
,
sctp_cookie_t
*
,
int
);
int
sctp_cmp_addr_exact
(
const
union
sctp_addr
*
ss1
,
const
union
sctp_addr
*
ss2
);
sctp_chunk_t
*
sctp_get_ecne_prepend
(
sctp_association_t
*
asoc
);
...
...
net/sctp/associola.c
View file @
bd8b01e5
...
...
@@ -1044,3 +1044,40 @@ void sctp_assoc_rwnd_decrease(sctp_association_t *asoc, int len)
SCTP_DEBUG_PRINTK
(
"%s: asoc %p rwnd decreased by %d to (%u, %u)
\n
"
,
__FUNCTION__
,
asoc
,
len
,
asoc
->
rwnd
,
asoc
->
rwnd_over
);
}
/* Build the bind address list for the association based on info from the
* local endpoint and the remote peer.
*/
int
sctp_assoc_set_bind_addr_from_ep
(
sctp_association_t
*
asoc
,
int
priority
)
{
sctp_scope_t
scope
;
int
flags
;
/* Use scoping rules to determine the subset of addresses from
* the endpoint.
*/
scope
=
sctp_scope
(
&
asoc
->
peer
.
active_path
->
ipaddr
);
flags
=
(
PF_INET6
==
asoc
->
base
.
sk
->
family
)
?
SCTP_ADDR6_ALLOWED
:
0
;
if
(
asoc
->
peer
.
ipv4_address
)
flags
|=
SCTP_ADDR4_PEERSUPP
;
if
(
asoc
->
peer
.
ipv6_address
)
flags
|=
SCTP_ADDR6_PEERSUPP
;
return
sctp_bind_addr_copy
(
&
asoc
->
base
.
bind_addr
,
&
asoc
->
ep
->
base
.
bind_addr
,
scope
,
priority
,
flags
);
}
/* Build the association's bind address list from the cookie. */
int
sctp_assoc_set_bind_addr_from_cookie
(
sctp_association_t
*
asoc
,
sctp_cookie_t
*
cookie
,
int
priority
)
{
int
var_size2
=
ntohs
(
cookie
->
peer_init
->
chunk_hdr
.
length
);
int
var_size3
=
cookie
->
raw_addr_list_len
;
__u8
*
raw_addr_list
=
(
__u8
*
)
cookie
+
sizeof
(
sctp_cookie_t
)
+
var_size2
;
return
sctp_raw_to_bind_addrs
(
&
asoc
->
base
.
bind_addr
,
raw_addr_list
,
var_size3
,
asoc
->
ep
->
base
.
bind_addr
.
port
,
priority
);
}
net/sctp/sm_make_chunk.c
View file @
bd8b01e5
...
...
@@ -242,35 +242,10 @@ sctp_chunk_t *sctp_make_init_ack(const sctp_association_t *asoc,
sctp_cookie_param_t
*
cookie
;
int
cookie_len
;
size_t
chunksize
;
int
error
;
sctp_scope_t
scope
;
sctp_bind_addr_t
*
bp
=
NULL
;
int
flags
;
retval
=
NULL
;
/* Build up the bind address list for the association based on
* info from the local endpoint and the remote peer.
*/
bp
=
sctp_bind_addr_new
(
priority
);
if
(
!
bp
)
goto
nomem_bindaddr
;
/* Look for supported address types parameter and then build
* our address list based on that.
*/
scope
=
sctp_scope
(
&
asoc
->
peer
.
active_path
->
ipaddr
);
flags
=
(
PF_INET6
==
asoc
->
base
.
sk
->
family
)
?
SCTP_ADDR6_ALLOWED
:
0
;
if
(
asoc
->
peer
.
ipv4_address
)
flags
|=
SCTP_ADDR4_PEERSUPP
;
if
(
asoc
->
peer
.
ipv6_address
)
flags
|=
SCTP_ADDR6_PEERSUPP
;
error
=
sctp_bind_addr_copy
(
bp
,
&
asoc
->
ep
->
base
.
bind_addr
,
scope
,
priority
,
flags
);
if
(
error
)
goto
nomem_copyaddr
;
addrs
=
sctp_bind_addrs_to_raw
(
bp
,
&
addrs_len
,
priority
);
addrs
=
sctp_bind_addrs_to_raw
(
&
asoc
->
base
.
bind_addr
,
&
addrs_len
,
priority
);
if
(
!
addrs
.
v
)
goto
nomem_rawaddr
;
...
...
@@ -333,9 +308,6 @@ sctp_chunk_t *sctp_make_init_ack(const sctp_association_t *asoc,
nomem_cookie:
kfree
(
addrs
.
v
);
nomem_rawaddr:
nomem_copyaddr:
sctp_bind_addr_free
(
bp
);
nomem_bindaddr:
return
retval
;
}
...
...
@@ -1363,11 +1335,10 @@ sctp_association_t *sctp_unpack_cookie(const sctp_endpoint_t *ep,
sctp_signed_cookie_t
*
cookie
;
sctp_cookie_t
*
bear_cookie
;
int
headersize
,
bodysize
;
int
fixed_size
,
var_size1
,
var_size2
,
var_size3
;
int
fixed_size
;
__u8
digest_buf
[
SCTP_SIGNATURE_SIZE
];
int
secret
;
sctp_scope_t
scope
;
__u8
*
raw_addr_list
;
headersize
=
sizeof
(
sctp_chunkhdr_t
)
+
SCTP_SECRET_SIZE
;
bodysize
=
ntohs
(
chunk
->
chunk_hdr
->
length
)
-
headersize
;
...
...
@@ -1388,9 +1359,6 @@ sctp_association_t *sctp_unpack_cookie(const sctp_endpoint_t *ep,
/* Process the cookie. */
cookie
=
chunk
->
subh
.
cookie_hdr
;
bear_cookie
=
&
cookie
->
c
;
var_size1
=
ntohs
(
chunk
->
chunk_hdr
->
length
)
-
fixed_size
;
var_size2
=
ntohs
(
bear_cookie
->
peer_init
->
chunk_hdr
.
length
);
var_size3
=
bear_cookie
->
raw_addr_list_len
;
/* Check the signature. */
secret
=
ep
->
current_key
;
...
...
@@ -1455,12 +1423,8 @@ sctp_association_t *sctp_unpack_cookie(const sctp_endpoint_t *ep,
/* Populate the association from the cookie. */
retval
->
c
=
*
bear_cookie
;
/* Build the bind address list based on the cookie. */
raw_addr_list
=
(
__u8
*
)
bear_cookie
+
sizeof
(
sctp_cookie_t
)
+
var_size2
;
if
(
sctp_raw_to_bind_addrs
(
&
retval
->
base
.
bind_addr
,
raw_addr_list
,
var_size3
,
retval
->
base
.
bind_addr
.
port
,
priority
))
{
if
(
sctp_assoc_set_bind_addr_from_cookie
(
retval
,
bear_cookie
,
GFP_ATOMIC
)
<
0
)
{
*
error
=
-
SCTP_IERROR_NOMEM
;
goto
fail
;
}
...
...
net/sctp/sm_sideeffect.c
View file @
bd8b01e5
...
...
@@ -75,8 +75,6 @@ static void sctp_cmd_hb_timers_start(sctp_cmd_seq_t *, sctp_association_t *);
static
void
sctp_cmd_hb_timers_stop
(
sctp_cmd_seq_t
*
,
sctp_association_t
*
);
static
void
sctp_cmd_hb_timer_update
(
sctp_cmd_seq_t
*
,
sctp_association_t
*
,
struct
sctp_transport
*
);
static
void
sctp_cmd_set_bind_addrs
(
sctp_cmd_seq_t
*
,
sctp_association_t
*
,
sctp_bind_addr_t
*
);
static
void
sctp_cmd_transport_reset
(
sctp_cmd_seq_t
*
,
sctp_association_t
*
,
struct
sctp_transport
*
);
static
void
sctp_cmd_transport_on
(
sctp_cmd_seq_t
*
,
sctp_association_t
*
,
...
...
@@ -546,11 +544,6 @@ int sctp_cmd_interpreter(sctp_event_t event_type, sctp_subtype_t subtype,
SCTP_DEBUG_PRINTK
(
"vtag mismatch!
\n
"
);
break
;
case
SCTP_CMD_SET_BIND_ADDR
:
sctp_cmd_set_bind_addrs
(
commands
,
asoc
,
command
->
obj
.
bp
);
break
;
case
SCTP_CMD_STRIKE
:
/* Mark one strike against a transport. */
sctp_do_8_2_transport_strike
(
asoc
,
...
...
@@ -1160,23 +1153,6 @@ static void sctp_cmd_hb_timer_update(sctp_cmd_seq_t *cmds,
sctp_transport_hold
(
t
);
}
/* Helper function to break out SCTP_CMD_SET_BIND_ADDR handling. */
void
sctp_cmd_set_bind_addrs
(
sctp_cmd_seq_t
*
cmds
,
sctp_association_t
*
asoc
,
sctp_bind_addr_t
*
bp
)
{
struct
list_head
*
pos
,
*
temp
;
list_for_each_safe
(
pos
,
temp
,
&
bp
->
address_list
)
{
list_del_init
(
pos
);
list_add_tail
(
pos
,
&
asoc
->
base
.
bind_addr
.
address_list
);
}
/* Free the temporary bind addr header, otherwise
* there will a memory leak.
*/
sctp_bind_addr_free
(
bp
);
}
/* Helper function to handle the reception of an HEARTBEAT ACK. */
static
void
sctp_cmd_transport_on
(
sctp_cmd_seq_t
*
cmds
,
sctp_association_t
*
asoc
,
...
...
net/sctp/sm_statefuns.c
View file @
bd8b01e5
...
...
@@ -262,6 +262,9 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const sctp_endpoint_t *ep,
len
=
ntohs
(
err_chunk
->
chunk_hdr
->
length
)
-
sizeof
(
sctp_chunkhdr_t
);
if
(
sctp_assoc_set_bind_addr_from_ep
(
new_asoc
,
GFP_ATOMIC
)
<
0
)
goto
nomem_ack
;
repl
=
sctp_make_init_ack
(
new_asoc
,
chunk
,
GFP_ATOMIC
,
len
);
if
(
!
repl
)
goto
nomem_ack
;
...
...
@@ -1181,6 +1184,10 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
len
=
ntohs
(
err_chunk
->
chunk_hdr
->
length
)
-
sizeof
(
sctp_chunkhdr_t
);
}
if
(
sctp_assoc_set_bind_addr_from_ep
(
new_asoc
,
GFP_ATOMIC
)
<
0
)
goto
nomem
;
repl
=
sctp_make_init_ack
(
new_asoc
,
chunk
,
GFP_ATOMIC
,
len
);
if
(
!
repl
)
goto
nomem
;
...
...
@@ -3234,10 +3241,6 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const sctp_endpoint_t *ep,
sctp_cmd_seq_t
*
commands
)
{
sctp_chunk_t
*
repl
;
sctp_bind_addr_t
*
bp
;
sctp_scope_t
scope
;
int
error
;
int
flags
;
/* The comment below says that we enter COOKIE-WAIT AFTER
* sending the INIT, but that doesn't actually work in our
...
...
@@ -3246,35 +3249,6 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_COOKIE_WAIT
));
/* Build up the bind address list for the association based on
* info from the local endpoint and the remote peer.
*/
bp
=
sctp_bind_addr_new
(
GFP_ATOMIC
);
if
(
!
bp
)
goto
nomem
;
/* Use scoping rules to determine the subset of addresses from
* the endpoint.
*/
scope
=
sctp_scope
(
&
asoc
->
peer
.
active_path
->
ipaddr
);
flags
=
(
PF_INET6
==
asoc
->
base
.
sk
->
family
)
?
SCTP_ADDR6_ALLOWED
:
0
;
if
(
asoc
->
peer
.
ipv4_address
)
flags
|=
SCTP_ADDR4_PEERSUPP
;
if
(
asoc
->
peer
.
ipv6_address
)
flags
|=
SCTP_ADDR6_PEERSUPP
;
error
=
sctp_bind_addr_copy
(
bp
,
&
ep
->
base
.
bind_addr
,
scope
,
GFP_ATOMIC
,
flags
);
if
(
error
)
goto
nomem
;
/* FIXME: Either move address assignment out of this function
* or else move the association allocation/init into this function.
* The association structure is brand new before calling this
* function, so would not be a sideeffect if the allocation
* moved into this function. --jgrimm
*/
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SET_BIND_ADDR
,
(
sctp_arg_t
)
bp
);
/* RFC 2960 5.1 Normal Establishment of an Association
*
* A) "A" first sends an INIT chunk to "Z". In the INIT, "A"
...
...
@@ -3283,7 +3257,7 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const sctp_endpoint_t *ep,
* 1 to 4294967295 (see 5.3.1 for Tag value selection). ...
*/
repl
=
sctp_make_init
(
asoc
,
bp
,
GFP_ATOMIC
,
0
);
repl
=
sctp_make_init
(
asoc
,
&
asoc
->
base
.
bind_addr
,
GFP_ATOMIC
,
0
);
if
(
!
repl
)
goto
nomem
;
...
...
@@ -3302,9 +3276,6 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const sctp_endpoint_t *ep,
return
SCTP_DISPOSITION_CONSUME
;
nomem:
if
(
bp
)
sctp_bind_addr_free
(
bp
);
return
SCTP_DISPOSITION_NOMEM
;
}
...
...
net/sctp/socket.c
View file @
bd8b01e5
...
...
@@ -924,6 +924,15 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
/* Prime the peer's transport structures. */
transport
=
sctp_assoc_add_peer
(
asoc
,
&
to
,
GFP_KERNEL
);
if
(
!
transport
)
{
err
=
-
ENOMEM
;
goto
out_free
;
}
err
=
sctp_assoc_set_bind_addr_from_ep
(
asoc
,
GFP_KERNEL
);
if
(
err
<
0
)
{
err
=
-
ENOMEM
;
goto
out_free
;
}
}
/* ASSERT: we have a valid association at this point. */
...
...
@@ -1513,6 +1522,15 @@ SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *uaddr,
/* Prime the peer's transport structures. */
transport
=
sctp_assoc_add_peer
(
asoc
,
&
to
,
GFP_KERNEL
);
if
(
!
transport
)
{
sctp_association_free
(
asoc
);
goto
out_unlock
;
}
err
=
sctp_assoc_set_bind_addr_from_ep
(
asoc
,
GFP_KERNEL
);
if
(
err
<
0
)
{
sctp_association_free
(
asoc
);
goto
out_unlock
;
}
err
=
sctp_primitive_ASSOCIATE
(
asoc
,
NULL
);
if
(
err
<
0
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment