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
09593bb6
Commit
09593bb6
authored
May 05, 2003
by
Jon Grimm
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SCTP] Support SCTP ECN on ipv6.
parent
02350834
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
38 additions
and
20 deletions
+38
-20
include/net/sctp/structs.h
include/net/sctp/structs.h
+1
-0
net/sctp/ipv6.c
net/sctp/ipv6.c
+7
-0
net/sctp/output.c
net/sctp/output.c
+7
-11
net/sctp/protocol.c
net/sctp/protocol.c
+9
-1
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+14
-8
No files found.
include/net/sctp/structs.h
View file @
09593bb6
...
...
@@ -239,6 +239,7 @@ struct sctp_af {
int
(
*
is_any
)
(
const
union
sctp_addr
*
);
int
(
*
available
)
(
const
union
sctp_addr
*
);
int
(
*
skb_iif
)
(
const
struct
sk_buff
*
sk
);
int
(
*
is_ce
)
(
const
struct
sk_buff
*
sk
);
__u16
net_header_len
;
int
sockaddr_len
;
sa_family_t
sa_family
;
...
...
net/sctp/ipv6.c
View file @
09593bb6
...
...
@@ -572,6 +572,12 @@ static int sctp_v6_skb_iif(const struct sk_buff *skb)
return
opt
->
iif
;
}
/* Was this packet marked by Explicit Congestion Notification? */
static
int
sctp_v6_is_ce
(
const
struct
sk_buff
*
skb
)
{
return
*
((
__u32
*
)(
skb
->
nh
.
ipv6h
))
&
htonl
(
1
<<
20
);
}
/* Initialize a PF_INET6 socket msg_name. */
static
void
sctp_inet6_msgname
(
char
*
msgname
,
int
*
addr_len
)
{
...
...
@@ -832,6 +838,7 @@ static struct sctp_af sctp_ipv6_specific = {
.
is_any
=
sctp_v6_is_any
,
.
available
=
sctp_v6_available
,
.
skb_iif
=
sctp_v6_skb_iif
,
.
is_ce
=
sctp_v6_is_ce
,
.
net_header_len
=
sizeof
(
struct
ipv6hdr
),
.
sockaddr_len
=
sizeof
(
struct
sockaddr_in6
),
.
sa_family
=
AF_INET6
,
...
...
net/sctp/output.c
View file @
09593bb6
...
...
@@ -419,17 +419,13 @@ int sctp_packet_transmit(struct sctp_packet *packet)
* data sender to indicate that the end-points of the
* transport protocol are ECN-capable."
*
* If ECN capable && negotiated && it makes sense for
* this packet to support it (e.g. post ECN negotiation)
* then lets set the ECT bit
* Now setting the ECT bit all the time, as it should not cause
* any problems protocol-wise even if our peer ignores it.
*
* FIXME: Need to do something else for IPv6
* Note: The works for IPv6 layer checks this bit too later
* in transmission. See IP6_ECN_flow_xmit().
*/
if
(
packet
->
ecn_capable
)
{
INET_ECN_xmit
(
nskb
->
sk
);
}
else
{
INET_ECN_dontxmit
(
nskb
->
sk
);
}
/* Set up the IP options. */
/* BUG: not implemented
...
...
net/sctp/protocol.c
View file @
09593bb6
...
...
@@ -56,6 +56,7 @@
#include <net/sctp/sctp.h>
#include <net/addrconf.h>
#include <net/inet_common.h>
#include <net/inet_ecn.h>
/* Global data structures. */
struct
sctp_protocol
sctp_proto
;
...
...
@@ -491,11 +492,17 @@ void sctp_v4_get_saddr(struct sctp_association *asoc,
}
/* What interface did this skb arrive on? */
int
sctp_v4_skb_iif
(
const
struct
sk_buff
*
skb
)
static
int
sctp_v4_skb_iif
(
const
struct
sk_buff
*
skb
)
{
return
((
struct
rtable
*
)
skb
->
dst
)
->
rt_iif
;
}
/* Was this packet marked by Explicit Congestion Notification? */
static
int
sctp_v4_is_ce
(
const
struct
sk_buff
*
skb
)
{
return
INET_ECN_is_ce
(
skb
->
nh
.
iph
->
tos
);
}
/* Create and initialize a new sk for the socket returned by accept(). */
struct
sock
*
sctp_v4_create_accept_sk
(
struct
sock
*
sk
,
struct
sctp_association
*
asoc
)
...
...
@@ -829,6 +836,7 @@ struct sctp_af sctp_ipv4_specific = {
.
available
=
sctp_v4_available
,
.
scope
=
sctp_v4_scope
,
.
skb_iif
=
sctp_v4_skb_iif
,
.
is_ce
=
sctp_v4_is_ce
,
.
net_header_len
=
sizeof
(
struct
iphdr
),
.
sockaddr_len
=
sizeof
(
struct
sockaddr_in
),
.
sa_family
=
AF_INET
,
...
...
net/sctp/sm_statefuns.c
View file @
09593bb6
...
...
@@ -2310,9 +2310,7 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
skb_pull
(
chunk
->
skb
,
sizeof
(
sctp_datahdr_t
));
tsn
=
ntohl
(
data_hdr
->
tsn
);
SCTP_DEBUG_PRINTK
(
"eat_data: TSN 0x%x.
\n
"
,
tsn
);
SCTP_DEBUG_PRINTK
(
"eat_data: skb->head %p.
\n
"
,
chunk
->
skb
->
head
);
/* ASSERT: Now skb->data is really the user data. */
...
...
@@ -2327,9 +2325,13 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
*/
if
(
!
chunk
->
ecn_ce_done
)
{
struct
sctp_af
*
af
;
chunk
->
ecn_ce_done
=
1
;
if
(
INET_ECN_is_ce
(
chunk
->
skb
->
nh
.
iph
->
tos
)
&&
asoc
->
peer
.
ecn_capable
)
{
af
=
sctp_get_af_specific
(
ipver2af
(
chunk
->
skb
->
nh
.
iph
->
version
));
if
(
af
&&
af
->
is_ce
(
chunk
->
skb
)
&&
asoc
->
peer
.
ecn_capable
)
{
/* Do real work as sideffect. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ECN_CE
,
SCTP_U32
(
tsn
));
...
...
@@ -2583,9 +2585,13 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const struct sctp_endpoint *ep,
* chunk later.
*/
if
(
!
chunk
->
ecn_ce_done
)
{
struct
sctp_af
*
af
;
chunk
->
ecn_ce_done
=
1
;
if
(
INET_ECN_is_ce
(
chunk
->
skb
->
nh
.
iph
->
tos
)
&&
asoc
->
peer
.
ecn_capable
)
{
af
=
sctp_get_af_specific
(
ipver2af
(
chunk
->
skb
->
nh
.
iph
->
version
));
if
(
af
&&
af
->
is_ce
(
chunk
->
skb
)
&&
asoc
->
peer
.
ecn_capable
)
{
/* Do real work as sideffect. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ECN_CE
,
SCTP_U32
(
tsn
));
...
...
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