| .TH IPL 4 |
| .SH NAME |
| ipl \- IP packet log device |
| .SH DESCRIPTION |
| The \fBipl\fP pseudo device's purpose is to provide an easy way to gather |
| packet headers of packets you wish to log. If a packet header is to be |
| logged, the entire header is logged (including any IP options \- TCP/UDP |
| options are not included when it calculates header size) or not at all. |
| The packet contents are also logged after the header. If the log reader |
| is busy or otherwise unable to read log records, up to IPLLOGSIZE (8192 is the |
| default) bytes of data are stored. |
| .PP |
| Prepending every packet header logged is a structure containing information |
| relevant to the packet following and why it was logged. The structure's |
| format is as follows: |
| .LP |
| .nf |
| /* |
| * Log structure. Each packet header logged is prepended by one of these. |
| * Following this in the log records read from the device will be an ipflog |
| * structure which is then followed by any packet data. |
| */ |
| typedef struct iplog { |
| u_long ipl_sec; |
| u_long ipl_usec; |
| u_int ipl_len; |
| u_int ipl_count; |
| size_t ipl_dsize; |
| struct iplog *ipl_next; |
| } iplog_t; |
| |
| |
| typedef struct ipflog { |
| #if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) |
| u_char fl_ifname[IFNAMSIZ]; |
| #else |
| u_int fl_unit; |
| u_char fl_ifname[4]; |
| #endif |
| u_char fl_plen; /* extra data after hlen */ |
| u_char fl_hlen; /* length of IP headers saved */ |
| u_short fl_rule; /* assume never more than 64k rules, total */ |
| u_32_t fl_flags; |
| } ipflog_t; |
| |
| .fi |
| .PP |
| When reading from the \fBipl\fP device, it is necessary to call read(2) with |
| a buffer big enough to hold at least 1 complete log record - reading of partial |
| log records is not supported. |
| .PP |
| If the packet contents are more than 128 bytes when \fBlog body\fP is used, |
| then only 128 bytes of the packet contents are logged. |
| .PP |
| Although it is only possible to read from the \fBipl\fP device, opening it |
| for writing is required when using an ioctl which changes any kernel data. |
| .PP |
| The ioctls which are loaded with this device can be found under \fBipf(4)\fP. |
| The ioctls which are for use with logging and don't affect the filter are: |
| .LP |
| .nf |
| ioctl(fd, SIOCIPFFB, int *) |
| ioctl(fd, FIONREAD, int *) |
| .fi |
| .PP |
| The SIOCIPFFB ioctl flushes the log buffer and returns the number of bytes |
| flushed. FIONREAD returns the number of bytes currently used for storing |
| log data. If IPFILTER_LOG is not defined when compiling, SIOCIPFFB is not |
| available and FIONREAD will return but not do anything. |
| .PP |
| There is currently no support for non-blocking IO with this device, meaning |
| all read operations should be considered blocking in nature (if there is no |
| data to read, it will sleep until some is made available). |
| .SH SEE ALSO |
| ipf(4) |
| .SH BUGS |
| Packet headers are dropped when the internal buffer (static size) fills. |
| .SH FILES |
| /dev/ipl |