---
name: "pipex"
section: "4"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["openbsd"]
url: "https://new.carta.tech/pipex"
---

# pipex(4)

PPP IP EXtension to handle IP/PPP frames in-kernel

## NAME

**pipex** – PPP IP EXtension to handle IP/PPP frames in-kernel

## SYNOPSIS

**option PIPEX**

**#include \<sys/types.h\>**

**#include \<sys/socket.h\>**

**#include \<sys/ioctl.h\>**

**#include \<net/if.h\>**

**#include \<net/pipex.h\>**

## DESCRIPTION

**pipex** is used with pppac(4) and [pppx(4)](/pppx/4.md), and handles PPP frames and forwards IP packets in-kernel. It accelerates the performance of packet forwarding, because it reduces copying of packets between kernel and userland. **pipex** is disabled by default. To enable it, set *net.pipex.enable* to ‘1’ using [sysctl(8)](/sysctl/8.md).

**pipex** adds some extensions to the [ioctl(2)](/ioctl/2.md) requests to pppac(4) or [pppx(4)](/pppx/4.md) devices. The added requests are as follows:

- PIPEXASESSION *struct pipex\_session\_req \**

  Add a new PPP session to be handled by **pipex**. The status of the session is passed as a *pipex\_session\_req* structure. The *pipex\_session\_req* structure has the following definition:

  ```
  struct pipex_session_req {
      int         pr_protocol;         /* tunnel protocol  */
  #define PIPEX_PROTO_L2TP   1         /* protocol L2TP */
  #define PIPEX_PROTO_PPTP   2         /* protocol PPTP */
  #define PIPEX_PROTO_PPPOE  3         /* protocol PPPoE */
      uint16_t    pr_session_id;       /* session-id */
      uint16_t    pr_peer_session_id;  /* peer's session-id */
      uint32_t    pr_ppp_flags;        /* ppp configuration flags */
  #define PIPEX_PPP_ACFC_ACCEPTED  0x0001 /* ACFC accepted */
  #define PIPEX_PPP_PFC_ACCEPTED   0x0002 /* PFC accepted */
  #define PIPEX_PPP_ACFC_ENABLED   0x0004 /* ACFC enabled */
  #define PIPEX_PPP_PFC_ENABLED    0x0008 /* PFC enabled */
  #define PIPEX_PPP_MPPE_ACCEPTED  0x0010 /* MPPE accepted */
  #define PIPEX_PPP_MPPE_ENABLED   0x0020 /* MPPE enabled */
  #define PIPEX_PPP_MPPE_REQUIRED  0x0040 /* MPPE is required */
  #define PIPEX_PPP_HAS_ACF        0x0080 /* has ACF */
  #define PIPEX_PPP_ADJUST_TCPMSS  0x0100 /* do tcpmss adjustment */
  #define PIPEX_PPP_INGRESS_FILTER 0x0200 /* do ingress filter */
      int8_t      pr_ccp_id;           /* ccp current packet id */
      int         pr_ppp_id;           /* ppp id. */
      uint16_t    pr_peer_mru;         /* peer's mru */
      uint16_t    pr_timeout_sec;      /* idle timer */
      struct in_addr      pr_ip_srcaddr;    /* local IP address */
      struct in_addr      pr_ip_address;    /* framed IP address */
      struct in_addr      pr_ip_netmask;    /* framed IP netmask */
      struct sockaddr_in6 pr_ip6_address;   /* framed IPv6 address */
      int                 pr_ip6_prefixlen; /* framed IPv6 prefix
                                               length */
      union {
          struct {
              uint32_t snd_nxt;         /* send next */
              uint32_t rcv_nxt;         /* receive next */
              uint32_t snd_una;         /* unacked */
              uint32_t rcv_acked;       /* recv acked */
              int winsz;                /* window size */
              int maxwinsz;             /* max window size */
              int peer_maxwinsz;        /* peer's max window size */
          } pptp;
          struct {
              /* select protocol options: 1 for enable */
              uint32_t option_flags;
      #define PIPEX_L2TP_USE_SEQUENCING  0x00000001
                                        /* use sequence number
  					 on L2TP data messages */
              uint16_t tunnel_id;       /* our tunnel-id */
              uint16_t peer_tunnel_id;  /* peer's tunnel-id */
              uint32_t ns_nxt;          /* send next */
              uint32_t nr_nxt;          /* receive next */
              uint32_t ns_una;          /* unacked */
              uint32_t nr_acked;        /* recv acked */
              uint32_t ipsecflowinfo;   /* IPsec flow id for NAT-T */
          } l2tp;
          struct {
              char over_ifname[IF_NAMESIZE];
                                        /* ethernet ifname */
          } pppoe;
      } pr_proto;
      struct sockaddr_storage  pr_peer_address;
                                        /* peer address of tunnel */
      struct sockaddr_storage  pr_local_address;
  				      /* our address of tunnel */
      struct pipex_mppe_req    pr_mppe_recv;
  				      /* mppe key for receive */
      struct pipex_mppe_req    pr_mppe_send;
  				      /* mppe key for send */
  };
  ```

  The *pipex\_mppe\_req* structure that was used by *pr\_mppe\_recv* and *pr\_mppe\_send* has the following definition:

  ```
  struct pipex_mppe_req {
      int16_t  stateless;            /* mppe key mode.
                                        1 for stateless */
      int16_t  keylenbits;           /* mppe key length(in bits)*/
      u_char   master_key[PIPEX_MPPE_KEYLEN];
                                     /* mppe master key */
  };
  ```

