| .\" $NetBSD: ipsec_set_policy.3,v 1.15 2010/03/05 06:47:58 tteras Exp $ |
| .\" |
| .\" $KAME: ipsec_set_policy.3,v 1.16 2003/01/06 21:59:03 sumikawa Exp $ |
| .\" |
| .\" Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. |
| .\" All rights reserved. |
| .\" |
| .\" Redistribution and use in source and binary forms, with or without |
| .\" modification, are permitted provided that the following conditions |
| .\" are met: |
| .\" 1. Redistributions of source code must retain the above copyright |
| .\" notice, this list of conditions and the following disclaimer. |
| .\" 2. Redistributions in binary form must reproduce the above copyright |
| .\" notice, this list of conditions and the following disclaimer in the |
| .\" documentation and/or other materials provided with the distribution. |
| .\" 3. Neither the name of the project nor the names of its contributors |
| .\" may be used to endorse or promote products derived from this software |
| .\" without specific prior written permission. |
| .\" |
| .\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND |
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| .\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE |
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| .\" SUCH DAMAGE. |
| .\" |
| .Dd May 5, 1998 |
| .Dt IPSEC_SET_POLICY 3 |
| .Os |
| .Sh NAME |
| .Nm ipsec_set_policy , |
| .Nm ipsec_get_policylen , |
| .Nm ipsec_dump_policy |
| .Nd manipulate IPsec policy specification structure from human-readable policy string |
| .\" |
| .Sh LIBRARY |
| .Lb libipsec |
| .Sh SYNOPSIS |
| .In netinet6/ipsec.h |
| .Ft "char *" |
| .Fn ipsec_set_policy "char *policy" "int len" |
| .Ft int |
| .Fn ipsec_get_policylen "char *buf" |
| .Ft "char *" |
| .Fn ipsec_dump_policy "char *buf" "char *delim" |
| .Sh DESCRIPTION |
| .Fn ipsec_set_policy |
| generates an IPsec policy specification structure, namely |
| .Li struct sadb_x_policy |
| and/or |
| .Li struct sadb_x_ipsecrequest |
| from a human-readable policy specification. |
| The policy specification must be given as a C string |
| .Fa policy |
| and its length |
| .Fa len . |
| .Fn ipsec_set_policy |
| will return a buffer with the corresponding IPsec policy specification structure. |
| The buffer is dynamically allocated, and must be |
| .Xr free 3 Ap d |
| by the caller. |
| .Pp |
| You can get the length of the generated buffer with |
| .Fn ipsec_get_policylen |
| (i.e. for calling |
| .Xr setsockopt 2 ) . |
| .Pp |
| .Fn ipsec_dump_policy |
| converts an IPsec policy structure into human-readable form. |
| Therefore, |
| .Fn ipsec_dump_policy |
| can be regarded as the inverse function to |
| .Fn ipsec_set_policy . |
| .Fa buf |
| points to an IPsec policy structure, |
| .Li struct sadb_x_policy . |
| .Fa delim |
| is a delimiter string, which is usually a blank character. |
| If you set |
| .Fa delim |
| to |
| .Dv NULL , |
| a single whitespace is assumed. |
| .Fn ipsec_dump_policy |
| returns a pointer to a dynamically allocated string. |
| It is the caller's responsibility to |
| .Xr free 3 |
| it. |
| .Pp |
| .Fa policy |
| is formatted as either of the following: |
| .Bl -tag -width "discard" |
| .It Ar direction [priority specification] Li discard |
| .Ar direction |
| must be |
| .Li in , |
| .Li out , |
| or |
| .Li fwd . |
| .Ar direction |
| specifies in which direction the policy needs to be applied. |
| The non-standard direction |
| .Li fwd |
| is substituted with |
| .Li in |
| on platforms which do not support forward policies. |
| .Pp |
| .Ar priority specification |
| is used to control the placement of the policy within the SPD. |
| The policy position is determined by |
| a signed integer where higher priorities indicate the policy is placed |
| closer to the beginning of the list and lower priorities indicate the |
| policy is placed closer to the end of the list. |
| Policies with equal |
| priorities are added at the end of the group of such policies. |
| .Pp |
| Priority can only |
| be specified when libipsec has been compiled against kernel headers that |
| support policy priorities (Linux \*[Gt]= 2.6.6). |
| It takes one of the following formats: |
| .Bl -tag -width "discard" |
| .It Ar {priority,prio} offset |
| .Ar offset |
| is an integer in the range \-2147483647..214783648. |
| .It Ar {priority,prio} base {+,-} offset |
| .Ar base |
| is either |
| .Li low (-1073741824) , |
| .Li def (0) , |
| or |
| .Li high (1073741824) . |
| .Pp |
| .Ar offset |
| is an unsigned integer. |
| It can be up to 1073741824 for |
| positive offsets, and up to 1073741823 for negative offsets. |
| .El |
| .Pp |
| The interpretation of policy priority in these functions and the |
| kernel DOES differ. |
| The relationship between the two can be described as |
| p(kernel) = 0x80000000 - p(func) |
| .Pp |
| With |
| .Li discard |
| policy, packets will be dropped if they match the policy. |
| .It Ar direction [priority specification] Li entrust |
| .Li entrust |
| means to consult the SPD defined by |
| .Xr setkey 8 . |
| .It Ar direction [priority specification] Li bypass |
| .Li bypass |
| means to bypass the IPsec processing. |
| .Pq the packet will be transmitted in clear . |
| This is for privileged sockets. |
| .It Ar direction Bo Ar priority specification Bc Li ipsec Ar request ... |
| .Li ipsec |
| means that the matching packets are subject to IPsec processing. |
| .Li ipsec |
| can be followed by one or more |
| .Ar request |
| strings, which are formatted as below: |
| .Bl -tag -width "discard" |
| .It Ar protocol Li / Ar mode Li / Ar src Li - Ar dst Op Ar /level |
| .Ar protocol |
| is either |
| .Li ah , |
| .Li esp , |
| or |
| .Li ipcomp . |
| .Pp |
| .Ar mode |
| is either |
| .Li transport |
| or |
| .Li tunnel . |
| .Pp |
| .Ar src |
| and |
| .Ar dst |
| specifies the IPsec endpoint. |
| .Ar src |
| always means the |
| .Dq sending node |
| and |
| .Ar dst |
| always means the |
| .Dq receiving node . |
| Therefore, when |
| .Ar direction |
| is |
| .Li in , |
| .Ar dst |
| is this node |
| and |
| .Ar src |
| is the other node |
| .Pq peer . |
| If |
| .Ar mode |
| is |
| .Li transport , |
| Both |
| .Ar src |
| and |
| .Ar dst |
| can be omitted. |
| .Pp |
| .Ar level |
| must be set to one of the following: |
| .Li default , use , require , |
| or |
| .Li unique . |
| .Li default |
| means that the kernel should consult the system default policy |
| defined by |
| .Xr sysctl 8 , |
| such as |
| .Li net.inet.ipsec.esp_trans_deflev . |
| See |
| .Xr ipsec 4 |
| regarding the system default. |
| .Li use |
| means that a relevant SA can be used when available, |
| since the kernel may perform IPsec operation against packets when possible. |
| In this case, packets can be transmitted in clear |
| .Pq when SA is not available , |
| or encrypted |
| .Pq when SA is available . |
| .Li require |
| means that a relevant SA is required, |
| since the kernel must perform IPsec operation against packets. |
| .Li unique |
| is the same as |
| .Li require , |
| but adds the restriction that the SA for outbound traffic is used |
| only for this policy. |
| You may need the identifier in order to relate the policy and the SA |
| when you define the SA by manual keying. |
| You can put the decimal number as the identifier after |
| .Li unique |
| like |
| .Li unique : number . |
| .Li number |
| must be between 1 and 32767 . |
| If the |
| .Ar request |
| string is kept unambiguous, |
| .Ar level |
| and slash prior to |
| .Ar level |
| can be omitted. |
| However, it is encouraged to specify them explicitly |
| to avoid unintended behavior. |
| If |
| .Ar level |
| is omitted, it will be interpreted as |
| .Li default . |
| .El |
| .Pp |
| Note that there are slight differences to the specification of |
| .Xr setkey 8 . |
| In the specification of |
| .Xr setkey 8 , |
| both |
| .Li entrust |
| and |
| .Li bypass |
| are not used. |
| Refer to |
| .Xr setkey 8 |
| for details. |
| .Pp |
| Here are several examples |
| .Pq long lines are wrapped for readability : |
| .Bd -literal -offset indent |
| in discard |
| out ipsec esp/transport//require |
| in ipsec ah/transport//require |
| out ipsec esp/tunnel/10.1.1.2-10.1.1.1/use |
| in ipsec ipcomp/transport//use |
| esp/transport//use |
| .Ed |
| .El |
| .Sh RETURN VALUES |
| .Fn ipsec_set_policy |
| returns a pointer to the allocated buffer with the policy specification |
| if successful; otherwise a |
| .Dv NULL |
| pointer is returned. |
| .Fn ipsec_get_policylen |
| returns a positive value |
| .Pq meaning the buffer size |
| on success, and a negative value on errors. |
| .Fn ipsec_dump_policy |
| returns a pointer to a dynamically allocated region on success, |
| and |
| .Dv NULL |
| on errors. |
| .Sh SEE ALSO |
| .Xr ipsec_strerror 3 , |
| .Xr ipsec 4 , |
| .Xr setkey 8 |
| .Sh HISTORY |
| The functions first appeared in the WIDE/KAME IPv6 protocol stack kit. |