mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
package network
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/safing/portmaster/intel"
|
|
"github.com/safing/portmaster/network/netutils"
|
|
"github.com/safing/portmaster/network/packet"
|
|
"github.com/safing/portmaster/process"
|
|
)
|
|
|
|
// GetOwnComm returns the communication for the given packet, that originates from the Portmaster itself.
|
|
func GetOwnComm(pkt packet.Packet) (*Communication, error) {
|
|
var scope string
|
|
|
|
// Incoming
|
|
if pkt.IsInbound() {
|
|
switch netutils.ClassifyIP(pkt.Info().RemoteIP()) {
|
|
case netutils.HostLocal:
|
|
scope = IncomingHost
|
|
case netutils.LinkLocal, netutils.SiteLocal, netutils.LocalMulticast:
|
|
scope = IncomingLAN
|
|
case netutils.Global, netutils.GlobalMulticast:
|
|
scope = IncomingInternet
|
|
case netutils.Invalid:
|
|
scope = IncomingInvalid
|
|
}
|
|
|
|
communication, ok := GetCommunication(os.Getpid(), scope)
|
|
if !ok {
|
|
proc, err := process.GetOrFindProcess(pkt.Ctx(), os.Getpid())
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not get own process")
|
|
}
|
|
communication = &Communication{
|
|
Scope: scope,
|
|
Entity: (&intel.Entity{}).Init(),
|
|
Direction: Inbound,
|
|
process: proc,
|
|
Inspect: true,
|
|
FirstLinkEstablished: time.Now().Unix(),
|
|
}
|
|
}
|
|
communication.process.AddCommunication()
|
|
return communication, nil
|
|
}
|
|
|
|
// PeerToPeer
|
|
switch netutils.ClassifyIP(pkt.Info().RemoteIP()) {
|
|
case netutils.HostLocal:
|
|
scope = PeerHost
|
|
case netutils.LinkLocal, netutils.SiteLocal, netutils.LocalMulticast:
|
|
scope = PeerLAN
|
|
case netutils.Global, netutils.GlobalMulticast:
|
|
scope = PeerInternet
|
|
case netutils.Invalid:
|
|
scope = PeerInvalid
|
|
}
|
|
|
|
communication, ok := GetCommunication(os.Getpid(), scope)
|
|
if !ok {
|
|
proc, err := process.GetOrFindProcess(pkt.Ctx(), os.Getpid())
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not get own process")
|
|
}
|
|
communication = &Communication{
|
|
Scope: scope,
|
|
Entity: (&intel.Entity{}).Init(),
|
|
Direction: Outbound,
|
|
process: proc,
|
|
Inspect: true,
|
|
FirstLinkEstablished: time.Now().Unix(),
|
|
}
|
|
}
|
|
communication.process.AddCommunication()
|
|
return communication, nil
|
|
}
|