- PIPEXDSESSION *struct pipex\_session\_close\_req \**

  Delete the specified session from the kernel. Specify the session using a *pipex\_session\_close\_req* structure, which has the following definition:

  ```
  struct pipex_session_close_req {
      int                      psr_protocol;   /* tunnel protocol */
      uint16_t                 psr_session_id; /* session-id */
      struct pipex_statistics  psr_stat;       /* statistics */
  };
  ```

  The *psr\_protocol* and *psr\_session\_id* fields used to specify the session are mandatory. On successful return, the *psr\_stat* field is filled by the kernel. See PIPEXGSTAT section for a description of the *pipex\_statistics* structure.

- PIPEXGSTAT *struct pipex\_session\_stat\_req \**

  Get statistics for the specified session. Specify the session using a *pipex\_session\_stat\_req* structure, which has the following definition:

  ```
  struct pipex_session_stat_req {
      int                      psr_protocol;   /* tunnel protocol */
      uint16_t                 psr_session_id; /* session-id */
      struct pipex_statistics  psr_stat;       /* statistics */
  };
  ```

  The *psr\_protocol* and *psr\_session\_id* fields used to specify the session are mandatory. On successful return, the *psr\_stat* field is filled by the kernel. The *pipex\_statistics* structure has the following definition:

  ```
  struct pipex_statistics {
      uint32_t ipackets;   /* packets received from tunnel */
      uint32_t ierrors;    /* error packets received from tunnel */
      uint64_t ibytes;     /* number of received bytes from tunnel */
      uint32_t opackets;   /* packets sent to tunnel */
      uint32_t oerrors;    /* error packets on sending to tunnel */
      uint64_t obytes;     /* number of sent bytes to tunnel */
      uint32_t idle_time;  /* idle time in seconds */
  };
  ```

- PIPEXGCLOSED *struct pipex\_session\_list\_req \**

  Get a list of closed sessions. **pipex** reserves closed sessions for 30 seconds for userland programs to get statistical information. On successful return, the *pipex\_session\_list\_req* structure is filled by the kernel. The structure has the following definition.

  ```
  struct pipex_session_list_req {
      uint8_t  plr_flags;
  #define PIPEX_LISTREQ_MORE         0x01      /* has more session */
      int      plr_ppp_id_count;               /* count of PPP id */
      int      plr_ppp_id[PIPEX_MAX_LISTREQ];  /* PPP id */
  };
  ```

- PIPEXSIFDESCR *struct pipex\_session\_descr\_req \**

  Set the [pppx(4)](/pppx/4.md) interface's description of the session. This command doesn't work on pppac(4) devices. Specify the session and its description using a *pipex\_session\_descr\_req* structure, which has the following definition:

  ```
  struct pipex_session_descr_req {
      int       pdr_protocol;           /* tunnel protocol */
      uint16_t  pdr_session_id;         /* session-id */
      char      pdr_descr[IFDESCRSIZE]; /* description */
  };
  ```

## SEE ALSO

[ioctl(2)](/ioctl/2.md), pppac(4), [pppx(4)](/pppx/4.md), [npppd(8)](/npppd/8.md), [sysctl(8)](/sysctl/8.md)

## AUTHORS

The **pipex** was written by Internet Initiative Japan Inc.

## BUGS

[pppx(4)](/pppx/4.md) does not allow sessions with **pr\_timeout\_sec** set to any value other than 0.
