All checks were successful
Build and Deploy MITM Webserver / build (push) Successful in 10s
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
"""Helpers for the shared skb mark layout used for packet correlation and verdict hints."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Optional
|
|
|
|
|
|
PACKET_ID_MASK = 0x0FFFFFFF
|
|
VERDICT_MASK = 0xF0000000
|
|
VERDICT_FLAG_DROP = 0x10000000
|
|
VERDICT_FLAG_REJECT = 0x20000000
|
|
|
|
|
|
def normalize_skb_mark(value: object) -> Optional[int]:
|
|
"""Return a positive integer skb mark or `None` when the value is empty."""
|
|
if value in (None, "", 0, "0"):
|
|
return None
|
|
try:
|
|
mark = int(value)
|
|
except (TypeError, ValueError):
|
|
return None
|
|
if mark < 0:
|
|
mark &= 0xFFFFFFFF
|
|
return mark or None
|
|
|
|
|
|
def packet_id_from_mark(value: object) -> Optional[str]:
|
|
"""Extract the packet correlation identifier from the shared skb mark layout."""
|
|
mark = normalize_skb_mark(value)
|
|
if mark is None:
|
|
return None
|
|
packet_id = mark & PACKET_ID_MASK
|
|
return str(packet_id) if packet_id else None
|
|
|
|
|
|
def verdict_from_mark(value: object) -> Optional[str]:
|
|
"""Return a verdict hint encoded into the upper mark bits, if any."""
|
|
mark = normalize_skb_mark(value)
|
|
if mark is None:
|
|
return None
|
|
verdict_bits = mark & VERDICT_MASK
|
|
if verdict_bits & VERDICT_FLAG_REJECT:
|
|
return "reject"
|
|
if verdict_bits & VERDICT_FLAG_DROP:
|
|
return "drop"
|
|
return None
|