Add packet payload for kext2

This commit is contained in:
Vladimir Stoilov
2024-04-17 11:15:29 +03:00
parent ead271f51c
commit c425007be1
5 changed files with 157 additions and 129 deletions

View File

@@ -45,8 +45,10 @@ func Handler(ctx context.Context, packets chan packet.Packet, bandwidthUpdate ch
// New Packet
new := &Packet{
verdictRequest: conn.Id,
payload: conn.Payload,
verdictSet: abool.NewBool(false),
}
new.Base.Payload()
info := new.Info()
info.Inbound = conn.Direction > 0
info.InTunnel = false
@@ -95,6 +97,7 @@ func Handler(ctx context.Context, packets chan packet.Packet, bandwidthUpdate ch
// New Packet
new := &Packet{
verdictRequest: conn.Id,
payload: conn.Payload,
verdictSet: abool.NewBool(false),
}
info := new.Info()

View File

@@ -102,13 +102,17 @@ func SendPrintMemoryStatsCommand() error {
return kext_interface.SendPrintMemoryStatsCommand(kextFile)
}
func SendCleanEndedConnection() error {
return kext_interface.SendCleanEndedConnectionsCommand(kextFile)
}
// RecvVerdictRequest waits for the next verdict request from the kext. If a timeout is reached, both *VerdictRequest and error will be nil.
func RecvVerdictRequest() (*kext_interface.Info, error) {
return kext_interface.RecvInfo(kextFile)
}
// SetVerdict sets the verdict for a packet and/or connection.
func SetVerdict(pkt *Packet, verdict network.Verdict) error {
func SetVerdict(pkt *Packet, verdict kext_interface.KextVerdict) error {
verdictCommand := kext_interface.Verdict{Id: pkt.verdictRequest, Verdict: uint8(verdict)}
return kext_interface.SendVerdictCommand(kextFile, verdictCommand)
}

View File

@@ -4,12 +4,12 @@
package windowskext
import (
"fmt"
"sync"
"github.com/tevino/abool"
"github.com/vlabo/portmaster_windows_rust_kext/kext_interface"
"github.com/safing/portmaster/network"
"github.com/safing/portbase/log"
"github.com/safing/portmaster/network/packet"
)
@@ -18,6 +18,7 @@ type Packet struct {
packet.Base
verdictRequest uint64
payload []byte
verdictSet *abool.AtomicBool
payloadLoaded bool
@@ -33,7 +34,7 @@ func (pkt *Packet) FastTrackedByIntegration() bool {
// InfoOnly returns whether the packet is informational only and does not
// represent an actual packet.
func (pkt *Packet) InfoOnly() bool {
return pkt.verdictRequest == 0
return false
}
// ExpectInfo returns whether the next packet is expected to be informational only.
@@ -43,13 +44,33 @@ func (pkt *Packet) ExpectInfo() bool {
// GetPayload returns the full raw packet.
func (pkt *Packet) LoadPacketData() error {
return fmt.Errorf("Not implemented")
pkt.lock.Lock()
defer pkt.lock.Unlock()
if !pkt.payloadLoaded {
pkt.payloadLoaded = true
if len(pkt.payload) > 0 {
err := packet.Parse(pkt.payload, &pkt.Base)
if err != nil {
log.Tracef("payload: %#v", pkt.payload)
log.Tracer(pkt.Ctx()).Warningf("windowskext: failed to parse payload: %s", err)
return packet.ErrFailedToLoadPayload
}
}
}
if len(pkt.Raw()) == 0 {
return packet.ErrFailedToLoadPayload
}
return nil
}
// Accept accepts the packet.
func (pkt *Packet) Accept() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, -network.VerdictAccept)
return SetVerdict(pkt, kext_interface.VerdictAccept)
}
return nil
}
@@ -57,7 +78,7 @@ func (pkt *Packet) Accept() error {
// Block blocks the packet.
func (pkt *Packet) Block() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, -network.VerdictBlock)
return SetVerdict(pkt, kext_interface.VerdictBlock)
}
return nil
}
@@ -65,7 +86,7 @@ func (pkt *Packet) Block() error {
// Drop drops the packet.
func (pkt *Packet) Drop() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, -network.VerdictDrop)
return SetVerdict(pkt, kext_interface.VerdictDrop)
}
return nil
}
@@ -73,7 +94,7 @@ func (pkt *Packet) Drop() error {
// PermanentAccept permanently accepts connection (and the current packet).
func (pkt *Packet) PermanentAccept() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, network.VerdictAccept)
return SetVerdict(pkt, kext_interface.VerdictAccept)
}
return nil
}
@@ -81,7 +102,7 @@ func (pkt *Packet) PermanentAccept() error {
// PermanentBlock permanently blocks connection (and the current packet).
func (pkt *Packet) PermanentBlock() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, network.VerdictBlock)
return SetVerdict(pkt, kext_interface.VerdictBlock)
}
return nil
}
@@ -89,7 +110,7 @@ func (pkt *Packet) PermanentBlock() error {
// PermanentDrop permanently drops connection (and the current packet).
func (pkt *Packet) PermanentDrop() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, network.VerdictDrop)
return SetVerdict(pkt, kext_interface.VerdictDrop)
}
return nil
}
@@ -97,7 +118,7 @@ func (pkt *Packet) PermanentDrop() error {
// RerouteToNameserver permanently reroutes the connection to the local nameserver (and the current packet).
func (pkt *Packet) RerouteToNameserver() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, network.VerdictRerouteToNameserver)
return SetVerdict(pkt, kext_interface.VerdictRerouteToNameserver)
}
return nil
}
@@ -105,7 +126,7 @@ func (pkt *Packet) RerouteToNameserver() error {
// RerouteToTunnel permanently reroutes the connection to the local tunnel entrypoint (and the current packet).
func (pkt *Packet) RerouteToTunnel() error {
if pkt.verdictSet.SetToIf(false, true) {
return SetVerdict(pkt, network.VerdictRerouteToTunnel)
return SetVerdict(pkt, kext_interface.VerdictRerouteToTunnel)
}
return nil
}