Changeset View
Changeset View
Standalone View
Standalone View
sys/netpfil/pf/pf_if.c
Context not available. | |||||
static VNET_DEFINE(struct pfi_list, pfi_unlinked_kifs); | static VNET_DEFINE(struct pfi_list, pfi_unlinked_kifs); | ||||
#define V_pfi_unlinked_kifs VNET(pfi_unlinked_kifs) | #define V_pfi_unlinked_kifs VNET(pfi_unlinked_kifs) | ||||
static struct mtx pfi_unlnkdkifs_mtx; | static struct mtx pfi_unlnkdkifs_mtx; | ||||
MTX_SYSINIT(pfi_unlnkdkifs_mtx, &pfi_unlnkdkifs_mtx, "pf unlinked interfaces", | |||||
MTX_DEF); | |||||
void | void | ||||
pfi_initialize(void) | pfi_vnet_initialize(void) | ||||
{ | { | ||||
struct ifg_group *ifg; | struct ifg_group *ifg; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
Context not available. | |||||
V_pfi_buffer = malloc(V_pfi_buffer_max * sizeof(*V_pfi_buffer), | V_pfi_buffer = malloc(V_pfi_buffer_max * sizeof(*V_pfi_buffer), | ||||
PFI_MTYPE, M_WAITOK); | PFI_MTYPE, M_WAITOK); | ||||
mtx_init(&pfi_unlnkdkifs_mtx, "pf unlinked interfaces", NULL, MTX_DEF); | |||||
kif = malloc(sizeof(*kif), PFI_MTYPE, M_WAITOK); | kif = malloc(sizeof(*kif), PFI_MTYPE, M_WAITOK); | ||||
PF_RULES_WLOCK(); | PF_RULES_WLOCK(); | ||||
V_pfi_all = pfi_kif_attach(kif, IFG_ALL); | V_pfi_all = pfi_kif_attach(kif, IFG_ALL); | ||||
Context not available. | |||||
PF_RULES_WUNLOCK(); | PF_RULES_WUNLOCK(); | ||||
IFNET_RLOCK(); | IFNET_RLOCK(); | ||||
TAILQ_FOREACH(ifg, &V_ifg_head, ifg_next) | TAILQ_FOREACH(ifg, &V_ifg_head, ifg_next) { | ||||
pfi_attach_ifgroup(ifg); | pfi_attach_ifgroup(ifg); | ||||
TAILQ_FOREACH(ifp, &V_ifnet, if_link) | } | ||||
TAILQ_FOREACH(ifp, &V_ifnet, if_link) { | |||||
CURVNET_SET(ifp->if_vnet); | |||||
kp: I don't understand why this is required. Surely if an ifnet lives in V_ifnet (so, lives in the… | |||||
Not Done Inline ActionsYou're correct. It is plain wrong nvass-gmx.com: You're correct. It is plain wrong | |||||
pfi_attach_ifnet(ifp); | pfi_attach_ifnet(ifp); | ||||
CURVNET_RESTORE(); | |||||
} | |||||
IFNET_RUNLOCK(); | IFNET_RUNLOCK(); | ||||
} | |||||
void | |||||
pf_init_eventhandlers(void) { | |||||
pfi_attach_cookie = EVENTHANDLER_REGISTER(ifnet_arrival_event, | pfi_attach_cookie = EVENTHANDLER_REGISTER(ifnet_arrival_event, | ||||
pfi_attach_ifnet_event, NULL, EVENTHANDLER_PRI_ANY); | pfi_attach_ifnet_event, curvnet, EVENTHANDLER_PRI_ANY); | ||||
Not Done Inline ActionsWhy add curvnet here? kp: Why add curvnet here?
pfi_attach_ifnet_event doesn't use its argument. | |||||
pfi_detach_cookie = EVENTHANDLER_REGISTER(ifnet_departure_event, | pfi_detach_cookie = EVENTHANDLER_REGISTER(ifnet_departure_event, | ||||
pfi_detach_ifnet_event, NULL, EVENTHANDLER_PRI_ANY); | pfi_detach_ifnet_event, curvnet, EVENTHANDLER_PRI_ANY); | ||||
Not Done Inline ActionsSame as above. kp: Same as above. | |||||
pfi_attach_group_cookie = EVENTHANDLER_REGISTER(group_attach_event, | pfi_attach_group_cookie = EVENTHANDLER_REGISTER(group_attach_event, | ||||
pfi_attach_group_event, curvnet, EVENTHANDLER_PRI_ANY); | pfi_attach_group_event, curvnet, EVENTHANDLER_PRI_ANY); | ||||
pfi_change_group_cookie = EVENTHANDLER_REGISTER(group_change_event, | pfi_change_group_cookie = EVENTHANDLER_REGISTER(group_change_event, | ||||
Context not available. | |||||
pfi_detach_group_cookie = EVENTHANDLER_REGISTER(group_detach_event, | pfi_detach_group_cookie = EVENTHANDLER_REGISTER(group_detach_event, | ||||
pfi_detach_group_event, curvnet, EVENTHANDLER_PRI_ANY); | pfi_detach_group_event, curvnet, EVENTHANDLER_PRI_ANY); | ||||
pfi_ifaddr_event_cookie = EVENTHANDLER_REGISTER(ifaddr_event, | pfi_ifaddr_event_cookie = EVENTHANDLER_REGISTER(ifaddr_event, | ||||
pfi_ifaddr_event, NULL, EVENTHANDLER_PRI_ANY); | pfi_ifaddr_event, curvnet, EVENTHANDLER_PRI_ANY); | ||||
Not Done Inline ActionsSame as above. kp: Same as above. | |||||
} | } | ||||
void | void | ||||
pfi_cleanup(void) | pf_uninit_eventhandlers(void) { | ||||
{ | |||||
struct pfi_kif *p; | |||||
EVENTHANDLER_DEREGISTER(ifnet_arrival_event, pfi_attach_cookie); | EVENTHANDLER_DEREGISTER(ifnet_arrival_event, pfi_attach_cookie); | ||||
EVENTHANDLER_DEREGISTER(ifnet_departure_event, pfi_detach_cookie); | EVENTHANDLER_DEREGISTER(ifnet_departure_event, pfi_detach_cookie); | ||||
Context not available. | |||||
EVENTHANDLER_DEREGISTER(group_change_event, pfi_change_group_cookie); | EVENTHANDLER_DEREGISTER(group_change_event, pfi_change_group_cookie); | ||||
EVENTHANDLER_DEREGISTER(group_detach_event, pfi_detach_group_cookie); | EVENTHANDLER_DEREGISTER(group_detach_event, pfi_detach_group_cookie); | ||||
EVENTHANDLER_DEREGISTER(ifaddr_event, pfi_ifaddr_event_cookie); | EVENTHANDLER_DEREGISTER(ifaddr_event, pfi_ifaddr_event_cookie); | ||||
} | |||||
void | |||||
pfi_cleanup(void) | |||||
{ | |||||
struct pfi_kif *p; | |||||
V_pfi_all = NULL; | V_pfi_all = NULL; | ||||
while ((p = RB_MIN(pfi_ifhead, &V_pfi_ifs))) { | while ((p = RB_MIN(pfi_ifhead, &V_pfi_ifs))) { | ||||
RB_REMOVE(pfi_ifhead, &V_pfi_ifs, p); | RB_REMOVE(pfi_ifhead, &V_pfi_ifs, p); | ||||
Context not available. | |||||
free(p, PFI_MTYPE); | free(p, PFI_MTYPE); | ||||
} | } | ||||
mtx_destroy(&pfi_unlnkdkifs_mtx); | |||||
free(V_pfi_buffer, PFI_MTYPE); | free(V_pfi_buffer, PFI_MTYPE); | ||||
} | } | ||||
Context not available. | |||||
pfi_attach_group_event(void *arg , struct ifg_group *ifg) | pfi_attach_group_event(void *arg , struct ifg_group *ifg) | ||||
{ | { | ||||
Not Done Inline ActionsI believe this is correct, but should probably include adding an __unused annotation to arg, and removing the 'curvnet' argument from the EVENTHANDLER_REGISTER() call. kp: I believe this is correct, but should probably include adding an __unused annotation to arg… | |||||
CURVNET_SET((struct vnet *)arg); | |||||
pfi_attach_ifgroup(ifg); | pfi_attach_ifgroup(ifg); | ||||
CURVNET_RESTORE(); | |||||
} | } | ||||
static void | static void | ||||
Context not available. | |||||
kif = malloc(sizeof(*kif), PFI_MTYPE, M_WAITOK); | kif = malloc(sizeof(*kif), PFI_MTYPE, M_WAITOK); | ||||
CURVNET_SET((struct vnet *)arg); | |||||
PF_RULES_WLOCK(); | PF_RULES_WLOCK(); | ||||
V_pfi_update++; | V_pfi_update++; | ||||
kif = pfi_kif_attach(kif, gname); | kif = pfi_kif_attach(kif, gname); | ||||
pfi_kif_update(kif); | pfi_kif_update(kif); | ||||
PF_RULES_WUNLOCK(); | PF_RULES_WUNLOCK(); | ||||
CURVNET_RESTORE(); | |||||
} | } | ||||
static void | static void | ||||
Context not available. |
I don't understand why this is required. Surely if an ifnet lives in V_ifnet (so, lives in the current vnet) ifp->if_vnet is always going to be curvnet?