test af_packet mode on bridges
This commit is contained in:
@@ -6,6 +6,8 @@ from fastapi import APIRouter, Body, HTTPException, Query
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from src.network_sniffer import (
|
||||
BRIDGE_CAPTURE_MODE_AF_PACKET,
|
||||
BRIDGE_CAPTURE_MODE_TC_EBPF,
|
||||
get_internal_debug_state,
|
||||
get_capture_session_status,
|
||||
start_capture_session,
|
||||
@@ -28,6 +30,11 @@ class SnifferStartRequest(BaseModel):
|
||||
example="eth0",
|
||||
description="Interface name to sniff.",
|
||||
)
|
||||
bridge_capture_mode: Optional[str] = Field(
|
||||
None,
|
||||
example="tc_ebpf",
|
||||
description="Bridge capture mode: 'tc_ebpf' or 'af_packet'. Ignored for interface capture.",
|
||||
)
|
||||
|
||||
|
||||
class SnifferStartResponse(BaseModel):
|
||||
@@ -37,6 +44,7 @@ class SnifferStartResponse(BaseModel):
|
||||
session_id: str = Field(..., description="Unique session identifier.")
|
||||
target: str = Field(..., description="Started target name.")
|
||||
target_type: str = Field(..., description="Either 'bridge' or 'interface'.")
|
||||
capture_mode: str = Field(..., description="The effective capture mode used by the session.")
|
||||
|
||||
|
||||
class SnifferStopRequest(BaseModel):
|
||||
@@ -62,6 +70,7 @@ class InterfaceSnifferStatus(BaseModel):
|
||||
up: bool = Field(..., description="Whether the interface is operationally up.")
|
||||
session_id: Optional[str] = Field(None, description="Owning capture session ID.")
|
||||
session_label: Optional[str] = Field(None, description="Human-readable session label.")
|
||||
capture_mode: Optional[str] = Field(None, description="Capture mode used by the owning session.")
|
||||
|
||||
|
||||
class SnifferStatusResponse(BaseModel):
|
||||
@@ -87,14 +96,23 @@ def sniffer_start(req: SnifferStartRequest) -> SnifferStartResponse:
|
||||
session_id=session_id,
|
||||
target=req.interface,
|
||||
target_type="interface",
|
||||
capture_mode="af_packet",
|
||||
)
|
||||
|
||||
session_id = start_capture_session(req.bridge, target_is_interface=False)
|
||||
effective_capture_mode = req.bridge_capture_mode or BRIDGE_CAPTURE_MODE_TC_EBPF
|
||||
if effective_capture_mode not in {BRIDGE_CAPTURE_MODE_TC_EBPF, BRIDGE_CAPTURE_MODE_AF_PACKET}:
|
||||
raise HTTPException(status_code=400, detail="bridge_capture_mode must be 'tc_ebpf' or 'af_packet'")
|
||||
session_id = start_capture_session(
|
||||
req.bridge,
|
||||
target_is_interface=False,
|
||||
bridge_capture_mode=effective_capture_mode,
|
||||
)
|
||||
return SnifferStartResponse(
|
||||
started=True,
|
||||
session_id=session_id,
|
||||
target=req.bridge,
|
||||
target_type="bridge",
|
||||
capture_mode=effective_capture_mode,
|
||||
)
|
||||
except Exception as exc:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to start sniffer: {exc}") from exc
|
||||
|
||||
Reference in New Issue
Block a user