SCTP cleanups
Subsystems (3)
Marcelo Ricardo Leitner
maintainercover SCTP cleanups
Some cleanups/simplifications I've been collecting. Resending now with net-next open.
Marcelo Ricardo Leitner (5):
sctp: reduce indent level at sctp_sf_tabort_8_4_8
sctp: reduce indent level in sctp_sf_shut_8_4_5
sctp: simplify addr copy
sctp: remove return value from sctp_packet_init/config
sctp: sctp_chunk_length_valid should return bool
include/net/sctp/structs.h | 7 ++- net/sctp/ipv6.c | 16 +++--- net/sctp/output.c | 14 ++---- net/sctp/protocol.c | 18 +++---- net/sctp/sm_statefuns.c | 122 ++++++++++++++++++++++----------------------- 5 files changed, 81 insertions(+), 96 deletions(-)
Signature · 1 line
2.9.3
Marcelo Ricardo Leitner
maintainerPATCH RESEND 1/5 sctp: reduce indent level at sctp_sf_tabort_8_4_8
--- net/sctp/sm_statefuns.c | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-)
net/sctp/sm_statefuns.c +21 -23
@@ -3237,36 +3237,34 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(struct net *net,struct sctp_chunk *abort; packet =sctp_ootb_pkt_new (net, asoc, chunk); +if (!packet) +return SCTP_DISPOSITION_NOMEM ; -if (packet) { -/* Make an ABORT. The T bit will be set if the asoc -* is NULL. -*/ - abort =sctp_make_abort (asoc, chunk,0 ); -if (!abort) { -sctp_ootb_pkt_free (packet); -return SCTP_DISPOSITION_NOMEM ; - } +/* Make an ABORT. The T bit will be set if the asoc +* is NULL. +*/ + abort =sctp_make_abort (asoc, chunk,0 ); +if (!abort) { +sctp_ootb_pkt_free (packet); +return SCTP_DISPOSITION_NOMEM ; + } -/* Reflect vtag if T-Bit is set */ -if (sctp_test_T_bit (abort)) - packet->vtag =ntohl (chunk->sctp_hdr->vtag); +/* Reflect vtag if T-Bit is set */ +if (sctp_test_T_bit (abort)) + packet->vtag =ntohl (chunk->sctp_hdr->vtag); -/* Set the skb to the belonging sock for accounting. */ - abort->skb->sk = ep->base.sk; +/* Set the skb to the belonging sock for accounting. */ + abort->skb->sk = ep->base.sk; -sctp_packet_append_chunk (packet, abort); +sctp_packet_append_chunk (packet, abort); -sctp_add_cmd_sf (commands,SCTP_CMD_SEND_PKT , -SCTP_PACKET (packet)); - -SCTP_INC_STATS (net,SCTP_MIB_OUTCTRLCHUNKS ); +sctp_add_cmd_sf (commands,SCTP_CMD_SEND_PKT , +SCTP_PACKET (packet)); -sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); -return SCTP_DISPOSITION_CONSUME ; - } +SCTP_INC_STATS (net,SCTP_MIB_OUTCTRLCHUNKS ); -return SCTP_DISPOSITION_NOMEM ; +sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); +return SCTP_DISPOSITION_CONSUME ; }/*
Signature · 1 line
2.9.3
Marcelo Ricardo Leitner
maintainerPATCH RESEND 2/5 sctp: reduce indent level in sctp_sf_shut_8_4_5
In reply to Marcelo Ricardo Leitner--- net/sctp/sm_statefuns.c | 58 ++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 30 deletions(-)
net/sctp/sm_statefuns.c +28 -30
@@ -3501,45 +3501,43 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(struct net *net,struct sctp_chunk *shut; packet =sctp_ootb_pkt_new (net, asoc, chunk); +if (!packet) +return SCTP_DISPOSITION_NOMEM ; -if (packet) { -/* Make an SHUTDOWN_COMPLETE. -* The T bit will be set if the asoc is NULL. -*/ - shut =sctp_make_shutdown_complete (asoc, chunk); -if (!shut) { -sctp_ootb_pkt_free (packet); -return SCTP_DISPOSITION_NOMEM ; - } - -/* Reflect vtag if T-Bit is set */ -if (sctp_test_T_bit (shut)) - packet->vtag =ntohl (chunk->sctp_hdr->vtag); +/* Make an SHUTDOWN_COMPLETE. +* The T bit will be set if the asoc is NULL. +*/ + shut =sctp_make_shutdown_complete (asoc, chunk); +if (!shut) { +sctp_ootb_pkt_free (packet); +return SCTP_DISPOSITION_NOMEM ; + } -/* Set the skb to the belonging sock for accounting. */ - shut->skb->sk = ep->base.sk; +/* Reflect vtag if T-Bit is set */ +if (sctp_test_T_bit (shut)) + packet->vtag =ntohl (chunk->sctp_hdr->vtag); -sctp_packet_append_chunk (packet, shut); +/* Set the skb to the belonging sock for accounting. */ + shut->skb->sk = ep->base.sk; -sctp_add_cmd_sf (commands,SCTP_CMD_SEND_PKT , -SCTP_PACKET (packet)); +sctp_packet_append_chunk (packet, shut); -SCTP_INC_STATS (net,SCTP_MIB_OUTCTRLCHUNKS ); +sctp_add_cmd_sf (commands,SCTP_CMD_SEND_PKT , +SCTP_PACKET (packet)); -/* If the chunk length is invalid, we don't want to process -* the reset of the packet. -*/ -if (!sctp_chunk_length_valid (chunk,sizeof (sctp_chunkhdr_t))) -return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); +SCTP_INC_STATS (net,SCTP_MIB_OUTCTRLCHUNKS ); -/* We need to discard the rest of the packet to prevent -* potential bomming attacks from additional bundled chunks. -* This is documented in SCTP Threats ID. -*/ +/* If the chunk length is invalid, we don't want to process +* the reset of the packet. +*/ +if (!sctp_chunk_length_valid (chunk,sizeof (sctp_chunkhdr_t)))return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); - } -return SCTP_DISPOSITION_NOMEM ; +/* We need to discard the rest of the packet to prevent +* potential bomming attacks from additional bundled chunks. +* This is documented in SCTP Threats ID. +*/ +return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); }/*
Signature · 1 line
2.9.3
Marcelo Ricardo Leitner
maintainerPATCH RESEND 3/5 sctp: simplify addr copy
In reply to Marcelo Ricardo LeitnerMake it a bit easier to read.
--- net/sctp/ipv6.c | 16 +++++++--------- net/sctp/protocol.c | 18 +++++++----------- 2 files changed, 14 insertions(+), 20 deletions(-)
net/sctp/ipv6.c +7 -9
@@ -412,22 +412,20 @@ static void sctp_v6_copy_addrlist(struct list_head *addrlist,static void sctp_v6_from_skb (union sctp_addr *addr,struct sk_buff *skb,int is_saddr) { -__be16 *port; -struct sctphdr *sh; +/* Always called on head skb, so this is safe */ +struct sctphdr *sh =sctp_hdr (skb); +struct sockaddr_in6 *sa = &addr->v6; - port = &addr->v6.sin6_port; addr->v6.sin6_family =AF_INET6 ; addr->v6.sin6_flowinfo =0 ;/* FIXME */ addr->v6.sin6_scope_id = ((struct inet6_skb_parm *)skb->cb)->iif; -/* Always called on head skb, so this is safe */ - sh =sctp_hdr (skb);if (is_saddr) { - *port = sh->source; - addr->v6.sin6_addr =ipv6_hdr (skb)->saddr; + sa->sin6_port = sh->source; + sa->sin6_addr =ipv6_hdr (skb)->saddr; }else { - *port = sh->dest; - addr->v6.sin6_addr =ipv6_hdr (skb)->daddr; + sa->sin6_port = sh->dest; + sa->sin6_addr =ipv6_hdr (skb)->daddr; } }
net/sctp/protocol.c +7 -11
@@ -237,23 +237,19 @@ int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *bp,static void sctp_v4_from_skb (union sctp_addr *addr,struct sk_buff *skb,int is_saddr) { -void *from; -__be16 *port; -struct sctphdr *sh; +/* Always called on head skb, so this is safe */ +struct sctphdr *sh =sctp_hdr (skb); +struct sockaddr_in *sa = &addr->v4; - port = &addr->v4.sin_port; addr->v4.sin_family =AF_INET ; -/* Always called on head skb, so this is safe */ - sh =sctp_hdr (skb);if (is_saddr) { - *port = sh->source; - from = &ip_hdr (skb)->saddr; + sa->sin_port = sh->source; + sa->sin_addr.s_addr =ip_hdr (skb)->saddr; }else { - *port = sh->dest; - from = &ip_hdr (skb)->daddr; + sa->sin_port = sh->dest; + sa->sin_addr.s_addr =ip_hdr (skb)->daddr; } -memcpy (&addr->v4.sin_addr.s_addr, from,sizeof (struct in_addr )); }/* Initialize an sctp_addr from a socket. */
Signature · 1 line
2.9.3
Marcelo Ricardo Leitner
maintainerPATCH RESEND 4/5 sctp: remove return value from sctp_packet_init/config
In reply to Marcelo Ricardo LeitnerThere is no reason to use this cascading. It doesn't add anything. Let's remove it and simplify.
--- include/net/sctp/structs.h | 7 +++---- net/sctp/output.c | 14 +++++--------- net/sctp/sm_statefuns.c | 5 +++-- 3 files changed, 11 insertions(+), 15 deletions(-)
include/net/sctp/structs.h +3 -4
@@ -722,10 +722,9 @@ struct sctp_packet { ipfragok:1 ;/* So let ip fragment this packet */ }; -struct sctp_packet *sctp_packet_init (struct sctp_packet *, -struct sctp_transport *, -__u16 sport,__u16 dport); -struct sctp_packet *sctp_packet_config (struct sctp_packet *,__u32 vtag,int ); +void sctp_packet_init (struct sctp_packet *,struct sctp_transport *, +__u16 sport,__u16 dport); +void sctp_packet_config (struct sctp_packet *,__u32 vtag,int );sctp_xmit_t sctp_packet_transmit_chunk (struct sctp_packet *,struct sctp_chunk *,int ,gfp_t ); sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *,
net/sctp/output.c +5 -9
@@ -81,8 +81,8 @@ static void sctp_packet_reset(struct sctp_packet *packet)/* Config a packet. * This appears to be a followup set of initializations. */ -struct sctp_packet *sctp_packet_config (struct sctp_packet *packet, -__u32 vtag,int ecn_capable) +void sctp_packet_config (struct sctp_packet *packet,__u32 vtag, +int ecn_capable) {struct sctp_transport *tp = packet->transport;struct sctp_association *asoc = tp->asoc;
@@ -123,14 +123,12 @@ struct sctp_packet *sctp_packet_config(struct sctp_packet *packet,if (chunk)sctp_packet_append_chunk (packet, chunk); } - -return packet; }/* Initialize the packet structure. */ -struct sctp_packet *sctp_packet_init (struct sctp_packet *packet, -struct sctp_transport *transport, -__u16 sport,__u16 dport) +void sctp_packet_init (struct sctp_packet *packet, +struct sctp_transport *transport, +__u16 sport,__u16 dport) {struct sctp_association *asoc = transport->asoc;size_t overhead;
@@ -151,8 +149,6 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *packet, packet->overhead = overhead;sctp_packet_reset (packet); packet->vtag =0 ; - -return packet; }/* Free a packet. */
net/sctp/sm_statefuns.c +3 -2
@@ -6032,8 +6032,9 @@ static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,sctp_transport_route (transport, (union sctp_addr *)&chunk->dest,sctp_sk (net->sctp.ctl_sock)); - packet =sctp_packet_init (&transport->packet, transport, sport, dport); - packet =sctp_packet_config (packet, vtag,0 ); + packet = &transport->packet; +sctp_packet_init (packet, transport, sport, dport); +sctp_packet_config (packet, vtag,0 );return packet;
Signature · 1 line
2.9.3
Marcelo Ricardo Leitner
maintainerPATCH RESEND 5/5 sctp: sctp_chunk_length_valid should return bool
In reply to Marcelo Ricardo Leitner--- net/sctp/sm_statefuns.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
net/sctp/sm_statefuns.c +7 -8
@@ -160,23 +160,22 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(struct net *net,/* Small helper function that checks if the chunk length * is of the appropriate length. The 'required_length' argument * is set to be the size of a specific chunk we are testing. -* Return Values: 1 = Valid length -* 0 = Invalid length +* Return Values: true = Valid length +* false = Invalid length * */ -static inline int -sctp_chunk_length_valid (struct sctp_chunk *chunk, -__u16 required_length) +static inline bool +sctp_chunk_length_valid (struct sctp_chunk *chunk,__u16 required_length) {__u16 chunk_length =ntohs (chunk->chunk_hdr->length);/* Previously already marked? */ if (unlikely (chunk->pdiscard)) -return 0 ; +return false;if (unlikely (chunk_length < required_length)) -return 0 ; +return false; -return 1 ; +return true; }/**********************************************************
Signature · 1 line
2.9.3
David Miller
maintainerFrom: Marcelo Ricardo Leitner <[email protected]>
Date: Wed, 28 Dec 2016 09:26:30 -0200
Quoted 2 lines
Some cleanups/simplifications I've been collecting. Resending now with net-next open.
Series applied, thanks.