mirror of
https://github.com/safing/portmaster
synced 2025-09-02 10:39:22 +00:00
Add InfoPacket and BandwidthUpdate structs for cross platform usage
This commit is contained in:
parent
688b2de26e
commit
dc033c3933
2 changed files with 112 additions and 0 deletions
35
network/packet/bandwidth.go
Normal file
35
network/packet/bandwidth.go
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
package packet
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// BandwidthUpdate holds an update to the seen bandwidth of a connection.
|
||||||
|
type BandwidthUpdate struct {
|
||||||
|
ConnID string
|
||||||
|
RecvBytes uint64
|
||||||
|
SentBytes uint64
|
||||||
|
Method BandwidthUpdateMethod
|
||||||
|
}
|
||||||
|
|
||||||
|
// BandwidthUpdateMethod defines how the bandwidth data of a bandwidth update should be interpreted.
|
||||||
|
type BandwidthUpdateMethod uint8
|
||||||
|
|
||||||
|
// Bandwidth Update Methods.
|
||||||
|
const (
|
||||||
|
Absolute BandwidthUpdateMethod = iota
|
||||||
|
Additive
|
||||||
|
)
|
||||||
|
|
||||||
|
func (bu *BandwidthUpdate) String() string {
|
||||||
|
return fmt.Sprintf("%s: %dB recv | %dB sent [%s]", bu.ConnID, bu.RecvBytes, bu.SentBytes, bu.Method)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bum BandwidthUpdateMethod) String() string {
|
||||||
|
switch bum {
|
||||||
|
case Absolute:
|
||||||
|
return "absolute"
|
||||||
|
case Additive:
|
||||||
|
return "additive"
|
||||||
|
default:
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
}
|
77
network/packet/info_only.go
Normal file
77
network/packet/info_only.go
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
package packet
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// InfoPacket does not represent an actual packet, but only holds metadata.
|
||||||
|
// Implements the packet.Packet interface.
|
||||||
|
type InfoPacket struct {
|
||||||
|
Base
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInfoPacket returns a new InfoPacket with the given info.
|
||||||
|
func NewInfoPacket(info Info) *InfoPacket {
|
||||||
|
return &InfoPacket{
|
||||||
|
Base{
|
||||||
|
info: info,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InfoOnly returns whether the packet is informational only and does not
|
||||||
|
// represent an actual packet.
|
||||||
|
func (pkt *InfoPacket) InfoOnly() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadPacketData does nothing on Linux, as data is always fully parsed.
|
||||||
|
func (pkt *InfoPacket) LoadPacketData() error {
|
||||||
|
return fmt.Errorf("%w: info-only packet", ErrFailedToLoadPayload)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrInfoOnlyPacket is returned for unsupported operations on an info-only packet.
|
||||||
|
var ErrInfoOnlyPacket = errors.New("info-only packet")
|
||||||
|
|
||||||
|
// Accept does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) Accept() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// Block does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) Block() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// Drop does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) Drop() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// PermanentAccept does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) PermanentAccept() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// PermanentBlock does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) PermanentBlock() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// PermanentDrop does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) PermanentDrop() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// RerouteToNameserver does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) RerouteToNameserver() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
// RerouteToTunnel does nothing on an info-only packet.
|
||||||
|
func (pkt *InfoPacket) RerouteToTunnel() error {
|
||||||
|
return ErrInfoOnlyPacket
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Packet = &InfoPacket{}
|
Loading…
Add table
Reference in a new issue