Deleted Added
full compact
1/* $OpenBSD: if_pfsync.c,v 1.110 2009/02/24 05:39:19 dlg Exp $ */
2
3/*
4 * Copyright (c) 2002 Michael Shalayeff
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 41 unchanged lines hidden (view full) ---

50 * 1.128 - cleanups
51 * 1.146 - bzero() mbuf before sparsely filling it with data
52 * 1.170 - SIOCSIFMTU checks
53 * 1.126, 1.142 - deferred packets processing
54 * 1.173 - correct expire time processing
55 */
56
57#include <sys/cdefs.h>
58__FBSDID("$FreeBSD: head/sys/netpfil/pf/if_pfsync.c 241394 2012-10-10 08:36:38Z kevlo $");
58__FBSDID("$FreeBSD: head/sys/netpfil/pf/if_pfsync.c 241610 2012-10-16 13:37:54Z glebius $");
59
60#include "opt_inet.h"
61#include "opt_inet6.h"
62#include "opt_pf.h"
63
64#include <sys/param.h>
65#include <sys/bus.h>
66#include <sys/endian.h>

--- 148 unchanged lines hidden (view full) ---

215#define PFSYNC_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
216#define PFSYNC_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
217#define PFSYNC_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
218
219#define PFSYNC_BLOCK(sc) mtx_lock(&(sc)->sc_bulk_mtx)
220#define PFSYNC_BUNLOCK(sc) mtx_unlock(&(sc)->sc_bulk_mtx)
221#define PFSYNC_BLOCK_ASSERT(sc) mtx_assert(&(sc)->sc_bulk_mtx, MA_OWNED)
222
223static MALLOC_DEFINE(M_PFSYNC, "pfsync", "pfsync(4) data");
223static const char pfsyncname[] = "pfsync";
224static MALLOC_DEFINE(M_PFSYNC, pfsyncname, "pfsync(4) data");
225static VNET_DEFINE(struct pfsync_softc *, pfsyncif) = NULL;
226#define V_pfsyncif VNET(pfsyncif)
227static VNET_DEFINE(void *, pfsync_swi_cookie) = NULL;
228#define V_pfsync_swi_cookie VNET(pfsync_swi_cookie)
229static VNET_DEFINE(struct pfsyncstats, pfsyncstats);
230#define V_pfsyncstats VNET(pfsyncstats)
231static VNET_DEFINE(int, pfsync_carp_adj) = CARP_MAXSKEW;
232#define V_pfsync_carp_adj VNET(pfsync_carp_adj)

--- 42 unchanged lines hidden (view full) ---

