]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/kpi_interfacefilter.h
xnu-792.tar.gz
[apple/xnu.git] / bsd / net / kpi_interfacefilter.h
diff --git a/bsd/net/kpi_interfacefilter.h b/bsd/net/kpi_interfacefilter.h
new file mode 100644 (file)
index 0000000..e4140b1
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*!
+       @header kpi_interfacefilter.h
+       This header defines an API to attach interface filters. Interface
+       filters may be attached to a specific interface. The filters can
+       intercept all packets in to and out of the specific interface. In
+       addition, the filters may intercept interface specific events and
+       ioctls.
+ */
+
+#ifndef __KPI_INTERFACEFILTER__
+#define __KPI_INTERFACEFILTER__
+#include <sys/kernel_types.h>
+#include <net/kpi_interface.h>
+
+struct kev_msg;
+
+/*!
+       @typedef iff_input_func
+       
+       @discussion iff_input_func is used to filter incoming packets. The
+               interface is only valid for the duration of the filter call. If
+               you need to keep a reference to the interface, be sure to call
+               ifnet_reference and ifnet_release. The packets passed to the
+               inbound filter are different from those passed to the outbound
+               filter. Packets to the inbound filter have the frame header
+               passed in separately from the rest of the packet. The outbound
+               data filters is passed the whole packet including the frame
+               header.
+               
+               The frame header usually preceeds the data in the mbuf. This
+               ensures that the frame header will be a valid pointer as long as
+               the mbuf is not freed. If you need to change the frame header to
+               point somewhere else, the recommended method is to prepend a new
+               frame header to the mbuf chain (mbuf_prepend), set the header to
+               point to that data, then call mbuf_adj to move the mbuf data
+               pointer back to the start of the packet payload.
+       @param cookie The cookie specified when this filter was attached.
+       @param interface The interface the packet was recieved on.
+       @param protocol The protocol of this packet. If you specified a
+               protocol when attaching your filter, the protocol will only ever
+               be the protocol you specified.
+       @param data The inbound packet, after the frame header as determined
+               by the interface.
+       @param frame_ptr A pointer to the pointer to the frame header. The
+               frame header length can be found by inspecting the interface's
+               frame header length (ifnet_hdrlen).
+       @result Return:
+               0 - The caller will continue with normal processing of the packet.
+               EJUSTRETURN - The caller will stop processing the packet, the packet will not be freed.
+               Anything Else - The caller will free the packet and stop processing.
+*/
+typedef        errno_t (*iff_input_func)(void* cookie, ifnet_t interface, protocol_family_t protocol,
+                                                                 mbuf_t *data, char **frame_ptr);
+
+/*!
+       @typedef iff_output_func
+       
+       @discussion iff_output_func is used to filter fully formed outbound
+               packets. The interface is only valid for the duration of the
+               filter call. If you need to keep a reference to the interface,
+               be sure to call ifnet_reference and ifnet_release.
+       @param cookie The cookie specified when this filter was attached.
+       @param interface The interface the packet is being transmitted on.
+       @param data The fully formed outbound packet in a chain of mbufs.
+               The frame header is already included. The filter function may
+               modify the packet or return a different mbuf chain.
+       @result Return:
+               0 - The caller will continue with normal processing of the packet.
+               EJUSTRETURN - The caller will stop processing the packet, the packet will not be freed.
+               Anything Else - The caller will free the packet and stop processing.
+*/
+typedef        errno_t (*iff_output_func)(void* cookie, ifnet_t interface, protocol_family_t protocol,
+                                                                  mbuf_t *data);
+
+/*!
+       @typedef iff_event_func
+       
+       @discussion iff_event_func is used to filter interface specific
+               events. The interface is only valid for the duration of the
+               filter call. If you need to keep a reference to the interface,
+               be sure to call ifnet_reference and ifnet_release.
+       @param cookie The cookie specified when this filter was attached.
+       @param interface The interface the packet is being transmitted on.
+       @param event_msg The kernel event, may not be changed.
+*/
+typedef        void (*iff_event_func)(void* cookie, ifnet_t interface, protocol_family_t protocol,
+                                                          const struct kev_msg *event_msg);
+
+/*!
+       @typedef iff_ioctl_func
+       
+       @discussion iff_ioctl_func is used to filter ioctls sent to an
+               interface. The interface is only valid for the duration of the
+               filter call. If you need to keep a reference to the interface,
+               be sure to call ifnet_reference and ifnet_release.
+       @param cookie The cookie specified when this filter was attached.
+       @param interface The interface the packet is being transmitted on.
+       @param ioctl_cmd The ioctl command.
+       @param ioctl_arg A pointer to the ioctl argument.
+       @result Return:
+               0 - The caller will continue with normal processing of the packet.
+               EJUSTRETURN - The caller will stop processing the packet, the packet will not be freed.
+               Anything Else - The caller will free the packet and stop processing.
+*/
+typedef        errno_t (*iff_ioctl_func)(void* cookie, ifnet_t interface, protocol_family_t protocol,
+                                                                 u_long ioctl_cmd, void* ioctl_arg);
+
+/*!
+       @typedef iff_detached_func
+       
+       @discussion iff_detached_func is called to notify the filter that it
+               has been detached from an interface. This is the last call to
+               the filter that will be made. A filter may be detached if the
+               interface is detached or the detach filter function is called.
+               In the case that the interface is being detached, your filter's
+               event function will be called with the interface detaching event
+               before the your detached function will be called.
+       @param cookie The cookie specified when this filter was attached.
+       @param interface The interface this filter was detached from.
+*/
+typedef        void (*iff_detached_func)(void* cookie, ifnet_t interface);
+
+/*!
+       @struct iff_filter
+       @discussion This structure is used to define an interface filter for
+               use with the iflt_attach function.
+       @field iff_cookie A kext defined cookie that will be passed to all
+               filter functions.
+       @field iff_name A filter name used for debugging purposes.
+       @field iff_protocol The protocol of the packets this filter is
+               interested in. If you specify zero, packets from all protocols
+               will be passed to the filter.
+       @field iff_input The filter function to handle inbound packets, may
+               be NULL.
+       @field iff_output The filter function to handle outbound packets,
+               may be NULL.
+       @field iff_event The filter function to handle interface events, may
+               be null.
+       @field iff_ioctl The filter function to handle interface ioctls, may
+               be null.
+       @field iff_detached The filter function used to notify the filter that
+               it has been detached.
+*/
+
+struct iff_filter {
+       void*                           iff_cookie;
+       const char*                     iff_name;
+       protocol_family_t       iff_protocol;
+       iff_input_func          iff_input;
+       iff_output_func         iff_output;
+       iff_event_func          iff_event;
+       iff_ioctl_func          iff_ioctl;
+       iff_detached_func       iff_detached;
+};
+
+/*!
+       @function iflt_attach
+       @discussion Attaches an interface filter to an interface.
+       @param interface The interface the filter should be attached to.
+       @param filter A structure defining the filter.
+       @param filter_ref A reference to the filter used to detach.
+       @result 0 on success otherwise the errno error.
+ */
+errno_t iflt_attach(ifnet_t interface, const struct iff_filter* filter,
+                                   interface_filter_t *filter_ref);
+
+/*!
+       @function iflt_detach
+       @discussion Detaches an interface filter from an interface.
+       @param filter_ref The reference to the filter from iflt_attach.
+ */
+void iflt_detach(interface_filter_t filter_ref);
+
+#endif