Changeset View
Changeset View
Standalone View
Standalone View
sys/netpfil/pf/pf_ioctl.c
| Show First 20 Lines • Show All 2,549 Lines • ▼ Show 20 Lines | DIOCGETETHRULES_error: | ||||
| case DIOCGETETHRULE: { | case DIOCGETETHRULE: { | ||||
| struct epoch_tracker et; | struct epoch_tracker et; | ||||
| struct pfioc_nv *nv = (struct pfioc_nv *)addr; | struct pfioc_nv *nv = (struct pfioc_nv *)addr; | ||||
| nvlist_t *nvl = NULL; | nvlist_t *nvl = NULL; | ||||
| void *nvlpacked = NULL; | void *nvlpacked = NULL; | ||||
| struct pf_keth_rule *rule = NULL; | struct pf_keth_rule *rule = NULL; | ||||
| u_int32_t ticket, nr; | u_int32_t ticket, nr; | ||||
| bool clear = false; | |||||
| #define ERROUT(x) do { error = (x); goto DIOCGETETHRULE_error; } while (0) | #define ERROUT(x) do { error = (x); goto DIOCGETETHRULE_error; } while (0) | ||||
| nvlpacked = malloc(nv->len, M_TEMP, M_WAITOK); | nvlpacked = malloc(nv->len, M_TEMP, M_WAITOK); | ||||
| if (nvlpacked == NULL) | if (nvlpacked == NULL) | ||||
| ERROUT(ENOMEM); | ERROUT(ENOMEM); | ||||
| error = copyin(nv->data, nvlpacked, nv->len); | error = copyin(nv->data, nvlpacked, nv->len); | ||||
| if (error) | if (error) | ||||
| ERROUT(error); | ERROUT(error); | ||||
| nvl = nvlist_unpack(nvlpacked, nv->len, 0); | nvl = nvlist_unpack(nvlpacked, nv->len, 0); | ||||
| if (! nvlist_exists_number(nvl, "ticket")) | if (! nvlist_exists_number(nvl, "ticket")) | ||||
| ERROUT(EBADMSG); | ERROUT(EBADMSG); | ||||
| ticket = nvlist_get_number(nvl, "ticket"); | ticket = nvlist_get_number(nvl, "ticket"); | ||||
| if (nvlist_exists_bool(nvl, "clear")) | |||||
| clear = nvlist_get_bool(nvl, "clear"); | |||||
| if (clear && !(flags & FWRITE)) | |||||
| ERROUT(EACCES); | |||||
| if (! nvlist_exists_number(nvl, "nr")) | if (! nvlist_exists_number(nvl, "nr")) | ||||
| ERROUT(EBADMSG); | ERROUT(EBADMSG); | ||||
| nr = nvlist_get_number(nvl, "nr"); | nr = nvlist_get_number(nvl, "nr"); | ||||
| nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
| nvl = NULL; | nvl = NULL; | ||||
| free(nvlpacked, M_TEMP); | free(nvlpacked, M_TEMP); | ||||
| nvlpacked = NULL; | nvlpacked = NULL; | ||||
| Show All 25 Lines | if (nvlpacked == NULL) | ||||
| ERROUT(ENOMEM); | ERROUT(ENOMEM); | ||||
| if (nv->size == 0) | if (nv->size == 0) | ||||
| ERROUT(0); | ERROUT(0); | ||||
| else if (nv->size < nv->len) | else if (nv->size < nv->len) | ||||
| ERROUT(ENOSPC); | ERROUT(ENOSPC); | ||||
| error = copyout(nvlpacked, nv->data, nv->len); | error = copyout(nvlpacked, nv->data, nv->len); | ||||
| if (error == 0 && clear) { | |||||
| counter_u64_zero(rule->evaluations); | |||||
| for (int i = 0; i < 2; i++) { | |||||
| counter_u64_zero(rule->packets[i]); | |||||
| counter_u64_zero(rule->bytes[i]); | |||||
| } | |||||
| } | |||||
| #undef ERROUT | #undef ERROUT | ||||
| DIOCGETETHRULE_error: | DIOCGETETHRULE_error: | ||||
| free(nvlpacked, M_TEMP); | free(nvlpacked, M_TEMP); | ||||
| nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
| break; | break; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 3,805 Lines • Show Last 20 Lines | |||||