| .TH LIBIPQ 3 "16 October 2001" "Linux iptables 1.2" "Linux Programmer's Manual"  | 
 | .\" | 
 | .\" $Id: libipq.3,v 1.4 2001/10/16 16:58:25 jamesm Exp $ | 
 | .\" | 
 | .\"     Copyright (c) 2000-2001 Netfilter Core Team | 
 | .\" | 
 | .\"     This program is free software; you can redistribute it and/or modify | 
 | .\"     it under the terms of the GNU General Public License as published by | 
 | .\"     the Free Software Foundation; either version 2 of the License, or | 
 | .\"     (at your option) any later version. | 
 | .\" | 
 | .\"     This program is distributed in the hope that it will be useful, | 
 | .\"     but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | .\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | .\"     GNU General Public License for more details. | 
 | .\" | 
 | .\"     You should have received a copy of the GNU General Public License | 
 | .\"     along with this program; if not, write to the Free Software | 
 | .\"     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
 | .\" | 
 | .\" | 
 | .SH NAME | 
 | libipq \- iptables userspace packet queuing library. | 
 | .SH SYNOPSIS | 
 | .B #include <linux/netfilter.h> | 
 | .br | 
 | .B #include <libipq.h> | 
 | .SH DESCRIPTION | 
 | libipq is a development library for iptables userspace packet queuing. | 
 | .SS Userspace Packet Queuing | 
 | Netfilter provides a mechanism for passing packets out of the stack for | 
 | queueing to userspace, then receiving these packets back into the kernel | 
 | with a verdict specifying what to do with the packets (such as ACCEPT | 
 | or DROP).  These packets may also be modified in userspace prior to | 
 | reinjection back into the kernel. | 
 | .PP | 
 | For each supported protocol, a kernel module called a | 
 | .I queue handler | 
 | may register with Netfilter to perform the mechanics of passing | 
 | packets to and from userspace. | 
 | .PP | 
 | The standard queue handler for IPv4 is ip_queue.  It is provided as an | 
 | experimental module with 2.4 kernels, and uses a Netlink socket for | 
 | kernel/userspace communication. | 
 | .PP | 
 | Once ip_queue is loaded, IP packets may be selected with iptables | 
 | and queued for userspace processing via the QUEUE target.  For example, | 
 | running the following commands: | 
 | .PP | 
 | 	# modprobe iptable_filter | 
 | .br	 | 
 | 	# modprobe ip_queue | 
 | .br	 | 
 | 	# iptables -A OUTPUT -p icmp -j QUEUE | 
 | .PP | 
 | will cause any locally generated ICMP packets (e.g. ping output) to | 
 | be sent to the ip_queue module, which will then attempt to deliver the | 
 | packets to a userspace application.  If no userspace application is waiting, | 
 | the packets will be dropped | 
 | .PP | 
 | An application may receive and process these packets via libipq. | 
 | .PP | 
 | .PP | 
 | .SS Libipq Overview | 
 | Libipq provides an API for communicating with ip_queue.  The following is | 
 | an overview of API usage, refer to individual man pages for more details | 
 | on each function. | 
 | .PP | 
 | .B Initialisation | 
 | .br | 
 | To initialise the library, call | 
 | .BR ipq_create_handle (3). | 
 | This will attempt to bind to the Netlink socket used by ip_queue and | 
 | return an opaque context handle for subsequent library calls. | 
 | .PP | 
 | .B Setting the Queue Mode | 
 | .br | 
 | .BR ipq_set_mode (3) | 
 | allows the application to specify whether packet metadata, or packet | 
 | payloads as well as metadata are copied to userspace.  It is also used to | 
 | initially notify ip_queue that an application is ready to receive queue | 
 | messages. | 
 | .PP | 
 | .B Receiving Packets from the Queue | 
 | .br | 
 | .BR ipq_read (3) | 
 | waits for queue messages to arrive from ip_queue and copies | 
 | them into a supplied buffer. | 
 | Queue messages may be | 
 | .I packet messages | 
 | or | 
 | .I error messages. | 
 | .PP | 
 | The type of packet may be determined with | 
 | .BR ipq_message_type (3). | 
 | .PP | 
 | If it's a packet message, the metadata and optional payload may be retrieved with | 
 | .BR ipq_get_packet (3). | 
 | .PP | 
 | To retrieve the value of an error message, use | 
 | .BR ipq_get_msgerr (3). | 
 | .PP | 
 | .B Issuing Verdicts on Packets | 
 | .br | 
 | To issue a verdict on a packet, and optionally return a modified version | 
 | of the packet to the kernel, call | 
 | .BR ipq_set_verdict (3). | 
 | .PP | 
 | .B Error Handling | 
 | .br | 
 | An error string corresponding to the current value of the internal error | 
 | variable | 
 | .B ipq_errno | 
 | may be obtained with | 
 | .BR ipq_errstr (3). | 
 | .PP | 
 | For simple applications, calling | 
 | .BR ipq_perror (3) | 
 | will print the same message as | 
 | .BR ipq_errstr (3), | 
 | as well as the string corresponding to the global | 
 | .B errno | 
 | value (if set) to stderr. | 
 | .PP | 
 | .B Cleaning Up | 
 | .br | 
 | To free up the Netlink socket and destroy resources associated with | 
 | the context handle, call | 
 | .BR ipq_destroy_handle (3). | 
 | .SH SUMMARY | 
 | .TP 4 | 
 | .BR ipq_create_handle (3) | 
 | Initialise library, return context handle. | 
 | .TP | 
 | .BR ipq_set_mode (3) | 
 | Set the queue mode, to copy either packet metadata, or payloads | 
 | as well as metadata to userspace. | 
 | .TP | 
 | .BR ipq_read (3) | 
 | Wait for a queue message to arrive from ip_queue and read it into | 
 | a buffer. | 
 | .TP | 
 | .BR ipq_message_type (3) | 
 | Determine message type in the buffer. | 
 | .TP | 
 | .BR ipq_get_packet (3) | 
 | Retrieve a packet message from the buffer. | 
 | .TP | 
 | .BR ipq_get_msgerr (3) | 
 | Retrieve an error message from the buffer. | 
 | .TP | 
 | .BR ipq_set_verdict (3) | 
 | Set a verdict on a packet, optionally replacing its contents. | 
 | .TP | 
 | .BR ipq_errstr (3) | 
 | Return an error message corresponding to the internal ipq_errno variable. | 
 | .TP | 
 | .BR ipq_perror (3) | 
 | Helper function to print error messages to stderr. | 
 | .TP | 
 | .BR ipq_destroy_handle (3) | 
 | Destroy context handle and associated resources. | 
 | .SH EXAMPLE | 
 | The following is an example of a simple application which receives | 
 | packets and issues NF_ACCEPT verdicts on each packet. | 
 | .RS | 
 | .nf | 
 | /* | 
 |  * This code is GPL. | 
 |  */ | 
 | #include <linux/netfilter.h> | 
 | #include <libipq.h> | 
 | #include <stdio.h> | 
 |  | 
 | #define BUFSIZE 2048  | 
 |  | 
 | static void die(struct ipq_handle *h) | 
 | { | 
 | 	ipq_perror("passer"); | 
 | 	ipq_destroy_handle(h); | 
 | 	exit(1); | 
 | } | 
 |  | 
 | int main(int argc, char **argv) | 
 | { | 
 | 	int status; | 
 | 	unsigned char buf[BUFSIZE]; | 
 | 	struct ipq_handle *h; | 
 | 	 | 
 | 	h = ipq_create_handle(0, NFPROTO_IPV4); | 
 | 	if (!h) | 
 | 		die(h); | 
 | 		 | 
 | 	status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE); | 
 | 	if (status < 0) | 
 | 		die(h); | 
 | 		 | 
 | 	do{ | 
 | 		status = ipq_read(h, buf, BUFSIZE, 0); | 
 | 		if (status < 0) | 
 | 			die(h); | 
 | 			 | 
 | 		switch (ipq_message_type(buf)) { | 
 | 			case NLMSG_ERROR: | 
 | 				fprintf(stderr, "Received error message %d\\n", | 
 | 				        ipq_get_msgerr(buf)); | 
 | 				break; | 
 | 				 | 
 | 			case IPQM_PACKET: { | 
 | 				ipq_packet_msg_t *m = ipq_get_packet(buf); | 
 | 				 | 
 | 				status = ipq_set_verdict(h, m->packet_id, | 
 | 				                         NF_ACCEPT, 0, NULL); | 
 | 				if (status < 0) | 
 | 					die(h); | 
 | 				break; | 
 | 			} | 
 | 			 | 
 | 			default: | 
 | 				fprintf(stderr, "Unknown message type!\\n"); | 
 | 				break; | 
 | 		} | 
 | 	} while (1); | 
 | 	 | 
 | 	ipq_destroy_handle(h); | 
 | 	return 0; | 
 | } | 
 | .RE | 
 | .fi | 
 | .PP | 
 | Pointers to more libipq application examples may be found in The | 
 | Netfilter FAQ. | 
 | .SH DIAGNOSTICS | 
 | For information about monitoring and tuning ip_queue, refer to the | 
 | Linux 2.4 Packet Filtering HOWTO. | 
 | .PP | 
 | If an application modifies a packet, it needs to also update any | 
 | checksums for the packet.  Typically, the kernel will silently discard | 
 | modified packets with invalid checksums.  | 
 | .SH SECURITY | 
 | Processes require CAP_NET_ADMIN capabilty to access the kernel ip_queue | 
 | module.  Such processes can potentially access and modify any IP packets | 
 | received, generated or forwarded by the kernel. | 
 | .SH TODO | 
 | Per-handle | 
 | .B ipq_errno | 
 | values. | 
 | .SH BUGS | 
 | Probably. | 
 | .SH AUTHOR | 
 | James Morris <jmorris@intercode.com.au> | 
 | .SH COPYRIGHT | 
 | Copyright (c) 2000-2001 Netfilter Core Team. | 
 | .PP | 
 | Distributed under the GNU General Public License. | 
 | .SH CREDITS | 
 | Joost Remijn implemented the | 
 | .B ipq_read | 
 | timeout feature, which appeared in the 1.2.4 release of iptables. | 
 | .PP | 
 | Fernando Anton added support for IPv6. | 
 | .SH SEE ALSO | 
 | .BR iptables (8), | 
 | .BR ipq_create_handle (3), | 
 | .BR ipq_destroy_handle (3), | 
 | .BR ipq_errstr (3), | 
 | .BR ipq_get_msgerr (3), | 
 | .BR ipq_get_packet (3), | 
 | .BR ipq_message_type (3), | 
 | .BR ipq_perror (3), | 
 | .BR ipq_read (3), | 
 | .BR ipq_set_mode (3), | 
 | .BR ipq_set_verdict (3). | 
 | .PP | 
 | The Netfilter home page at http://netfilter.samba.org/ | 
 | which has links to The Networking Concepts HOWTO, The Linux 2.4 Packet | 
 | Filtering HOWTO, The Linux 2.4 NAT HOWTO, The Netfilter Hacking HOWTO, | 
 | The Netfilter FAQ and many other useful resources. | 
 |  |