1 /*
2 * Copyright 2022 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package io.netty5.channel.unix;
17
18 import io.netty5.buffer.api.Buffer;
19 import io.netty5.channel.socket.DatagramPacket;
20 import io.netty5.util.internal.ObjectUtil;
21
22 import java.net.InetSocketAddress;
23 import java.net.SocketAddress;
24
25 /**
26 * Allows to use <a href="https://blog.cloudflare.com/accelerating-udp-packet-transmission-for-quic/">GSO</a>
27 * if the underlying OS supports it. Before using this you should ensure your system support it.
28 */
29 public class SegmentedDatagramPacket extends DatagramPacket {
30
31 private final int segmentSize;
32
33 /**
34 * Create a new segmented datagram packet.
35 * The attached message may be sent in multiple segment-sized network packets.
36 *
37 * @param message The data to send.
38 * @param segmentSize The (positive) segment size.
39 * @param recipient The recipient address.
40 * @param sender The sender address.
41 */
42 public SegmentedDatagramPacket(Buffer message, int segmentSize, SocketAddress recipient,
43 SocketAddress sender) {
44 super(message, recipient, sender);
45 this.segmentSize = ObjectUtil.checkPositive(segmentSize, "segmentSize");
46 }
47
48 /**
49 * Create a new segmented datagram packet.
50 * The attached message may be sent in multiple segment-sized network packets.
51 *
52 * @param message The data to send.
53 * @param segmentSize The (positive) segment size.
54 * @param recipient The recipient address.
55 */
56 public SegmentedDatagramPacket(Buffer message, int segmentSize, InetSocketAddress recipient) {
57 super(message, recipient);
58 this.segmentSize = ObjectUtil.checkPositive(segmentSize, "segmentSize");
59 }
60
61 /**
62 * Return the size of each segment (the last segment can be smaller).
63 *
64 * @return size of segments.
65 */
66 public int segmentSize() {
67 return segmentSize;
68 }
69
70 @Override
71 public SegmentedDatagramPacket replace(Buffer content) {
72 return new SegmentedDatagramPacket(content, segmentSize, recipient(), sender());
73 }
74
75 @Override
76 public SegmentedDatagramPacket touch(Object hint) {
77 super.touch(hint);
78 return this;
79 }
80 }