275static void pfsync_bulk_fail(void *);
276
277#ifdef IPSEC
278static void pfsync_update_net_tdb(struct pfsync_tdb *);
279#endif
280
281#define PFSYNC_MAX_BULKTRIES 12
282
282VNET_DEFINE(struct ifc_simple_data, pfsync_cloner_data);
283VNET_DEFINE(struct if_clone, pfsync_cloner);
284#define V_pfsync_cloner_data VNET(pfsync_cloner_data)
285#define V_pfsync_cloner VNET(pfsync_cloner)
286IFC_SIMPLE_DECLARE(pfsync, 1);
283VNET_DEFINE(struct if_clone *, pfsync_cloner);
284#define V_pfsync_cloner VNET(pfsync_cloner)
285
286static int
287pfsync_clone_create(struct if_clone *ifc, int unit, caddr_t param)
288{
289 struct pfsync_softc *sc;
290 struct ifnet *ifp;
291 int q;
292

--- 12 unchanged lines hidden (view full) ---

305 sc->sc_len = PFSYNC_MINPKT;
306 sc->sc_maxupdates = 128;
307
308 ifp = sc->sc_ifp = if_alloc(IFT_PFSYNC);
309 if (ifp == NULL) {
310 free(sc, M_PFSYNC);
311 return (ENOSPC);
312 }
315 if_initname(ifp, ifc->ifc_name, unit);
313 if_initname(ifp, pfsyncname, unit);
314 ifp->if_softc = sc;
315 ifp->if_ioctl = pfsyncioctl;
316 ifp->if_output = pfsyncoutput;
317 ifp->if_type = IFT_PFSYNC;
318 ifp->if_snd.ifq_maxlen = ifqmaxlen;
319 ifp->if_hdrlen = sizeof(struct pfsync_header);
320 ifp->if_mtu = ETHERMTU;
323 mtx_init(&sc->sc_mtx, "pfsync", NULL, MTX_DEF);
321 mtx_init(&sc->sc_mtx, pfsyncname, NULL, MTX_DEF);
322 mtx_init(&sc->sc_bulk_mtx, "pfsync bulk", NULL, MTX_DEF);
323 callout_init(&sc->sc_tmo, CALLOUT_MPSAFE);
324 callout_init_mtx(&sc->sc_bulk_tmo, &sc->sc_bulk_mtx, 0);
325 callout_init_mtx(&sc->sc_bulkfail_tmo, &sc->sc_bulk_mtx, 0);
326
327 if_attach(ifp);
328
329 bpfattach(ifp, DLT_PFSYNC, PFSYNC_HDRLEN);

--- 1976 unchanged lines hidden (view full) ---

2306pfsync_init()
2307{
2308 VNET_ITERATOR_DECL(vnet_iter);
2309 int error = 0;
2310
2311 VNET_LIST_RLOCK();
2312 VNET_FOREACH(vnet_iter) {
2313 CURVNET_SET(vnet_iter);
2316 V_pfsync_cloner = pfsync_cloner;
2317 V_pfsync_cloner_data = pfsync_cloner_data;
2318 V_pfsync_cloner.ifc_data = &V_pfsync_cloner_data;
2319 if_clone_attach(&V_pfsync_cloner);
2320 error = swi_add(NULL, "pfsync", pfsyncintr, V_pfsyncif,
2314 V_pfsync_cloner = if_clone_simple(pfsyncname,
2315 pfsync_clone_create, pfsync_clone_destroy, 1);
2316 error = swi_add(NULL, pfsyncname, pfsyncintr, V_pfsyncif,
2317 SWI_NET, INTR_MPSAFE, &V_pfsync_swi_cookie);
2318 CURVNET_RESTORE();
2319 if (error)
2320 goto fail_locked;
2321 }
2322 VNET_LIST_RUNLOCK();
2323#ifdef INET
2324 error = pf_proto_register(PF_INET, &in_pfsync_protosw);

--- 11 unchanged lines hidden (view full) ---

2336
2337fail:
2338 VNET_LIST_RLOCK();
2339fail_locked:
2340 VNET_FOREACH(vnet_iter) {
2341 CURVNET_SET(vnet_iter);
2342 if (V_pfsync_swi_cookie) {
2343 swi_remove(V_pfsync_swi_cookie);
2348 if_clone_detach(&V_pfsync_cloner);
2344 if_clone_detach(V_pfsync_cloner);
2345 }
2346 CURVNET_RESTORE();
2347 }
2348 VNET_LIST_RUNLOCK();
2349
2350 return (error);
2351}
2352

--- 4 unchanged lines hidden (view full) ---

2357
2358 pfsync_pointers_uninit();
2359
2360 ipproto_unregister(IPPROTO_PFSYNC);
2361 pf_proto_unregister(PF_INET, IPPROTO_PFSYNC, SOCK_RAW);
2362 VNET_LIST_RLOCK();
2363 VNET_FOREACH(vnet_iter) {
2364 CURVNET_SET(vnet_iter);
2369 if_clone_detach(&V_pfsync_cloner);
2365 if_clone_detach(V_pfsync_cloner);
2366 swi_remove(V_pfsync_swi_cookie);
2367 CURVNET_RESTORE();
2368 }
2369 VNET_LIST_RUNLOCK();
2370}
2371
2372static int
2373pfsync_modevent(module_t mod, int type, void *data)

--- 17 unchanged lines hidden (view full) ---

2391 error = EINVAL;
2392 break;
2393 }
2394
2395 return (error);
2396}
2397
2398static moduledata_t pfsync_mod = {
2403 "pfsync",
2399 pfsyncname,
2400 pfsync_modevent,
2401 0
2402};
2403
2404#define PFSYNC_MODVER 1
2405
2406DECLARE_MODULE(pfsync, pfsync_mod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY);
2407MODULE_VERSION(pfsync, PFSYNC_MODVER);
2408MODULE_DEPEND(pfsync, pf, PF_MODVER, PF_MODVER, PF_MODVER);