home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / netinet6 / ip6_fw.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  7.0 KB  |  220 lines

  1. /*    $KAME: ip6_fw.h,v 1.2 2000/02/22 14:04:21 itojun Exp $    */
  2.  
  3. /*
  4.  * Copyright (c) 1993 Daniel Boulet
  5.  * Copyright (c) 1994 Ugen J.S.Antsilevich
  6.  *
  7.  * Redistribution and use in source forms, with and without modification,
  8.  * are permitted provided that this entire comment appears intact.
  9.  *
  10.  * Redistribution in binary form may occur without any restrictions.
  11.  * Obviously, it would be nice if you gave credit where credit is due
  12.  * but requiring it would be too onerous.
  13.  *
  14.  * This software is provided ``AS IS'' without any warranties of any kind.
  15.  *
  16.  */
  17.  
  18. #ifndef _IP6_FW_H
  19. #define _IP6_FW_H
  20.  
  21. #include <net/if.h>
  22.  
  23. /*
  24.  * This union structure identifies an interface, either explicitly
  25.  * by name or implicitly by IP address. The flags IP_FW_F_IIFNAME
  26.  * and IP_FW_F_OIFNAME say how to interpret this structure. An
  27.  * interface unit number of -1 matches any unit number, while an
  28.  * IP address of 0.0.0.0 indicates matches any interface.
  29.  *
  30.  * The receive and transmit interfaces are only compared against the
  31.  * the packet if the corresponding bit (IP_FW_F_IIFACE or IP_FW_F_OIFACE)
  32.  * is set. Note some packets lack a receive or transmit interface
  33.  * (in which case the missing "interface" never matches).
  34.  */
  35.  
  36. union ip6_fw_if {
  37.     struct in6_addr fu_via_ip6;    /* Specified by IPv6 address */
  38.     struct {            /* Specified by interface name */
  39. #define FW_IFNLEN     IFNAMSIZ
  40.         char  name[FW_IFNLEN];
  41.         short unit;        /* -1 means match any unit */
  42.     } fu_via_if;
  43. };
  44.  
  45. /*
  46.  * Format of an IP firewall descriptor
  47.  *
  48.  * fw_src, fw_dst, fw_smsk, fw_dmsk are always stored in network byte order.
  49.  * fw_flg and fw_n*p are stored in host byte order (of course).
  50.  * Port numbers are stored in HOST byte order.
  51.  * Warning: setsockopt() will fail if sizeof(struct ip_fw) > MLEN (108)
  52.  */
  53.  
  54. struct ip6_fw {
  55.     u_long fw_pcnt,fw_bcnt;        /* Packet and byte counters */
  56.     struct in6_addr fw_src, fw_dst;    /* Source and destination IPv6 addr */
  57.     struct in6_addr fw_smsk, fw_dmsk;    /* Mask for src and dest IPv6 addr */
  58.     u_short fw_number;            /* Rule number */
  59.     u_short fw_flg;            /* Flags word */
  60. #define IPV6_FW_MAX_PORTS    10    /* A reasonable maximum */
  61.     u_short fw_pts[IPV6_FW_MAX_PORTS];    /* Array of port numbers to match */
  62.     u_char fw_ip6opt,fw_ip6nopt;    /* IPv6 options set/unset */
  63.     u_char fw_tcpf,fw_tcpnf;        /* TCP flags set/unset */
  64. #define IPV6_FW_ICMPTYPES_DIM (32 / (sizeof(unsigned) * 8))
  65.     unsigned fw_icmp6types[IPV6_FW_ICMPTYPES_DIM]; /* ICMP types bitmap */
  66.     long timestamp;            /* timestamp (tv_sec) of last match */
  67.     union ip6_fw_if fw_in_if, fw_out_if;/* Incoming and outgoing interfaces */
  68.     union {
  69.     u_short fu_divert_port;        /* Divert/tee port (options IP6DIVERT) */
  70.     u_short fu_skipto_rule;        /* SKIPTO command rule number */
  71.     u_short fu_reject_code;        /* REJECT response code */
  72.     } fw_un;
  73.     u_char fw_prot;            /* IPv6 protocol */
  74.     u_char fw_nports;            /* N'of src ports and # of dst ports */
  75.                     /* in ports array (dst ports follow */
  76.                     /* src ports; max of 10 ports in all; */
  77.                     /* count of 0 means match all ports) */
  78. };
  79.  
  80. #define IPV6_FW_GETNSRCP(rule)        ((rule)->fw_nports & 0x0f)
  81. #define IPV6_FW_SETNSRCP(rule, n)        do {                \
  82.                       (rule)->fw_nports &= ~0x0f;    \
  83.                       (rule)->fw_nports |= (n);    \
  84.                     } while (0)
  85. #define IPV6_FW_GETNDSTP(rule)        ((rule)->fw_nports >> 4)
  86. #define IPV6_FW_SETNDSTP(rule, n)        do {                \
  87.                       (rule)->fw_nports &= ~0xf0;    \
  88.                       (rule)->fw_nports |= (n) << 4;\
  89.                     } while (0)
  90.  
  91. #define fw_divert_port    fw_un.fu_divert_port
  92. #define fw_skipto_rule    fw_un.fu_skipto_rule
  93. #define fw_reject_code    fw_un.fu_reject_code
  94.  
  95. struct ip6_fw_chain {
  96.         LIST_ENTRY(ip6_fw_chain) chain;
  97.         struct ip6_fw    *rule;
  98. };
  99.  
  100. /*
  101.  * Values for "flags" field .
  102.  */
  103. #define IPV6_FW_F_IN    0x0001    /* Check inbound packets        */
  104. #define IPV6_FW_F_OUT    0x0002    /* Check outbound packets        */
  105. #define IPV6_FW_F_IIFACE    0x0004    /* Apply inbound interface test        */
  106. #define IPV6_FW_F_OIFACE    0x0008    /* Apply outbound interface test    */
  107.  
  108. #define IPV6_FW_F_COMMAND 0x0070    /* Mask for type of chain entry:    */
  109. #define IPV6_FW_F_DENY    0x0000    /* This is a deny rule            */
  110. #define IPV6_FW_F_REJECT    0x0010    /* Deny and send a response packet    */
  111. #define IPV6_FW_F_ACCEPT    0x0020    /* This is an accept rule        */
  112. #define IPV6_FW_F_COUNT    0x0030    /* This is a count rule            */
  113. #define IPV6_FW_F_DIVERT    0x0040    /* This is a divert rule        */
  114. #define IPV6_FW_F_TEE    0x0050    /* This is a tee rule            */
  115. #define IPV6_FW_F_SKIPTO    0x0060    /* This is a skipto rule        */
  116.  
  117. #define IPV6_FW_F_PRN    0x0080    /* Print if this rule matches        */
  118.  
  119. #define IPV6_FW_F_SRNG    0x0100    /* The first two src ports are a min    *
  120.                  * and max range (stored in host byte    *
  121.                  * order).                */
  122.  
  123. #define IPV6_FW_F_DRNG    0x0200    /* The first two dst ports are a min    *
  124.                  * and max range (stored in host byte    *
  125.                  * order).                */
  126.  
  127. #define IPV6_FW_F_IIFNAME    0x0400    /* In interface by name/unit (not IP)    */
  128. #define IPV6_FW_F_OIFNAME    0x0800    /* Out interface by name/unit (not IP)    */
  129.  
  130. #define IPV6_FW_F_INVSRC    0x1000    /* Invert sense of src check        */
  131. #define IPV6_FW_F_INVDST    0x2000    /* Invert sense of dst check        */
  132.  
  133. #define IPV6_FW_F_FRAG    0x4000    /* Fragment                */
  134.  
  135. #define IPV6_FW_F_ICMPBIT 0x8000    /* ICMP type bitmap is valid        */
  136.  
  137. #define IPV6_FW_F_MASK    0xFFFF    /* All possible flag bits mask        */
  138.  
  139. /*
  140.  * For backwards compatibility with rules specifying "via iface" but
  141.  * not restricted to only "in" or "out" packets, we define this combination
  142.  * of bits to represent this configuration.
  143.  */
  144.  
  145. #define IF6_FW_F_VIAHACK    (IPV6_FW_F_IN|IPV6_FW_F_OUT|IPV6_FW_F_IIFACE|IPV6_FW_F_OIFACE)
  146.  
  147. /*
  148.  * Definitions for REJECT response codes.
  149.  * Values less than 256 correspond to ICMP unreachable codes.
  150.  */
  151. #define IPV6_FW_REJECT_RST    0x0100        /* TCP packets: send RST */
  152.  
  153. /*
  154.  * Definitions for IPv6 option names.
  155.  */
  156. #define IPV6_FW_IP6OPT_HOPOPT    0x01
  157. #define IPV6_FW_IP6OPT_ROUTE    0x02
  158. #define IPV6_FW_IP6OPT_FRAG    0x04
  159. #define IPV6_FW_IP6OPT_ESP    0x08
  160. #define IPV6_FW_IP6OPT_AH    0x10
  161. #define IPV6_FW_IP6OPT_NONXT    0x20
  162. #define IPV6_FW_IP6OPT_OPTS    0x40
  163.  
  164. /*
  165.  * Definitions for TCP flags.
  166.  */
  167. #define IPV6_FW_TCPF_FIN    TH_FIN
  168. #define IPV6_FW_TCPF_SYN    TH_SYN
  169. #define IPV6_FW_TCPF_RST    TH_RST
  170. #define IPV6_FW_TCPF_PSH    TH_PUSH
  171. #define IPV6_FW_TCPF_ACK    TH_ACK
  172. #define IPV6_FW_TCPF_URG    TH_URG
  173. #define IPV6_FW_TCPF_ESTAB    0x40
  174.  
  175. /*
  176.  * Names for IPV6_FW sysctl objects
  177.  */
  178. #define IP6FWCTL_DEBUG             1
  179. #define IP6FWCTL_VERBOSE       2
  180. #define IP6FWCTL_VERBLIMIT      3 
  181. #define IP6FWCTL_MAXID          4
  182.  
  183. #define IP6FWCTL_NAMES { \
  184.         { 0, 0 }, \
  185.         { 0, 0 }, \
  186.         { "debug", CTLTYPE_INT }, \
  187.         { "verbose", CTLTYPE_INT }, \
  188.         { "verbose_limit", CTLTYPE_INT }, \
  189. }
  190.  
  191. #define IP6FWCTL_VARS { \
  192.         0, \
  193.         0, \
  194.         &fw6_debug,   \
  195.         &fw6_verbose,  \
  196.         &fw6_verbose_limit, \
  197. }
  198.  
  199. /*
  200.  * Main firewall chains definitions and global var's definitions.
  201.  */
  202. #if KERNEL
  203.  
  204. /*
  205.  * Function definitions.
  206.  */
  207. void ip6_fw_init(void);
  208.  
  209. /* Firewall hooks */
  210. struct ip6_hdr;
  211. typedef    int ip6_fw_chk_t __P((struct ip6_hdr**, struct ifnet*,
  212.                 u_short *, struct mbuf**));
  213. typedef    int ip6_fw_ctl_t __P((int, struct mbuf**));
  214. extern    ip6_fw_chk_t *ip6_fw_chk_ptr;
  215. extern    ip6_fw_ctl_t *ip6_fw_ctl_ptr;
  216.  
  217. #endif /* KERNEL */
  218.  
  219. #endif /* _IP6_FW_H */
  220.