mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
netfilter: Support multiport matching (-m multiport)
This set of changes adds:
- support for `xt_multiport_{,v1}` matchers for matching for
a range of ports and their inverse, i.e.,:
```
-m multiport [!] --[s|d]ports (PORT,...|PORT:PORT,...)
```
- support for `IP{,6}T_SO_GET_REVISION_MATCH` socket options,
which allows `iptables` to query for the highest supported
revision for a given matcher
This commit is contained in:
@@ -1549,6 +1549,29 @@ func getSockOptIPv6(t *kernel.Task, s socket.Socket, ep commonEndpoint, name int
|
||||
}
|
||||
return &entries, nil
|
||||
|
||||
case linux.IP6T_SO_GET_REVISION_MATCH:
|
||||
if outLen < linux.SizeOfXTGetRevision {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
// Only valid for raw IPv6 sockets.
|
||||
if skType != linux.SOCK_RAW {
|
||||
return nil, syserr.ErrProtocolNotAvailable
|
||||
}
|
||||
|
||||
stk := inet.StackFromContext(t)
|
||||
if stk == nil {
|
||||
return nil, syserr.ErrNoDevice
|
||||
}
|
||||
|
||||
// Get the highest support matcher revision.
|
||||
ret, err := netfilter.MatchRevision(t, outPtr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ret, nil
|
||||
|
||||
case linux.IP6T_SO_GET_REVISION_TARGET:
|
||||
if outLen < linux.SizeOfXTGetRevision {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
@@ -1754,6 +1777,30 @@ func getSockOptIP(t *kernel.Task, s socket.Socket, ep commonEndpoint, name int,
|
||||
}
|
||||
return &entries, nil
|
||||
|
||||
case linux.IPT_SO_GET_REVISION_MATCH:
|
||||
if outLen < linux.SizeOfXTGetRevision {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
// Only valid for raw IPv4 sockets.
|
||||
family, skType, _ := s.Type()
|
||||
if family != linux.AF_INET || skType != linux.SOCK_RAW {
|
||||
return nil, syserr.ErrProtocolNotAvailable
|
||||
}
|
||||
|
||||
stk := inet.StackFromContext(t)
|
||||
if stk == nil {
|
||||
return nil, syserr.ErrNoDevice
|
||||
}
|
||||
|
||||
// Get the highest support matcher revision.
|
||||
ret, err := netfilter.MatchRevision(t, outPtr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ret, nil
|
||||
|
||||
case linux.IPT_SO_GET_REVISION_TARGET:
|
||||
if outLen < linux.SizeOfXTGetRevision {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
|
||||
Reference in New Issue
Block a user