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
nexedi
linux
Commits
e025484e
Commit
e025484e
authored
Nov 05, 2002
by
Jon Grimm
Browse files
Options
Browse Files
Download
Plain Diff
Merge touki.austin.ibm.com:/home/jgrimm/bk/lksctp-2.5
into touki.austin.ibm.com:/home/jgrimm/bk/lksctp-2.5.work
parents
c03e61bb
3e780f7b
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
272 additions
and
270 deletions
+272
-270
include/net/sctp/sctp.h
include/net/sctp/sctp.h
+21
-1
include/net/sctp/sm.h
include/net/sctp/sm.h
+3
-3
include/net/sctp/structs.h
include/net/sctp/structs.h
+46
-39
net/sctp/associola.c
net/sctp/associola.c
+9
-9
net/sctp/bind_addr.c
net/sctp/bind_addr.c
+10
-10
net/sctp/endpointola.c
net/sctp/endpointola.c
+3
-3
net/sctp/input.c
net/sctp/input.c
+29
-76
net/sctp/ipv6.c
net/sctp/ipv6.c
+63
-5
net/sctp/output.c
net/sctp/output.c
+3
-8
net/sctp/protocol.c
net/sctp/protocol.c
+42
-53
net/sctp/sm_make_chunk.c
net/sctp/sm_make_chunk.c
+9
-29
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+3
-3
net/sctp/socket.c
net/sctp/socket.c
+25
-25
net/sctp/transport.c
net/sctp/transport.c
+6
-6
No files found.
include/net/sctp/sctp.h
View file @
e025484e
/* SCTP kernel reference Implementation
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001 International Business Machines, Corp.
* Copyright (c) 2001
-2002
International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
*
* This file is part of the SCTP kernel reference Implementation
...
...
@@ -473,6 +473,26 @@ static inline sctp_protocol_t *sctp_get_protocol(void)
return
&
sctp_proto
;
}
/* Convert from an IP version number to an Address Family symbol. */
static
inline
int
ipver2af
(
__u8
ipver
)
{
int
family
;
switch
(
ipver
)
{
case
4
:
family
=
AF_INET
;
break
;
case
6
:
family
=
AF_INET6
;
break
;
default:
family
=
0
;
break
;
};
return
family
;
}
/* Warning: The following hash functions assume a power of two 'size'. */
/* This is the hash function for the SCTP port hash table. */
static
inline
int
sctp_phashfn
(
__u16
lport
)
...
...
include/net/sctp/sm.h
View file @
e025484e
...
...
@@ -332,10 +332,10 @@ __u32 sctp_generate_tag(const sctp_endpoint_t *);
__u32
sctp_generate_tsn
(
const
sctp_endpoint_t
*
);
/* 4th level prototypes */
void
sctp_param2sockaddr
(
sockaddr_storage_t
*
addr
,
sctp_addr_param_t
*
,
void
sctp_param2sockaddr
(
union
sctp_addr
*
addr
,
sctp_addr_param_t
*
,
__u16
port
);
int
sctp_addr2sockaddr
(
const
union
sctp_params
,
sockaddr_storage_t
*
);
int
sockaddr2sctp_addr
(
const
sockaddr_storage_t
*
,
sctp_addr_param_t
*
);
int
sctp_addr2sockaddr
(
const
union
sctp_params
,
union
sctp_addr
*
);
int
sockaddr2sctp_addr
(
const
union
sctp_addr
*
,
sctp_addr_param_t
*
);
/* Extern declarations for major data structures. */
sctp_sm_table_entry_t
*
sctp_chunk_event_lookup
(
sctp_cid_t
,
sctp_state_t
);
...
...
include/net/sctp/structs.h
View file @
e025484e
...
...
@@ -95,11 +95,11 @@ struct sockaddr_storage {
/* A convenience structure for handling sockaddr structures.
* We should wean ourselves off this.
*/
typedef
union
{
union
sctp_addr
{
struct
sockaddr_in
v4
;
struct
sockaddr_in6
v6
;
struct
sockaddr
sa
;
}
sockaddr_storage_t
;
};
/* Forward declarations for data structures. */
...
...
@@ -246,17 +246,24 @@ typedef struct sctp_func {
int
optname
,
char
*
optval
,
int
*
optlen
);
struct
dst_entry
*
(
*
get_dst
)
(
sockaddr_storage_t
*
daddr
,
sockaddr_storage_t
*
saddr
);
struct
dst_entry
*
(
*
get_dst
)
(
union
sctp_addr
*
daddr
,
union
sctp_addr
*
saddr
);
void
(
*
copy_addrlist
)
(
struct
list_head
*
,
struct
net_device
*
);
int
(
*
cmp_saddr
)
(
struct
dst_entry
*
dst
,
sockaddr_storage_t
*
saddr
);
union
sctp_addr
*
saddr
);
void
(
*
addr_copy
)
(
union
sctp_addr
*
dst
,
union
sctp_addr
*
src
);
void
(
*
from_skb
)
(
union
sctp_addr
*
,
struct
sk_buff
*
skb
,
int
saddr
);
__u16
net_header_len
;
int
sockaddr_len
;
sa_family_t
sa_family
;
struct
list_head
list
;
}
sctp_func_t
;
sctp_func_t
*
sctp_get_af_specific
(
const
sockaddr_storage_t
*
address
);
sctp_func_t
*
sctp_get_af_specific
(
sa_family_t
);
/* Protocol family functions. */
typedef
struct
sctp_pf
{
...
...
@@ -339,7 +346,7 @@ typedef struct sctp_cookie {
__u32
initial_tsn
;
/* This holds the originating address of the INIT packet. */
sockaddr_storage_t
peer_addr
;
union
sctp_addr
peer_addr
;
/* This is a shim for my peer's INIT packet, followed by
* a copy of the raw address list of the association.
...
...
@@ -393,7 +400,7 @@ union sctp_params {
*/
typedef
struct
sctp_sender_hb_info
{
sctp_paramhdr_t
param_hdr
;
sockaddr_storage_t
daddr
;
union
sctp_addr
daddr
;
unsigned
long
sent_at
;
}
sctp_sender_hb_info_t
__attribute__
((
packed
));
...
...
@@ -479,9 +486,9 @@ struct SCTP_chunk {
__u8
tsn_missing_report
;
/* Data chunk missing counter. */
/* What is the origin IP address for this chunk? */
sockaddr_storage_t
source
;
union
sctp_addr
source
;
/* Destination address for this chunk. */
sockaddr_storage_t
dest
;
union
sctp_addr
dest
;
/* For an inbound chunk, this tells us where it came from.
* For an outbound chunk, it tells us where we'd like it to
...
...
@@ -499,7 +506,7 @@ int sctp_user_addto_chunk(sctp_chunk_t *chunk, int len, struct iovec *data);
sctp_chunk_t
*
sctp_chunkify
(
struct
sk_buff
*
,
const
sctp_association_t
*
,
struct
sock
*
);
void
sctp_init_addrs
(
sctp_chunk_t
*
chunk
);
const
sockaddr_storage_t
*
sctp_source
(
const
sctp_chunk_t
*
chunk
);
const
union
sctp_addr
*
sctp_source
(
const
sctp_chunk_t
*
chunk
);
/* This is a structure for holding either an IPv6 or an IPv4 address. */
/* sin_family -- AF_INET or AF_INET6
...
...
@@ -508,7 +515,7 @@ const sockaddr_storage_t *sctp_source(const sctp_chunk_t *chunk);
*/
struct
sockaddr_storage_list
{
struct
list_head
list
;
sockaddr_storage_t
a
;
union
sctp_addr
a
;
};
typedef
sctp_chunk_t
*
(
sctp_packet_phandler_t
)(
sctp_association_t
*
);
...
...
@@ -574,7 +581,7 @@ void sctp_packet_free(sctp_packet_t *);
/* This represents a remote transport address.
* For local transport addresses, we just use
sockaddr_storage_t
.
* For local transport addresses, we just use
union sctp_addr
.
*
* RFC2960 Section 1.4 Key Terms
*
...
...
@@ -602,7 +609,7 @@ struct SCTP_transport {
int
dead
;
/* This is the peer's IP address and port. */
sockaddr_storage_t
ipaddr
;
union
sctp_addr
ipaddr
;
/* These are the functions we call to handle LLP stuff. */
sctp_func_t
*
af_specific
;
...
...
@@ -742,11 +749,11 @@ struct SCTP_transport {
int
malloced
;
/* Is this structure kfree()able? */
};
extern
sctp_transport_t
*
sctp_transport_new
(
const
sockaddr_storage_t
*
,
int
);
extern
sctp_transport_t
*
sctp_transport_new
(
const
union
sctp_addr
*
,
int
);
extern
sctp_transport_t
*
sctp_transport_init
(
sctp_transport_t
*
,
const
sockaddr_storage_t
*
,
int
);
const
union
sctp_addr
*
,
int
);
extern
void
sctp_transport_set_owner
(
sctp_transport_t
*
,
sctp_association_t
*
);
extern
void
sctp_transport_route
(
sctp_transport_t
*
,
sockaddr_storage_t
*
);
extern
void
sctp_transport_route
(
sctp_transport_t
*
,
union
sctp_addr
*
);
extern
void
sctp_transport_free
(
sctp_transport_t
*
);
extern
void
sctp_transport_destroy
(
sctp_transport_t
*
);
extern
void
sctp_transport_reset_timers
(
sctp_transport_t
*
);
...
...
@@ -893,10 +900,10 @@ void sctp_bind_addr_init(sctp_bind_addr_t *, __u16 port);
void
sctp_bind_addr_free
(
sctp_bind_addr_t
*
);
int
sctp_bind_addr_copy
(
sctp_bind_addr_t
*
dest
,
const
sctp_bind_addr_t
*
src
,
sctp_scope_t
scope
,
int
priority
,
int
flags
);
int
sctp_add_bind_addr
(
sctp_bind_addr_t
*
,
sockaddr_storage_t
*
,
int
sctp_add_bind_addr
(
sctp_bind_addr_t
*
,
union
sctp_addr
*
,
int
priority
);
int
sctp_del_bind_addr
(
sctp_bind_addr_t
*
,
sockaddr_storage_t
*
);
int
sctp_bind_addr_has_addr
(
sctp_bind_addr_t
*
,
const
sockaddr_storage_t
*
);
int
sctp_del_bind_addr
(
sctp_bind_addr_t
*
,
union
sctp_addr
*
);
int
sctp_bind_addr_has_addr
(
sctp_bind_addr_t
*
,
const
union
sctp_addr
*
);
union
sctp_params
sctp_bind_addrs_to_raw
(
const
sctp_bind_addr_t
*
bp
,
int
*
addrs_len
,
int
priority
);
...
...
@@ -906,10 +913,10 @@ int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp,
unsigned
short
port
,
int
priority
);
sctp_scope_t
sctp_scope
(
const
sockaddr_storage_t
*
);
int
sctp_in_scope
(
const
sockaddr_storage_t
*
addr
,
const
sctp_scope_t
scope
);
int
sctp_is_any
(
const
sockaddr_storage_t
*
addr
);
int
sctp_addr_is_valid
(
const
sockaddr_storage_t
*
addr
);
sctp_scope_t
sctp_scope
(
const
union
sctp_addr
*
);
int
sctp_in_scope
(
const
union
sctp_addr
*
addr
,
const
sctp_scope_t
scope
);
int
sctp_is_any
(
const
union
sctp_addr
*
addr
);
int
sctp_addr_is_valid
(
const
union
sctp_addr
*
addr
);
/* What type of sctp_endpoint_common? */
...
...
@@ -1051,13 +1058,13 @@ void sctp_endpoint_put(sctp_endpoint_t *);
void
sctp_endpoint_hold
(
sctp_endpoint_t
*
);
void
sctp_endpoint_add_asoc
(
sctp_endpoint_t
*
,
sctp_association_t
*
asoc
);
sctp_association_t
*
sctp_endpoint_lookup_assoc
(
const
sctp_endpoint_t
*
ep
,
const
sockaddr_storage_t
*
paddr
,
const
union
sctp_addr
*
paddr
,
sctp_transport_t
**
);
sctp_endpoint_t
*
sctp_endpoint_is_match
(
sctp_endpoint_t
*
,
const
sockaddr_storage_t
*
);
const
union
sctp_addr
*
);
int
sctp_has_association
(
const
sockaddr_storage_t
*
laddr
,
const
sockaddr_storage_t
*
paddr
);
int
sctp_has_association
(
const
union
sctp_addr
*
laddr
,
const
union
sctp_addr
*
paddr
);
int
sctp_verify_init
(
const
sctp_association_t
*
asoc
,
sctp_cid_t
cid
,
...
...
@@ -1065,10 +1072,10 @@ int sctp_verify_init(const sctp_association_t *asoc,
sctp_chunk_t
*
chunk
,
sctp_chunk_t
**
err_chunk
);
int
sctp_process_init
(
sctp_association_t
*
asoc
,
sctp_cid_t
cid
,
const
sockaddr_storage_t
*
peer_addr
,
const
union
sctp_addr
*
peer_addr
,
sctp_init_chunk_t
*
peer_init
,
int
priority
);
int
sctp_process_param
(
sctp_association_t
*
asoc
,
union
sctp_params
param
,
const
sockaddr_storage_t
*
peer_addr
,
int
priority
);
const
union
sctp_addr
*
peer_addr
,
int
priority
);
__u32
sctp_generate_tag
(
const
sctp_endpoint_t
*
ep
);
__u32
sctp_generate_tsn
(
const
sctp_endpoint_t
*
ep
);
...
...
@@ -1157,7 +1164,7 @@ struct SCTP_association {
/* Cache the primary path address here, when we
* need a an address for msg_name.
*/
sockaddr_storage_t
primary_addr
;
union
sctp_addr
primary_addr
;
/* active_path
* The path that we are currently using to
...
...
@@ -1535,16 +1542,16 @@ void sctp_association_hold(sctp_association_t *);
sctp_transport_t
*
sctp_assoc_choose_shutdown_transport
(
sctp_association_t
*
);
sctp_transport_t
*
sctp_assoc_lookup_paddr
(
const
sctp_association_t
*
,
const
sockaddr_storage_t
*
);
const
union
sctp_addr
*
);
sctp_transport_t
*
sctp_assoc_add_peer
(
sctp_association_t
*
,
const
sockaddr_storage_t
*
address
,
const
union
sctp_addr
*
address
,
const
int
priority
);
void
sctp_assoc_control_transport
(
sctp_association_t
*
,
sctp_transport_t
*
,
sctp_transport_cmd_t
,
sctp_sn_error_t
);
sctp_transport_t
*
sctp_assoc_lookup_tsn
(
sctp_association_t
*
,
__u32
);
sctp_transport_t
*
sctp_assoc_is_match
(
sctp_association_t
*
,
const
sockaddr_storage_t
*
,
const
sockaddr_storage_t
*
);
const
union
sctp_addr
*
,
const
union
sctp_addr
*
);
void
sctp_assoc_migrate
(
sctp_association_t
*
,
struct
sock
*
);
void
sctp_assoc_update
(
sctp_association_t
*
dst
,
sctp_association_t
*
src
);
...
...
@@ -1552,10 +1559,10 @@ __u32 __sctp_association_get_next_tsn(sctp_association_t *);
__u32
__sctp_association_get_tsn_block
(
sctp_association_t
*
,
int
);
__u16
__sctp_association_get_next_ssn
(
sctp_association_t
*
,
__u16
sid
);
int
sctp_cmp_addr
(
const
sockaddr_storage_t
*
ss1
,
const
sockaddr_storage_t
*
ss2
);
int
sctp_cmp_addr_exact
(
const
sockaddr_storage_t
*
ss1
,
const
sockaddr_storage_t
*
ss2
);
int
sctp_cmp_addr
(
const
union
sctp_addr
*
ss1
,
const
union
sctp_addr
*
ss2
);
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
);
sctp_chunk_t
*
sctp_get_no_prepend
(
sctp_association_t
*
asoc
);
...
...
net/sctp/associola.c
View file @
e025484e
...
...
@@ -364,7 +364,7 @@ static void sctp_association_destroy(sctp_association_t *asoc)
/* Add a transport address to an association. */
sctp_transport_t
*
sctp_assoc_add_peer
(
sctp_association_t
*
asoc
,
const
sockaddr_storage_t
*
addr
,
const
union
sctp_addr
*
addr
,
int
priority
)
{
sctp_transport_t
*
peer
;
...
...
@@ -424,7 +424,7 @@ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc,
asoc
->
frag_point
=
asoc
->
pmtu
-
(
SCTP_IP_OVERHEAD
+
sizeof
(
sctp_data_chunk_t
));
/* The asoc->peer.port might not be meaningful
as of now
, but
/* The asoc->peer.port might not be meaningful
yet
, but
* initialize the packet structure anyway.
*/
(
asoc
->
outqueue
.
init_output
)(
&
peer
->
packet
,
...
...
@@ -478,7 +478,7 @@ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc,
asoc
->
peer
.
primary_path
=
peer
;
/* Set a default msg_name for events. */
memcpy
(
&
asoc
->
peer
.
primary_addr
,
&
peer
->
ipaddr
,
sizeof
(
sockaddr_storage_t
));
sizeof
(
union
sctp_addr
));
asoc
->
peer
.
active_path
=
peer
;
asoc
->
peer
.
retran_path
=
peer
;
}
...
...
@@ -491,7 +491,7 @@ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc,
/* Lookup a transport by address. */
sctp_transport_t
*
sctp_assoc_lookup_paddr
(
const
sctp_association_t
*
asoc
,
const
sockaddr_storage_t
*
address
)
const
union
sctp_addr
*
address
)
{
sctp_transport_t
*
t
;
struct
list_head
*
pos
;
...
...
@@ -654,7 +654,7 @@ __u16 __sctp_association_get_next_ssn(sctp_association_t *asoc, __u16 sid)
*
* FIXME: We do not match address scopes correctly.
*/
int
sctp_cmp_addr
(
const
sockaddr_storage_t
*
ss1
,
const
sockaddr_storage_t
*
ss2
)
int
sctp_cmp_addr
(
const
union
sctp_addr
*
ss1
,
const
union
sctp_addr
*
ss2
)
{
int
len
;
const
void
*
base1
;
...
...
@@ -710,8 +710,8 @@ int sctp_cmp_addr(const sockaddr_storage_t *ss1, const sockaddr_storage_t *ss2)
*
* FIXME: We do not match address scopes correctly.
*/
int
sctp_cmp_addr_exact
(
const
sockaddr_storage_t
*
ss1
,
const
sockaddr_storage_t
*
ss2
)
int
sctp_cmp_addr_exact
(
const
union
sctp_addr
*
ss1
,
const
union
sctp_addr
*
ss2
)
{
int
len
;
const
void
*
base1
;
...
...
@@ -846,8 +846,8 @@ sctp_transport_t *sctp_assoc_lookup_tsn(sctp_association_t *asoc, __u32 tsn)
/* Is this the association we are looking for? */
sctp_transport_t
*
sctp_assoc_is_match
(
sctp_association_t
*
asoc
,
const
sockaddr_storage_t
*
laddr
,
const
sockaddr_storage_t
*
paddr
)
const
union
sctp_addr
*
laddr
,
const
union
sctp_addr
*
paddr
)
{
sctp_transport_t
*
transport
;
...
...
net/sctp/bind_addr.c
View file @
e025484e
...
...
@@ -52,7 +52,7 @@
#include <net/sctp/sm.h>
/* Forward declarations for internal helpers. */
static
int
sctp_copy_one_addr
(
sctp_bind_addr_t
*
,
sockaddr_storage_t
*
,
static
int
sctp_copy_one_addr
(
sctp_bind_addr_t
*
,
union
sctp_addr
*
,
sctp_scope_t
scope
,
int
priority
,
int
flags
);
static
void
sctp_bind_addr_clean
(
sctp_bind_addr_t
*
);
...
...
@@ -143,7 +143,7 @@ void sctp_bind_addr_free(sctp_bind_addr_t *bp)
}
/* Add an address to the bind address list in the SCTP_bind_addr structure. */
int
sctp_add_bind_addr
(
sctp_bind_addr_t
*
bp
,
sockaddr_storage_t
*
new
,
int
sctp_add_bind_addr
(
sctp_bind_addr_t
*
bp
,
union
sctp_addr
*
new
,
int
priority
)
{
struct
sockaddr_storage_list
*
addr
;
...
...
@@ -171,7 +171,7 @@ int sctp_add_bind_addr(sctp_bind_addr_t *bp, sockaddr_storage_t *new,
/* Delete an address from the bind address list in the SCTP_bind_addr
* structure.
*/
int
sctp_del_bind_addr
(
sctp_bind_addr_t
*
bp
,
sockaddr_storage_t
*
del_addr
)
int
sctp_del_bind_addr
(
sctp_bind_addr_t
*
bp
,
union
sctp_addr
*
del_addr
)
{
struct
list_head
*
pos
,
*
temp
;
struct
sockaddr_storage_list
*
addr
;
...
...
@@ -242,7 +242,7 @@ int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, __u8 *raw_addr_list,
{
sctp_addr_param_t
*
rawaddr
;
sctp_paramhdr_t
*
param
;
sockaddr_storage_t
addr
;
union
sctp_addr
addr
;
int
retval
=
0
;
int
len
;
...
...
@@ -283,7 +283,7 @@ int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, __u8 *raw_addr_list,
********************************************************************/
/* Does this contain a specified address? */
int
sctp_bind_addr_has_addr
(
sctp_bind_addr_t
*
bp
,
const
sockaddr_storage_t
*
addr
)
int
sctp_bind_addr_has_addr
(
sctp_bind_addr_t
*
bp
,
const
union
sctp_addr
*
addr
)
{
struct
sockaddr_storage_list
*
laddr
;
struct
list_head
*
pos
;
...
...
@@ -298,7 +298,7 @@ int sctp_bind_addr_has_addr(sctp_bind_addr_t *bp, const sockaddr_storage_t *addr
}
/* Copy out addresses from the global local address list. */
static
int
sctp_copy_one_addr
(
sctp_bind_addr_t
*
dest
,
sockaddr_storage_t
*
addr
,
static
int
sctp_copy_one_addr
(
sctp_bind_addr_t
*
dest
,
union
sctp_addr
*
addr
,
sctp_scope_t
scope
,
int
priority
,
int
flags
)
{
sctp_protocol_t
*
proto
=
sctp_get_protocol
();
...
...
@@ -324,7 +324,7 @@ static int sctp_copy_one_addr(sctp_bind_addr_t *dest, sockaddr_storage_t *addr,
}
/* Is addr one of the wildcards? */
int
sctp_is_any
(
const
sockaddr_storage_t
*
addr
)
int
sctp_is_any
(
const
union
sctp_addr
*
addr
)
{
int
retval
=
0
;
...
...
@@ -350,7 +350,7 @@ int sctp_is_any(const sockaddr_storage_t *addr)
}
/* Is 'addr' valid for 'scope'? */
int
sctp_in_scope
(
const
sockaddr_storage_t
*
addr
,
sctp_scope_t
scope
)
int
sctp_in_scope
(
const
union
sctp_addr
*
addr
,
sctp_scope_t
scope
)
{
sctp_scope_t
addr_scope
=
sctp_scope
(
addr
);
...
...
@@ -420,7 +420,7 @@ int sctp_in_scope(const sockaddr_storage_t *addr, sctp_scope_t scope)
********************************************************************/
/* What is the scope of 'addr'? */
sctp_scope_t
sctp_scope
(
const
sockaddr_storage_t
*
addr
)
sctp_scope_t
sctp_scope
(
const
union
sctp_addr
*
addr
)
{
sctp_scope_t
retval
=
SCTP_SCOPE_GLOBAL
;
...
...
@@ -501,7 +501,7 @@ sctp_scope_t sctp_scope(const sockaddr_storage_t *addr)
* Return 0 - If the address is a non-unicast or an illegal address.
* Return 1 - If the address is a unicast.
*/
int
sctp_addr_is_valid
(
const
sockaddr_storage_t
*
addr
)
int
sctp_addr_is_valid
(
const
union
sctp_addr
*
addr
)
{
unsigned
short
sa_family
=
addr
->
sa
.
sa_family
;
...
...
net/sctp/endpointola.c
View file @
e025484e
...
...
@@ -237,7 +237,7 @@ void sctp_endpoint_put(sctp_endpoint_t *ep)
/* Is this the endpoint we are looking for? */
sctp_endpoint_t
*
sctp_endpoint_is_match
(
sctp_endpoint_t
*
ep
,
const
sockaddr_storage_t
*
laddr
)
const
union
sctp_addr
*
laddr
)
{
sctp_endpoint_t
*
retval
;
...
...
@@ -262,7 +262,7 @@ sctp_endpoint_t *sctp_endpoint_is_match(sctp_endpoint_t *ep,
*/
sctp_association_t
*
__sctp_endpoint_lookup_assoc
(
const
sctp_endpoint_t
*
endpoint
,
const
sockaddr_storage_t
*
paddr
,
const
union
sctp_addr
*
paddr
,
sctp_transport_t
**
transport
)
{
int
rport
;
...
...
@@ -289,7 +289,7 @@ sctp_association_t *__sctp_endpoint_lookup_assoc(
/* Lookup association on an endpoint based on a peer address. BH-safe. */
sctp_association_t
*
sctp_endpoint_lookup_assoc
(
const
sctp_endpoint_t
*
ep
,
const
sockaddr_storage_t
*
paddr
,
const
union
sctp_addr
*
paddr
,
sctp_transport_t
**
transport
)
{
sctp_association_t
*
asoc
;
...
...
net/sctp/input.c
View file @
e025484e
...
...
@@ -60,64 +60,11 @@
/* Forward declarations for internal helpers. */
static
int
sctp_rcv_ootb
(
struct
sk_buff
*
);
sctp_association_t
*
__sctp_rcv_lookup
(
struct
sk_buff
*
skb
,
const
sockaddr_storage_t
*
laddr
,
const
sockaddr_storage_t
*
paddr
,
const
union
sctp_addr
*
laddr
,
const
union
sctp_addr
*
paddr
,
sctp_transport_t
**
transportp
);
sctp_endpoint_t
*
__sctp_rcv_lookup_endpoint
(
const
sockaddr_storage_t
*
laddr
);
sctp_endpoint_t
*
__sctp_rcv_lookup_endpoint
(
const
union
sctp_addr
*
laddr
);
/* Initialize a sockaddr_storage from in incoming skb.
* FIXME: This belongs with AF specific sctp_func_t. --jgrimm
*/
static
sockaddr_storage_t
*
sctp_sockaddr_storage_init
(
sockaddr_storage_t
*
addr
,
const
struct
sk_buff
*
skb
,
int
is_saddr
)
{
sockaddr_storage_t
*
ret
=
NULL
;
void
*
to
,
*
saddr
,
*
daddr
;
__u16
*
port
;
size_t
len
;
struct
sctphdr
*
sh
;
switch
(
skb
->
nh
.
iph
->
version
)
{
case
4
:
to
=
&
addr
->
v4
.
sin_addr
.
s_addr
;
port
=
&
addr
->
v4
.
sin_port
;
saddr
=
&
skb
->
nh
.
iph
->
saddr
;
daddr
=
&
skb
->
nh
.
iph
->
daddr
;
len
=
sizeof
(
struct
in_addr
);
addr
->
v4
.
sin_family
=
AF_INET
;
break
;
case
6
:
SCTP_V6
(
to
=
&
addr
->
v6
.
sin6_addr
;
port
=
&
addr
->
v6
.
sin6_port
;
saddr
=
&
skb
->
nh
.
ipv6h
->
saddr
;
daddr
=
&
skb
->
nh
.
ipv6h
->
daddr
;
len
=
sizeof
(
struct
in6_addr
);
addr
->
v6
.
sin6_family
=
AF_INET6
;
addr
->
v6
.
sin6_flowinfo
=
0
;
/* FIXME */
addr
->
v6
.
sin6_scope_id
=
0
;
/* FIXME */
break
;
)
default:
goto
out
;
};
sh
=
(
struct
sctphdr
*
)
skb
->
h
.
raw
;
if
(
is_saddr
)
{
*
port
=
ntohs
(
sh
->
source
);
memcpy
(
to
,
saddr
,
len
);
}
else
{
*
port
=
ntohs
(
sh
->
dest
);
memcpy
(
to
,
daddr
,
len
);
}
ret
=
addr
;
out:
return
ret
;
}
/* Calculate the SCTP checksum of an SCTP packet. */
static
inline
int
sctp_rcv_checksum
(
struct
sk_buff
*
skb
)
...
...
@@ -147,8 +94,9 @@ int sctp_rcv(struct sk_buff *skb)
sctp_transport_t
*
transport
=
NULL
;
sctp_chunk_t
*
chunk
;
struct
sctphdr
*
sh
;
sockaddr_storage_t
src
;
sockaddr_storage_t
dest
;
union
sctp_addr
src
;
union
sctp_addr
dest
;
struct
sctp_func
*
af
;
int
ret
=
0
;
if
(
skb
->
pkt_type
!=
PACKET_HOST
)
...
...
@@ -163,10 +111,15 @@ int sctp_rcv(struct sk_buff *skb)
if
(
sctp_rcv_checksum
(
skb
)
<
0
)
goto
bad_packet
;
skb_pull
(
skb
,
sizeof
(
struct
sctphdr
));
skb_pull
(
skb
,
sizeof
(
struct
sctphdr
));
af
=
sctp_get_af_specific
(
ipver2af
(
skb
->
nh
.
iph
->
version
));
if
(
unlikely
(
!
af
))
goto
bad_packet
;
sctp_sockaddr_storage_init
(
&
src
,
skb
,
1
);
sctp_sockaddr_storage_init
(
&
dest
,
skb
,
0
);
/* Initialize local addresses for lookups. */
af
->
from_skb
(
&
src
,
skb
,
1
);
af
->
from_skb
(
&
dest
,
skb
,
0
);
/* If the packet is to or from a non-unicast address,
* silently discard the packet.
...
...
@@ -431,7 +384,7 @@ void sctp_unhash_endpoint(sctp_endpoint_t *ep)
}
/* Look up an endpoint. */
sctp_endpoint_t
*
__sctp_rcv_lookup_endpoint
(
const
sockaddr_storage_t
*
laddr
)
sctp_endpoint_t
*
__sctp_rcv_lookup_endpoint
(
const
union
sctp_addr
*
laddr
)
{
sctp_hashbucket_t
*
head
;
sctp_endpoint_common_t
*
epb
;
...
...
@@ -523,8 +476,8 @@ void __sctp_unhash_established(sctp_association_t *asoc)
}
/* Look up an association. */
sctp_association_t
*
__sctp_lookup_association
(
const
sockaddr_storage_t
*
laddr
,
const
sockaddr_storage_t
*
paddr
,
sctp_association_t
*
__sctp_lookup_association
(
const
union
sctp_addr
*
laddr
,
const
union
sctp_addr
*
paddr
,
sctp_transport_t
**
transportp
)
{
sctp_hashbucket_t
*
head
;
...
...
@@ -559,8 +512,8 @@ sctp_association_t *__sctp_lookup_association(const sockaddr_storage_t *laddr,
}
/* Look up an association. BH-safe. */
sctp_association_t
*
sctp_lookup_association
(
const
sockaddr_storage_t
*
laddr
,
const
sockaddr_storage_t
*
paddr
,
sctp_association_t
*
sctp_lookup_association
(
const
union
sctp_addr
*
laddr
,
const
union
sctp_addr
*
paddr
,
sctp_transport_t
**
transportp
)
{
sctp_association_t
*
asoc
;
...
...
@@ -573,8 +526,8 @@ sctp_association_t *sctp_lookup_association(const sockaddr_storage_t *laddr,
}
/* Is there an association matching the given local and peer addresses? */
int
sctp_has_association
(
const
sockaddr_storage_t
*
laddr
,
const
sockaddr_storage_t
*
paddr
)
int
sctp_has_association
(
const
union
sctp_addr
*
laddr
,
const
union
sctp_addr
*
paddr
)
{
sctp_association_t
*
asoc
;
sctp_transport_t
*
transport
;
...
...
@@ -606,12 +559,12 @@ int sctp_has_association(const sockaddr_storage_t *laddr,
* in certain circumstances.
*
*/
static
sctp_association_t
*
__sctp_rcv_init
ack
_lookup
(
struct
sk_buff
*
skb
,
const
sockaddr_storage_t
*
laddr
,
sctp_transport_t
**
transportp
)
static
sctp_association_t
*
__sctp_rcv_init_lookup
(
struct
sk_buff
*
skb
,
const
union
sctp_addr
*
laddr
,
sctp_transport_t
**
transportp
)
{
sctp_association_t
*
asoc
;
sockaddr_storage_t
addr
;
sockaddr_storage_t
*
paddr
=
&
addr
;
union
sctp_addr
addr
;
union
sctp_addr
*
paddr
=
&
addr
;
struct
sctphdr
*
sh
=
(
struct
sctphdr
*
)
skb
->
h
.
raw
;
sctp_chunkhdr_t
*
ch
;
union
sctp_params
params
;
...
...
@@ -665,20 +618,20 @@ static sctp_association_t *__sctp_rcv_initack_lookup(struct sk_buff *skb,
/* Lookup an association for an inbound skb. */
sctp_association_t
*
__sctp_rcv_lookup
(
struct
sk_buff
*
skb
,
const
sockaddr_storage_t
*
paddr
,
const
sockaddr_storage_t
*
laddr
,
const
union
sctp_addr
*
paddr
,
const
union
sctp_addr
*
laddr
,
sctp_transport_t
**
transportp
)
{
sctp_association_t
*
asoc
;
asoc
=
__sctp_lookup_association
(
laddr
,
paddr
,
transportp
);
/* Further lookup for INIT
-ACK packet
.
/* Further lookup for INIT
/INIT-ACK packets
.
* SCTP Implementors Guide, 2.18 Handling of address
* parameters within the INIT or INIT-ACK.
*/
if
(
!
asoc
)
asoc
=
__sctp_rcv_init
ack
_lookup
(
skb
,
laddr
,
transportp
);
asoc
=
__sctp_rcv_init_lookup
(
skb
,
laddr
,
transportp
);
return
asoc
;
}
...
...
net/sctp/ipv6.c
View file @
e025484e
...
...
@@ -172,8 +172,8 @@ static inline int sctp_v6_xmit(struct sk_buff *skb)
/* Returns the dst cache entry for the given source and destination ip
* addresses.
*/
struct
dst_entry
*
sctp_v6_get_dst
(
sockaddr_storage_t
*
daddr
,
sockaddr_storage_t
*
saddr
)
struct
dst_entry
*
sctp_v6_get_dst
(
union
sctp_addr
*
daddr
,
union
sctp_addr
*
saddr
)
{
struct
dst_entry
*
dst
;
struct
flowi
fl
=
{
.
nl_u
=
{
.
ip6_u
=
{
.
daddr
=
&
daddr
->
v6
.
sin6_addr
,
...
...
@@ -206,8 +206,63 @@ struct dst_entry *sctp_v6_get_dst(sockaddr_storage_t *daddr,
return
dst
;
}
/* Make a copy of all potential local addresses. */
static
void
sctp_v6_copy_addrlist
(
struct
list_head
*
addrlist
,
struct
net_device
*
dev
)
{
struct
inet6_dev
*
in6_dev
;
struct
inet6_ifaddr
*
ifp
;
struct
sockaddr_storage_list
*
addr
;
read_lock
(
&
addrconf_lock
);
if
((
in6_dev
=
__in6_dev_get
(
dev
))
==
NULL
)
{
read_unlock
(
&
addrconf_lock
);
return
;
}
read_lock
(
&
in6_dev
->
lock
);
for
(
ifp
=
in6_dev
->
addr_list
;
ifp
;
ifp
=
ifp
->
if_next
)
{
/* Add the address to the local list. */
addr
=
t_new
(
struct
sockaddr_storage_list
,
GFP_ATOMIC
);
if
(
addr
)
{
addr
->
a
.
v6
.
sin6_family
=
AF_INET6
;
addr
->
a
.
v6
.
sin6_port
=
0
;
addr
->
a
.
v6
.
sin6_addr
=
ifp
->
addr
;
INIT_LIST_HEAD
(
&
addr
->
list
);
list_add_tail
(
&
addr
->
list
,
addrlist
);
}
}
read_unlock
(
&
in6_dev
->
lock
);
read_unlock
(
&
addrconf_lock
);
}
/* Initialize a sockaddr_storage from in incoming skb. */
static
void
sctp_v6_from_skb
(
union
sctp_addr
*
addr
,
struct
sk_buff
*
skb
,
int
is_saddr
)
{
void
*
from
;
__u16
*
port
;
struct
sctphdr
*
sh
;
port
=
&
addr
->
v6
.
sin6_port
;
addr
->
v6
.
sin6_family
=
AF_INET6
;
addr
->
v6
.
sin6_flowinfo
=
0
;
/* FIXME */
addr
->
v6
.
sin6_scope_id
=
0
;
/* FIXME */
sh
=
(
struct
sctphdr
*
)
skb
->
h
.
raw
;
if
(
is_saddr
)
{
*
port
=
ntohs
(
sh
->
source
);
from
=
&
skb
->
nh
.
ipv6h
->
saddr
;
}
else
{
*
port
=
ntohs
(
sh
->
dest
);
from
=
&
skb
->
nh
.
ipv6h
->
daddr
;
}
ipv6_addr_copy
(
&
addr
->
v6
.
sin6_addr
,
from
);
}
/* Check if the dst entry's source addr matches the given source addr. */
int
sctp_v6_cmp_saddr
(
struct
dst_entry
*
dst
,
sockaddr_storage_t
*
saddr
)
int
sctp_v6_cmp_saddr
(
struct
dst_entry
*
dst
,
union
sctp_addr
*
saddr
)
{
struct
rt6_info
*
rt
=
(
struct
rt6_info
*
)
dst
;
...
...
@@ -227,12 +282,13 @@ static void sctp_inet6_msgname(char *msgname, int *addr_len)
}
/* Initialize a PF_INET msgname from a ulpevent. */
static
void
sctp_inet6_event_msgname
(
sctp_ulpevent_t
*
event
,
char
*
msgname
,
int
*
addrlen
)
static
void
sctp_inet6_event_msgname
(
sctp_ulpevent_t
*
event
,
char
*
msgname
,
int
*
addrlen
)
{
struct
sockaddr_in6
*
sin6
,
*
sin6from
;
if
(
msgname
)
{
sockaddr_storage_t
*
addr
;
union
sctp_addr
*
addr
;
sctp_inet6_msgname
(
msgname
,
addrlen
);
sin6
=
(
struct
sockaddr_in6
*
)
msgname
;
...
...
@@ -327,6 +383,8 @@ static sctp_func_t sctp_ipv6_specific = {
.
setsockopt
=
ipv6_setsockopt
,
.
getsockopt
=
ipv6_getsockopt
,
.
get_dst
=
sctp_v6_get_dst
,
.
copy_addrlist
=
sctp_v6_copy_addrlist
,
.
from_skb
=
sctp_v6_from_skb
,
.
cmp_saddr
=
sctp_v6_cmp_saddr
,
.
net_header_len
=
sizeof
(
struct
ipv6hdr
),
.
sockaddr_len
=
sizeof
(
struct
sockaddr_in6
),
...
...
net/sctp/output.c
View file @
e025484e
...
...
@@ -366,18 +366,13 @@ int sctp_packet_transmit(sctp_packet_t *packet)
*/
sh
->
checksum
=
htonl
(
crc32
);
/* FIXME: Delete the rest of this switch statement once phase 2
* of address selection (ipv6 support) drops in.
*/
switch
(
transport
->
ipaddr
.
sa
.
sa_family
)
{
case
AF_INET
:
inet_sk
(
sk
)
->
daddr
=
transport
->
ipaddr
.
v4
.
sin_addr
.
s_addr
;
break
;
case
AF_INET6
:
SCTP_V6
(
inet6_sk
(
sk
)
->
daddr
=
transport
->
ipaddr
.
v6
.
sin6_addr
;)
break
;
default:
/* This is bogus address type, just bail. */
break
;
};
/* IP layer ECN support
...
...
net/sctp/protocol.c
View file @
e025484e
/* SCTP kernel reference Implementation
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001 International Business Machines, Corp.
* Copyright (c) 2001
-2002
International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
...
...
@@ -103,8 +103,8 @@ void sctp_proc_exit(void)
/* Private helper to extract ipv4 address and stash them in
* the protocol structure.
*/
static
inline
void
sctp_v4_get_local_addr_list
(
sctp_protocol_t
*
proto
,
struct
net_device
*
dev
)
static
void
sctp_v4_copy_addrlist
(
struct
list_head
*
addrlist
,
struct
net_device
*
dev
)
{
struct
in_device
*
in_dev
;
struct
in_ifaddr
*
ifa
;
...
...
@@ -117,7 +117,6 @@ static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto,
}
read_lock
(
&
in_dev
->
lock
);
for
(
ifa
=
in_dev
->
ifa_list
;
ifa
;
ifa
=
ifa
->
ifa_next
)
{
/* Add the address to the local list. */
addr
=
t_new
(
struct
sockaddr_storage_list
,
GFP_ATOMIC
);
...
...
@@ -126,7 +125,7 @@ static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto,
addr
->
a
.
v4
.
sin_family
=
AF_INET
;
addr
->
a
.
v4
.
sin_port
=
0
;
addr
->
a
.
v4
.
sin_addr
.
s_addr
=
ifa
->
ifa_local
;
list_add_tail
(
&
addr
->
list
,
&
proto
->
local_addr_
list
);
list_add_tail
(
&
addr
->
list
,
addr
list
);
}
}
...
...
@@ -134,56 +133,21 @@ static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto,
read_unlock
(
&
inetdev_lock
);
}
/* Private helper to extract ipv6 address and stash them in
* the protocol structure.
* FIXME: Make this an address family function.
*/
static
inline
void
sctp_v6_get_local_addr_list
(
sctp_protocol_t
*
proto
,
struct
net_device
*
dev
)
{
#ifdef SCTP_V6_SUPPORT
/* FIXME: The testframe doesn't support this function. */
#ifndef TEST_FRAME
struct
inet6_dev
*
in6_dev
;
struct
inet6_ifaddr
*
ifp
;
struct
sockaddr_storage_list
*
addr
;
read_lock
(
&
addrconf_lock
);
if
((
in6_dev
=
__in6_dev_get
(
dev
))
==
NULL
)
{
read_unlock
(
&
addrconf_lock
);
return
;
}
read_lock_bh
(
&
in6_dev
->
lock
);
for
(
ifp
=
in6_dev
->
addr_list
;
ifp
;
ifp
=
ifp
->
if_next
)
{
/* Add the address to the local list. */
addr
=
t_new
(
struct
sockaddr_storage_list
,
GFP_ATOMIC
);
if
(
addr
)
{
addr
->
a
.
v6
.
sin6_family
=
AF_INET6
;
addr
->
a
.
v6
.
sin6_port
=
0
;
addr
->
a
.
v6
.
sin6_addr
=
ifp
->
addr
;
INIT_LIST_HEAD
(
&
addr
->
list
);
list_add_tail
(
&
addr
->
list
,
&
proto
->
local_addr_list
);
}
}
read_unlock_bh
(
&
in6_dev
->
lock
);
read_unlock
(
&
addrconf_lock
);
#endif
/* TEST_FRAME */
#endif
/* SCTP_V6_SUPPORT */
}
/* Extract our IP addresses from the system and stash them in the
* protocol structure.
*/
static
void
__sctp_get_local_addr_list
(
sctp_protocol_t
*
proto
)
{
struct
net_device
*
dev
;
struct
list_head
*
pos
;
struct
sctp_func
*
af
;
read_lock
(
&
dev_base_lock
);
for
(
dev
=
dev_base
;
dev
;
dev
=
dev
->
next
)
{
sctp_v4_get_local_addr_list
(
proto
,
dev
);
sctp_v6_get_local_addr_list
(
proto
,
dev
);
list_for_each
(
pos
,
&
proto
->
address_families
)
{
af
=
list_entry
(
pos
,
sctp_func_t
,
list
);
af
->
copy_addrlist
(
&
proto
->
local_addr_list
,
dev
);
}
}
read_unlock
(
&
dev_base_lock
);
}
...
...
@@ -259,8 +223,8 @@ int sctp_copy_local_addr_list(sctp_protocol_t *proto, sctp_bind_addr_t *bp,
/* Returns the dst cache entry for the given source and destination ip
* addresses.
*/
struct
dst_entry
*
sctp_v4_get_dst
(
sockaddr_storage_t
*
daddr
,
sockaddr_storage_t
*
saddr
)
struct
dst_entry
*
sctp_v4_get_dst
(
union
sctp_addr
*
daddr
,
union
sctp_addr
*
saddr
)
{
struct
rtable
*
rt
;
struct
flowi
fl
=
{
.
nl_u
=
{
.
ip4_u
=
{
.
daddr
=
...
...
@@ -285,8 +249,31 @@ struct dst_entry *sctp_v4_get_dst(sockaddr_storage_t *daddr,
return
&
rt
->
u
.
dst
;
}
/* Initialize a sctp_addr from in incoming skb. */
static
void
sctp_v4_from_skb
(
union
sctp_addr
*
addr
,
struct
sk_buff
*
skb
,
int
is_saddr
)
{
void
*
from
;
__u16
*
port
;
struct
sctphdr
*
sh
;
port
=
&
addr
->
v4
.
sin_port
;
addr
->
v4
.
sin_family
=
AF_INET
;
sh
=
(
struct
sctphdr
*
)
skb
->
h
.
raw
;
if
(
is_saddr
)
{
*
port
=
ntohs
(
sh
->
source
);
from
=
&
skb
->
nh
.
iph
->
saddr
;
}
else
{
*
port
=
ntohs
(
sh
->
dest
);
from
=
&
skb
->
nh
.
iph
->
daddr
;
}
memcpy
(
&
addr
->
v4
.
sin_addr
.
s_addr
,
from
,
sizeof
(
struct
in_addr
));
}
/* Check if the dst entry's source addr matches the given source addr. */
int
sctp_v4_cmp_saddr
(
struct
dst_entry
*
dst
,
sockaddr_storage_t
*
saddr
)
int
sctp_v4_cmp_saddr
(
struct
dst_entry
*
dst
,
union
sctp_addr
*
saddr
)
{
struct
rtable
*
rt
=
(
struct
rtable
*
)
dst
;
...
...
@@ -336,11 +323,11 @@ int sctp_ctl_sock_init(void)
/* Get the table of functions for manipulating a particular address
* family.
*/
sctp_func_t
*
sctp_get_af_specific
(
const
sockaddr_storage_t
*
address
)
sctp_func_t
*
sctp_get_af_specific
(
sa_family_t
family
)
{
struct
list_head
*
pos
;
sctp_protocol_t
*
proto
=
sctp_get_protocol
();
s
ctp_func_t
*
retval
,
*
af
;
s
truct
sctp_func
*
retval
,
*
af
;
retval
=
NULL
;
...
...
@@ -349,7 +336,7 @@ sctp_func_t *sctp_get_af_specific(const sockaddr_storage_t *address)
*/
list_for_each
(
pos
,
&
proto
->
address_families
)
{
af
=
list_entry
(
pos
,
sctp_func_t
,
list
);
if
(
address
->
sa
.
sa_
family
==
af
->
sa_family
)
{
if
(
family
==
af
->
sa_family
)
{
retval
=
af
;
break
;
}
...
...
@@ -448,11 +435,13 @@ static struct inet_protocol sctp_protocol = {
};
/* IPv4 address related functions. */
s
ctp_func_t
sctp_ipv4_specific
=
{
s
truct
sctp_func
sctp_ipv4_specific
=
{
.
queue_xmit
=
ip_queue_xmit
,
.
setsockopt
=
ip_setsockopt
,
.
getsockopt
=
ip_getsockopt
,
.
get_dst
=
sctp_v4_get_dst
,
.
copy_addrlist
=
sctp_v4_copy_addrlist
,
.
from_skb
=
sctp_v4_from_skb
,
.
cmp_saddr
=
sctp_v4_cmp_saddr
,
.
net_header_len
=
sizeof
(
struct
iphdr
),
.
sockaddr_len
=
sizeof
(
struct
sockaddr_in
),
...
...
net/sctp/sm_make_chunk.c
View file @
e025484e
...
...
@@ -1033,7 +1033,7 @@ sctp_chunk_t *sctp_chunkify(struct sk_buff *skb, const sctp_association_t *asoc,
/* Set chunk->source and dest based on the IP header in chunk->skb. */
void
sctp_init_addrs
(
sctp_chunk_t
*
chunk
)
{
sockaddr_storage_t
*
source
,
*
dest
;
union
sctp_addr
*
source
,
*
dest
;
struct
sk_buff
*
skb
;
struct
sctphdr
*
sh
;
struct
iphdr
*
ih4
;
...
...
@@ -1075,7 +1075,7 @@ void sctp_init_addrs(sctp_chunk_t *chunk)
}
/* Extract the source address from a chunk. */
const
sockaddr_storage_t
*
sctp_source
(
const
sctp_chunk_t
*
chunk
)
const
union
sctp_addr
*
sctp_source
(
const
sctp_chunk_t
*
chunk
)
{
/* If we have a known transport, use that. */
if
(
chunk
->
transport
)
{
...
...
@@ -1661,7 +1661,7 @@ int sctp_verify_init(const sctp_association_t *asoc,
* Returns 0 on failure, else success.
*/
int
sctp_process_init
(
sctp_association_t
*
asoc
,
sctp_cid_t
cid
,
const
sockaddr_storage_t
*
peer_addr
,
const
union
sctp_addr
*
peer_addr
,
sctp_init_chunk_t
*
peer_init
,
int
priority
)
{
...
...
@@ -1780,9 +1780,9 @@ int sctp_process_init(sctp_association_t *asoc, sctp_cid_t cid,
* structures for the addresses.
*/
int
sctp_process_param
(
sctp_association_t
*
asoc
,
union
sctp_params
param
,
const
sockaddr_storage_t
*
peer_addr
,
int
priority
)
const
union
sctp_addr
*
peer_addr
,
int
priority
)
{
sockaddr_storage_t
addr
;
union
sctp_addr
addr
;
int
i
;
__u16
sat
;
int
retval
=
1
;
...
...
@@ -1906,8 +1906,8 @@ __u32 sctp_generate_tsn(const sctp_endpoint_t *ep)
* 4th Level Abstractions
********************************************************************/
/* Convert from an SCTP IP parameter to a
sockaddr_storage_t
. */
void
sctp_param2sockaddr
(
sockaddr_storage_t
*
addr
,
sctp_addr_param_t
*
param
,
/* Convert from an SCTP IP parameter to a
union sctp_addr
. */
void
sctp_param2sockaddr
(
union
sctp_addr
*
addr
,
sctp_addr_param_t
*
param
,
__u16
port
)
{
switch
(
param
->
v4
.
param_hdr
.
type
)
{
...
...
@@ -1934,7 +1934,7 @@ void sctp_param2sockaddr(sockaddr_storage_t *addr, sctp_addr_param_t *param,
/* Convert an IP address in an SCTP param into a sockaddr_in. */
/* Returns true if a valid conversion was possible. */
int
sctp_addr2sockaddr
(
union
sctp_params
p
,
sockaddr_storage_t
*
sa
)
int
sctp_addr2sockaddr
(
union
sctp_params
p
,
union
sctp_addr
*
sa
)
{
switch
(
p
.
p
->
type
)
{
case
SCTP_PARAM_IPV4_ADDRESS
:
...
...
@@ -1955,30 +1955,10 @@ int sctp_addr2sockaddr(union sctp_params p, sockaddr_storage_t *sa)
return
1
;
}
/* Convert from an IP version number to an Address Family symbol. */
int
ipver2af
(
__u8
ipver
)
{
int
family
;
switch
(
ipver
)
{
case
4
:
family
=
AF_INET
;
break
;
case
6
:
family
=
AF_INET6
;
break
;
default:
family
=
0
;
break
;
};
return
family
;
}
/* Convert a sockaddr_in to an IP address in an SCTP param.
* Returns len if a valid conversion was possible.
*/
int
sockaddr2sctp_addr
(
const
sockaddr_storage_t
*
sa
,
sctp_addr_param_t
*
p
)
int
sockaddr2sctp_addr
(
const
union
sctp_addr
*
sa
,
sctp_addr_param_t
*
p
)
{
int
len
=
0
;
...
...
net/sctp/sm_statefuns.c
View file @
e025484e
...
...
@@ -832,7 +832,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const sctp_endpoint_t *ep,
sctp_cmd_seq_t
*
commands
)
{
sctp_chunk_t
*
chunk
=
arg
;
sockaddr_storage_t
from_addr
;
union
sctp_addr
from_addr
;
sctp_transport_t
*
link
;
sctp_sender_hb_info_t
*
hbinfo
;
unsigned
long
max_interval
;
...
...
@@ -881,7 +881,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const sctp_endpoint_t *ep,
/* Helper function to send out an abort for the restart
* condition.
*/
static
int
sctp_sf_send_restart_abort
(
sockaddr_storage_t
*
ssa
,
static
int
sctp_sf_send_restart_abort
(
union
sctp_addr
*
ssa
,
sctp_chunk_t
*
init
,
sctp_cmd_seq_t
*
commands
)
{
...
...
@@ -4313,7 +4313,7 @@ sctp_packet_t *sctp_ootb_pkt_new(const sctp_association_t *asoc,
/* Cache a route for the transport with the chunk's destination as
* the source address.
*/
sctp_transport_route
(
transport
,
(
sockaddr_storage_t
*
)
&
chunk
->
dest
);
sctp_transport_route
(
transport
,
(
union
sctp_addr
*
)
&
chunk
->
dest
);
packet
=
sctp_packet_init
(
packet
,
transport
,
sport
,
dport
);
packet
=
sctp_packet_config
(
packet
,
vtag
,
0
,
NULL
);
...
...
net/sctp/socket.c
View file @
e025484e
...
...
@@ -87,14 +87,14 @@ static int sctp_wait_for_sndbuf(sctp_association_t *asoc, long *timeo_p,
int
msg_len
);
static
int
sctp_wait_for_packet
(
struct
sock
*
sk
,
int
*
err
,
long
*
timeo_p
);
static
inline
void
sctp_sk_addr_set
(
struct
sock
*
,
const
sockaddr_storage_t
*
newaddr
,
sockaddr_storage_t
*
saveaddr
);
const
union
sctp_addr
*
newaddr
,
union
sctp_addr
*
saveaddr
);
static
inline
void
sctp_sk_addr_restore
(
struct
sock
*
,
const
sockaddr_storage_t
*
);
const
union
sctp_addr
*
);
static
inline
int
sctp_sendmsg_verify_name
(
struct
sock
*
,
struct
msghdr
*
);
static
int
sctp_bindx_add
(
struct
sock
*
,
struct
sockaddr_storage
*
,
int
);
static
int
sctp_bindx_rem
(
struct
sock
*
,
struct
sockaddr_storage
*
,
int
);
static
int
sctp_do_bind
(
struct
sock
*
,
sockaddr_storage_t
*
,
int
);
static
int
sctp_do_bind
(
struct
sock
*
,
union
sctp_addr
*
,
int
);
static
int
sctp_autobind
(
struct
sock
*
sk
);
...
...
@@ -122,7 +122,7 @@ int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
/* Disallow binding twice. */
if
(
!
sctp_sk
(
sk
)
->
ep
->
base
.
bind_addr
.
port
)
retval
=
sctp_do_bind
(
sk
,
(
sockaddr_storage_t
*
)
uaddr
,
retval
=
sctp_do_bind
(
sk
,
(
union
sctp_addr
*
)
uaddr
,
addr_len
);
else
retval
=
-
EINVAL
;
...
...
@@ -135,14 +135,14 @@ int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
static
long
sctp_get_port_local
(
struct
sock
*
,
unsigned
short
);
/* Bind a local address either to an endpoint or to an association. */
SCTP_STATIC
int
sctp_do_bind
(
struct
sock
*
sk
,
sockaddr_storage_t
*
newaddr
,
SCTP_STATIC
int
sctp_do_bind
(
struct
sock
*
sk
,
union
sctp_addr
*
newaddr
,
int
addr_len
)
{
sctp_opt_t
*
sp
=
sctp_sk
(
sk
);
sctp_endpoint_t
*
ep
=
sp
->
ep
;
sctp_bind_addr_t
*
bp
=
&
ep
->
base
.
bind_addr
;
unsigned
short
sa_family
=
newaddr
->
sa
.
sa_family
;
sockaddr_storage_t
tmpaddr
,
saveaddr
;
union
sctp_addr
tmpaddr
,
saveaddr
;
unsigned
short
*
snum
;
int
ret
=
0
;
...
...
@@ -403,7 +403,7 @@ int sctp_bindx_add(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt)
goto
err_bindx_add
;
};
retval
=
sctp_do_bind
(
sk
,
(
sockaddr_storage_t
*
)
&
addrs
[
cnt
],
retval
=
sctp_do_bind
(
sk
,
(
union
sctp_addr
*
)
&
addrs
[
cnt
],
addr_len
);
err_bindx_add:
...
...
@@ -481,7 +481,7 @@ int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt)
int
cnt
;
sctp_bind_addr_t
*
bp
=
&
ep
->
base
.
bind_addr
;
int
retval
=
0
;
sockaddr_storage_t
saveaddr
;
union
sctp_addr
saveaddr
;
SCTP_DEBUG_PRINTK
(
"sctp_bindx_rem (sk: %p, addrs: %p, addrcnt: %d)
\n
"
,
sk
,
addrs
,
addrcnt
);
...
...
@@ -500,7 +500,7 @@ int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt)
*/
switch
(((
struct
sockaddr
*
)
&
addrs
[
cnt
])
->
sa_family
)
{
case
AF_INET
:
saveaddr
=
*
((
sockaddr_storage_t
*
)
saveaddr
=
*
((
union
sctp_addr
*
)
&
addrs
[
cnt
]);
saveaddr
.
v4
.
sin_port
=
ntohs
(
saveaddr
.
v4
.
sin_port
);
/* Verify the port. */
...
...
@@ -511,7 +511,7 @@ int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt)
break
;
case
AF_INET6
:
saveaddr
=
*
((
sockaddr_storage_t
*
)
saveaddr
=
*
((
union
sctp_addr
*
)
&
addrs
[
cnt
]);
saveaddr
.
v6
.
sin6_port
=
ntohs
(
saveaddr
.
v6
.
sin6_port
);
...
...
@@ -741,7 +741,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
sctp_association_t
*
new_asoc
=
NULL
,
*
asoc
=
NULL
;
sctp_transport_t
*
transport
;
sctp_chunk_t
*
chunk
=
NULL
;
sockaddr_storage_t
to
;
union
sctp_addr
to
;
struct
sockaddr
*
msg_name
=
NULL
;
struct
sctp_sndrcvinfo
default_sinfo
=
{
0
};
struct
sctp_sndrcvinfo
*
sinfo
;
...
...
@@ -1258,7 +1258,7 @@ static inline int sctp_setsockopt_set_peer_addr_params(struct sock *sk,
{
struct
sctp_paddrparams
params
;
sctp_association_t
*
asoc
;
sockaddr_storage_t
*
addr
;
union
sctp_addr
*
addr
;
sctp_transport_t
*
trans
;
int
error
;
...
...
@@ -1271,7 +1271,7 @@ static inline int sctp_setsockopt_set_peer_addr_params(struct sock *sk,
if
(
!
asoc
)
return
-
EINVAL
;
addr
=
(
sockaddr_storage_t
*
)
&
(
params
.
spp_address
);
addr
=
(
union
sctp_addr
*
)
&
(
params
.
spp_address
);
trans
=
sctp_assoc_lookup_paddr
(
asoc
,
addr
);
if
(
!
trans
)
...
...
@@ -1606,7 +1606,7 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len, char *optval,
status
.
sstat_fragmentation_point
=
assoc
->
frag_point
;
status
.
sstat_primary
.
spinfo_assoc_id
=
sctp_assoc2id
(
transport
->
asoc
);
memcpy
(
&
status
.
sstat_primary
.
spinfo_address
,
&
(
transport
->
ipaddr
),
sizeof
(
sockaddr_storage_t
));
&
(
transport
->
ipaddr
),
sizeof
(
union
sctp_addr
));
status
.
sstat_primary
.
spinfo_state
=
transport
->
active
;
status
.
sstat_primary
.
spinfo_cwnd
=
transport
->
cwnd
;
status
.
sstat_primary
.
spinfo_srtt
=
transport
->
srtt
;
...
...
@@ -1781,7 +1781,7 @@ static inline int sctp_getsockopt_get_peer_addr_params(struct sock *sk,
{
struct
sctp_paddrparams
params
;
sctp_association_t
*
asoc
;
sockaddr_storage_t
*
addr
;
union
sctp_addr
*
addr
;
sctp_transport_t
*
trans
;
if
(
len
!=
sizeof
(
struct
sctp_paddrparams
))
...
...
@@ -1793,7 +1793,7 @@ static inline int sctp_getsockopt_get_peer_addr_params(struct sock *sk,
if
(
!
asoc
)
return
-
EINVAL
;
addr
=
(
sockaddr_storage_t
*
)
&
(
params
.
spp_address
);
addr
=
(
union
sctp_addr
*
)
&
(
params
.
spp_address
);
trans
=
sctp_assoc_lookup_paddr
(
asoc
,
addr
);
if
(
!
trans
)
...
...
@@ -1990,7 +1990,7 @@ static long sctp_get_port_local(struct sock *sk, unsigned short snum)
* socket is going to be sk2.
*/
int
sk_reuse
=
sk
->
reuse
;
sockaddr_storage_t
tmpaddr
;
union
sctp_addr
tmpaddr
;
struct
sock
*
sk2
=
pp
->
sk
;
SCTP_DEBUG_PRINTK
(
"sctp_get_port() found a "
...
...
@@ -2293,10 +2293,10 @@ void sctp_put_port(struct sock *sk)
*/
static
int
sctp_autobind
(
struct
sock
*
sk
)
{
sockaddr_storage_t
autoaddr
;
union
sctp_addr
autoaddr
;
int
addr_len
=
0
;
memset
(
&
autoaddr
,
0
,
sizeof
(
sockaddr_storage_t
));
memset
(
&
autoaddr
,
0
,
sizeof
(
union
sctp_addr
));
switch
(
sk
->
family
)
{
case
PF_INET
:
...
...
@@ -2437,8 +2437,8 @@ SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg,
/* Setup sk->rcv_saddr before calling get_port(). */
static
inline
void
sctp_sk_addr_set
(
struct
sock
*
sk
,
const
sockaddr_storage_t
*
newaddr
,
sockaddr_storage_t
*
saveaddr
)
const
union
sctp_addr
*
newaddr
,
union
sctp_addr
*
saveaddr
)
{
struct
inet_opt
*
inet
=
inet_sk
(
sk
);
...
...
@@ -2465,7 +2465,7 @@ static inline void sctp_sk_addr_set(struct sock *sk,
}
/* Restore sk->rcv_saddr after failing get_port(). */
static
inline
void
sctp_sk_addr_restore
(
struct
sock
*
sk
,
const
sockaddr_storage_t
*
addr
)
static
inline
void
sctp_sk_addr_restore
(
struct
sock
*
sk
,
const
union
sctp_addr
*
addr
)
{
struct
inet_opt
*
inet
=
inet_sk
(
sk
);
...
...
@@ -2610,12 +2610,12 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, int no
static
inline
int
sctp_sendmsg_verify_name
(
struct
sock
*
sk
,
struct
msghdr
*
msg
)
{
sockaddr_storage_t
*
sa
;
union
sctp_addr
*
sa
;
if
(
msg
->
msg_namelen
<
sizeof
(
struct
sockaddr
))
return
-
EINVAL
;
sa
=
(
sockaddr_storage_t
*
)
msg
->
msg_name
;
sa
=
(
union
sctp_addr
*
)
msg
->
msg_name
;
switch
(
sa
->
sa
.
sa_family
)
{
case
AF_INET
:
if
(
msg
->
msg_namelen
<
sizeof
(
struct
sockaddr_in
))
...
...
net/sctp/transport.c
View file @
e025484e
...
...
@@ -9,7 +9,7 @@
*
* This module provides the abstraction for an SCTP tranport representing
* a remote transport address. For local transport addresses, we just use
*
sockaddr_storage_t
.
*
union sctp_addr
.
*
* The SCTP reference implementation is free software;
* you can redistribute it and/or modify it under the terms of
...
...
@@ -53,7 +53,7 @@
/* 1st Level Abstractions. */
/* Allocate and initialize a new transport. */
sctp_transport_t
*
sctp_transport_new
(
const
sockaddr_storage_t
*
addr
,
int
priority
)
sctp_transport_t
*
sctp_transport_new
(
const
union
sctp_addr
*
addr
,
int
priority
)
{
sctp_transport_t
*
transport
;
...
...
@@ -78,14 +78,14 @@ sctp_transport_t *sctp_transport_new(const sockaddr_storage_t *addr, int priorit
/* Intialize a new transport from provided memory. */
sctp_transport_t
*
sctp_transport_init
(
sctp_transport_t
*
peer
,
const
sockaddr_storage_t
*
addr
,
const
union
sctp_addr
*
addr
,
int
priority
)
{
sctp_protocol_t
*
proto
=
sctp_get_protocol
();
/* Copy in the address. */
peer
->
ipaddr
=
*
addr
;
peer
->
af_specific
=
sctp_get_af_specific
(
addr
);
peer
->
af_specific
=
sctp_get_af_specific
(
addr
->
sa
.
sa_family
);
peer
->
asoc
=
NULL
;
/* From 6.3.1 RTO Calculation:
...
...
@@ -204,11 +204,11 @@ void sctp_transport_set_owner(sctp_transport_t *transport,
* souce address.
*/
void
sctp_transport_route
(
sctp_transport_t
*
transport
,
sockaddr_storage_t
*
saddr
)
union
sctp_addr
*
saddr
)
{
sctp_association_t
*
asoc
=
transport
->
asoc
;
sctp_func_t
*
af
=
transport
->
af_specific
;
sockaddr_storage_t
*
daddr
=
&
transport
->
ipaddr
;
union
sctp_addr
*
daddr
=
&
transport
->
ipaddr
;
sctp_bind_addr_t
*
bp
;
rwlock_t
*
addr_lock
;
struct
sockaddr_storage_list
*
laddr
;
...
...
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