mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-04 20:57:36 +03:00
use the new zero-allocation control message parsing function from x/sys (#3609)
This commit is contained in:
parent
76761598e9
commit
df762b7552
4 changed files with 27 additions and 23 deletions
2
go.mod
2
go.mod
|
@ -14,7 +14,7 @@ require (
|
||||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
|
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f
|
golang.org/x/sys v0.1.1-0.20221102194838-fc697a31fa06
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -180,8 +180,8 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
|
golang.org/x/sys v0.1.1-0.20221102194838-fc697a31fa06 h1:E1pm64FqQa4v8dHd/bAneyMkR4hk8LTJhoSlc5mc1cM=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.1-0.20221102194838-fc697a31fa06/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
|
|
@ -230,8 +230,9 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
|
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.1.1-0.20221102194838-fc697a31fa06 h1:E1pm64FqQa4v8dHd/bAneyMkR4hk8LTJhoSlc5mc1cM=
|
||||||
|
golang.org/x/sys v0.1.1-0.20221102194838-fc697a31fa06/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
|
|
@ -161,18 +161,20 @@ func (c *oobConn) ReadPacket() (*receivedPacket, error) {
|
||||||
msg := c.messages[c.readPos]
|
msg := c.messages[c.readPos]
|
||||||
buffer := c.buffers[c.readPos]
|
buffer := c.buffers[c.readPos]
|
||||||
c.readPos++
|
c.readPos++
|
||||||
ctrlMsgs, err := unix.ParseSocketControlMessage(msg.OOB[:msg.NN])
|
|
||||||
if err != nil {
|
data := msg.OOB[:msg.NN]
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var ecn protocol.ECN
|
var ecn protocol.ECN
|
||||||
var destIP net.IP
|
var destIP net.IP
|
||||||
var ifIndex uint32
|
var ifIndex uint32
|
||||||
for _, ctrlMsg := range ctrlMsgs {
|
for len(data) > 0 {
|
||||||
if ctrlMsg.Header.Level == unix.IPPROTO_IP {
|
hdr, body, remainder, err := unix.ParseOneSocketControlMessage(data)
|
||||||
switch ctrlMsg.Header.Type {
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if hdr.Level == unix.IPPROTO_IP {
|
||||||
|
switch hdr.Type {
|
||||||
case msgTypeIPTOS:
|
case msgTypeIPTOS:
|
||||||
ecn = protocol.ECN(ctrlMsg.Data[0] & ecnMask)
|
ecn = protocol.ECN(body[0] & ecnMask)
|
||||||
case msgTypeIPv4PKTINFO:
|
case msgTypeIPv4PKTINFO:
|
||||||
// struct in_pktinfo {
|
// struct in_pktinfo {
|
||||||
// unsigned int ipi_ifindex; /* Interface index */
|
// unsigned int ipi_ifindex; /* Interface index */
|
||||||
|
@ -181,33 +183,34 @@ func (c *oobConn) ReadPacket() (*receivedPacket, error) {
|
||||||
// address */
|
// address */
|
||||||
// };
|
// };
|
||||||
ip := make([]byte, 4)
|
ip := make([]byte, 4)
|
||||||
if len(ctrlMsg.Data) == 12 {
|
if len(body) == 12 {
|
||||||
ifIndex = binary.LittleEndian.Uint32(ctrlMsg.Data)
|
ifIndex = binary.LittleEndian.Uint32(body)
|
||||||
copy(ip, ctrlMsg.Data[8:12])
|
copy(ip, body[8:12])
|
||||||
} else if len(ctrlMsg.Data) == 4 {
|
} else if len(body) == 4 {
|
||||||
// FreeBSD
|
// FreeBSD
|
||||||
copy(ip, ctrlMsg.Data)
|
copy(ip, body)
|
||||||
}
|
}
|
||||||
destIP = net.IP(ip)
|
destIP = net.IP(ip)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ctrlMsg.Header.Level == unix.IPPROTO_IPV6 {
|
if hdr.Level == unix.IPPROTO_IPV6 {
|
||||||
switch ctrlMsg.Header.Type {
|
switch hdr.Type {
|
||||||
case unix.IPV6_TCLASS:
|
case unix.IPV6_TCLASS:
|
||||||
ecn = protocol.ECN(ctrlMsg.Data[0] & ecnMask)
|
ecn = protocol.ECN(body[0] & ecnMask)
|
||||||
case msgTypeIPv6PKTINFO:
|
case msgTypeIPv6PKTINFO:
|
||||||
// struct in6_pktinfo {
|
// struct in6_pktinfo {
|
||||||
// struct in6_addr ipi6_addr; /* src/dst IPv6 address */
|
// struct in6_addr ipi6_addr; /* src/dst IPv6 address */
|
||||||
// unsigned int ipi6_ifindex; /* send/recv interface index */
|
// unsigned int ipi6_ifindex; /* send/recv interface index */
|
||||||
// };
|
// };
|
||||||
if len(ctrlMsg.Data) == 20 {
|
if len(body) == 20 {
|
||||||
ip := make([]byte, 16)
|
ip := make([]byte, 16)
|
||||||
copy(ip, ctrlMsg.Data[:16])
|
copy(ip, body[:16])
|
||||||
destIP = net.IP(ip)
|
destIP = net.IP(ip)
|
||||||
ifIndex = binary.LittleEndian.Uint32(ctrlMsg.Data[16:])
|
ifIndex = binary.LittleEndian.Uint32(body[16:])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
data = remainder
|
||||||
}
|
}
|
||||||
var info *packetInfo
|
var info *packetInfo
|
||||||
if destIP != nil {
|
if destIP != nil {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue