90017accff
SCTP has this pecualiarity that its packets cannot be just segmented to
(P)MTU. Its chunks must be contained in IP segments, padding respected.
So we can't just generate a big skb, set gso_size to the fragmentation
point and deliver it to IP layer.
This patch takes a different approach. SCTP will now build a skb as it
would be if it was received using GRO. That is, there will be a cover
skb with protocol headers and children ones containing the actual
segments, already segmented to a way that respects SCTP RFCs.
With that, we can tell skb_segment() to just split based on frag_list,
trusting its sizes are already in accordance.
This way SCTP can benefit from GSO and instead of passing several
packets through the stack, it can pass a single large packet.
v2:
- Added support for receiving GSO frames, as requested by Dave Miller.
- Clear skb->cb if packet is GSO (otherwise it's not used by SCTP)
- Added heuristics similar to what we have in TCP for not generating
single GSO packets that fills cwnd.
v3:
- consider sctphdr size in skb_gso_transport_seglen()
- rebased due to 5c7cdf339a
("gso: Remove arbitrary checks for
unsupported GSO")
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Tested-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
24 lines
636 B
Makefile
24 lines
636 B
Makefile
#
|
|
# Makefile for SCTP support code.
|
|
#
|
|
|
|
obj-$(CONFIG_IP_SCTP) += sctp.o
|
|
obj-$(CONFIG_NET_SCTPPROBE) += sctp_probe.o
|
|
obj-$(CONFIG_INET_SCTP_DIAG) += sctp_diag.o
|
|
|
|
sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
|
|
protocol.o endpointola.o associola.o \
|
|
transport.o chunk.o sm_make_chunk.o ulpevent.o \
|
|
inqueue.o outqueue.o ulpqueue.o \
|
|
tsnmap.o bind_addr.o socket.o primitive.o \
|
|
output.o input.o debug.o ssnmap.o auth.o \
|
|
offload.o
|
|
|
|
sctp_probe-y := probe.o
|
|
|
|
sctp-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o
|
|
sctp-$(CONFIG_PROC_FS) += proc.o
|
|
sctp-$(CONFIG_SYSCTL) += sysctl.o
|
|
|
|
sctp-$(subst m,y,$(CONFIG_IPV6)) += ipv6.o
|