Сетевая ссылка расширений ядра
Ссылка KPI документа описывает функции, что NKEs может вызвать и описывает несколько NKE-специфичных типов данных. Они организованы заголовочным файлом. Эта глава включает несколько дополнительных APIs, который может быть полезным при записи NKE.
Утилиты ядра перечисляют некоторые утилиты ядра, которые может вызвать NKEs.
kpi_interface.hвключает функции для управления сетевыми интерфейсами, включая пакетную инжекцию, присоединение/отсоединение протоколов, присоединение/отсоединение интерфейсов, и т.д.kpi_interfacefilter.hвключает функции для фильтрации на необработанном пакетном уровне, чуть выше уровня сетевого интерфейса. Эти функции являются подходящими для интерфейсного фильтра.kpi_ipfilter.hвключает функции для присоединения фильтра пакетов для пакетов IPv6 или IPv4. Эти функции являются подходящими для KEXT, фильтрующего трафик IP.kpi_mbuf.hвключает функции для управления mbuf структуры данных. Они используются в большой степени для того, чтобы раздать пакеты и фрагменты пакета всюду по стеку протоколов.kpi_protocol.hвключает функции для пакетной инжекции. Это также включает функции для регистрации «водопроводчиков» — обработчики, имеющие дело с запросами на присоединение протокола к интерфейсу (и отсоединение, и т.д.).kpi_socket.hвключает функции для управления сокетом, включая пакет отправляют/получают и отмечают манипулирование.kpi_socketfilter.hвключает функции и определения типа данных для создания фильтра сокета.
Утилиты ядра
NKEs может вызвать много функций утилиты ядра включая следующее:
Этот список не пытается быть исчерпывающим, но выделяет многие более часто используемые служебные функции.
_MALLOC
Определенный в: <sys/malloc.h>
Выделяет память ядра.
void *_MALLOC(size_t size, int type, int flags); |
_MALLOC во многом как пространство пользователя malloc функция, но это имеет дополнительные параметры, требующие некоторого объяснения.
types параметром является число, представляющее тип данных, которые будут храниться в параметре. Это используется прежде всего в бухгалтерских целях. Известные типы описаны в <sys/malloc.h>.
Параметр флагов состоит из некоторой комбинации M_WAITOK, M_NOWAIT, и M_ZERO.
Флаг M_NOWAIT причины _MALLOC сразу возвратить нулевого указателя, если никакое пространство не доступно вместо того, чтобы ожидать пространства для становления доступным. В то время как это подходяще для чувствительных ко времени задач, которые могут быть повторены, это не всегда, что Вы хотите.
Более традиционное (и значение по умолчанию) поведение M_WAITOK, который указывает, что безопасно ожидать пространства для становления доступным. Если Ваш код находится в критическом пути для производительности, необходимо, вероятно, использовать M_NOWAIT если это возможно, и зависят от сетевого стека для повторения после того, как ресурсы станут доступными.
Наконец, флаг M_ZERO запросы, что средство выделения должно обнулить получающееся выделение прежде, чем возвратить его.
_FREE
Определенный в: <sys/malloc.h>
Освобождает память, выделенную с _MALLOC
void _FREE(void *addr, int type); |
type флаг передал _FREE должен совпасть с флагом, переданным соответствующему вызову к _MALLOC.
printf
Определенный в: <libkern/libkern.h>
Текст печати к консоли.
void printf(const char *format, ... ); |
Идентичный printf в пространстве пользователя. Не безопасно вызвать printf из контекста прерывания. Это не должно обычно быть проблемой, поскольку необходимо избежать вызывать функции NKE из Набора I/O водительская подпрограмма фильтра как само собой разумеющееся, но это стоит отметить.
proc_exiting
Определенный в: <sys/proc.h>
Возвраты 1, если процесс выходит, еще 0.
int proc_exiting(proc_t); |
proc_is64bit
Определенный в: <sys/proc.h>
Возвраты 1, если процесс является 64-разрядной исполнимой программой, еще 0.
int proc_is64bit(proc_t); |
proc_rele
Определенный в: <sys/proc.h>
Выпускает ссылку на запись процесса.
int proc_rele(proc_t); |
proc_self
Определенный в: <sys/proc.h>
Возвращает ссылку на рабочий процесс. Это должно быть выпущено с “proc_rele”.
proc_t proc_self(void); |
proc_suser
Определенный в: <sys/proc.h>
Проверки, чтобы видеть, работает ли процесс как суперпользователь (корень).
int proc_suser(struct proc *p); |
msleep
Определенный в: <sys/proc.h>
Сон до события отправляется с “wakeup” или пока тайм-аут не происходит. Это обычно объединяется со значением тайм-аута к связанному ожидание.
int msleep(void *chan, lck_mtx_t *mtx, int pri, const char *wmesg, struct timespec *ts); |
Значение тайм-аута является стандартом timespec (определенный в <sys/time.h>, и измеряется в секундах и наносекундах. Для сна, пока не разбужено необходимо передать a NULL значение для ts.
Параметр mtx взаимное исключение (определенный в специфичном для процессора, включают, но включенный с <sys/lock.h>) это будет выпущено до сна. (Взаимное исключение должно быть заблокировано до вызова msleep.) Взаимное исключение будет также повторно получено на след если PDROP флаг установлен в приоритетном значении.
Параметр chan должен быть уникальный идентификатор, определенный для данного события ожидания. Обычно такое событие связано с изменением в переменной, когда адрес той переменной делает хорошее значение для chan.
Параметр pri желаемый приоритет на следе (определенный в <sys/param.h>). После того, как другой поток вызвал “wakeup” на желаемом событии (указанный значением chan), Ваш код начнет выполняться в указанном приоритете. Если PCATCH флаг установлен на pri, сигнальные обработчики попробуют прежде и после сна.
Возвраты 0, если пробуждено с пробуждением, EWOULDBLOCK на истечении тайм-аута, и ERESTART или EINTR если PCATCH установлен и сигнал произошел, в зависимости от ли SA_RESTART флаг установлен на сигнале.
пробуждение
Определенный в: <sys/proc.h>
Следы все потоки, спящие на данном канале через вызов к “msleep”.
void wakeup(void *chan); |
wakeup_one
Определенный в: <sys/proc.h>
Будит первый поток, спящий на данном канале через вызов к “msleep”.
void wakeup_one(void *chan); |