linux/include/linux/phonet.h
<<
>>
Prefs
   1/**
   2 * file phonet.h
   3 *
   4 * Phonet sockets kernel interface
   5 *
   6 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * version 2 as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20 * 02110-1301 USA
  21 */
  22
  23#ifndef LINUX_PHONET_H
  24#define LINUX_PHONET_H
  25
  26#include <linux/types.h>
  27
  28/* Automatic protocol selection */
  29#define PN_PROTO_TRANSPORT      0
  30/* Phonet datagram socket */
  31#define PN_PROTO_PHONET         1
  32/* Phonet pipe */
  33#define PN_PROTO_PIPE           2
  34#define PHONET_NPROTO           3
  35
  36/* Socket options for SOL_PNPIPE level */
  37#define PNPIPE_ENCAP            1
  38#define PNPIPE_IFINDEX          2
  39
  40#define PNADDR_ANY              0
  41#define PNPORT_RESOURCE_ROUTING 0
  42
  43/* Values for PNPIPE_ENCAP option */
  44#define PNPIPE_ENCAP_NONE       0
  45#define PNPIPE_ENCAP_IP         1
  46
  47/* ioctls */
  48#define SIOCPNGETOBJECT         (SIOCPROTOPRIVATE + 0)
  49
  50/* Phonet protocol header */
  51struct phonethdr {
  52        __u8    pn_rdev;
  53        __u8    pn_sdev;
  54        __u8    pn_res;
  55        __be16  pn_length;
  56        __u8    pn_robj;
  57        __u8    pn_sobj;
  58} __attribute__((packed));
  59
  60/* Common Phonet payload header */
  61struct phonetmsg {
  62        __u8    pn_trans_id;    /* transaction ID */
  63        __u8    pn_msg_id;      /* message type */
  64        union {
  65                struct {
  66                        __u8    pn_submsg_id;   /* message subtype */
  67                        __u8    pn_data[5];
  68                } base;
  69                struct {
  70                        __u16   pn_e_res_id;    /* extended resource ID */
  71                        __u8    pn_e_submsg_id; /* message subtype */
  72                        __u8    pn_e_data[3];
  73                } ext;
  74        } pn_msg_u;
  75};
  76#define PN_COMMON_MESSAGE       0xF0
  77#define PN_COMMGR               0x10
  78#define PN_PREFIX               0xE0 /* resource for extended messages */
  79#define pn_submsg_id            pn_msg_u.base.pn_submsg_id
  80#define pn_e_submsg_id          pn_msg_u.ext.pn_e_submsg_id
  81#define pn_e_res_id             pn_msg_u.ext.pn_e_res_id
  82#define pn_data                 pn_msg_u.base.pn_data
  83#define pn_e_data               pn_msg_u.ext.pn_e_data
  84
  85/* data for unreachable errors */
  86#define PN_COMM_SERVICE_NOT_IDENTIFIED_RESP     0x01
  87#define PN_COMM_ISA_ENTITY_NOT_REACHABLE_RESP   0x14
  88#define pn_orig_msg_id          pn_data[0]
  89#define pn_status               pn_data[1]
  90#define pn_e_orig_msg_id        pn_e_data[0]
  91#define pn_e_status             pn_e_data[1]
  92
  93/* Phonet socket address structure */
  94struct sockaddr_pn {
  95        sa_family_t spn_family;
  96        __u8 spn_obj;
  97        __u8 spn_dev;
  98        __u8 spn_resource;
  99        __u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - 3];
 100} __attribute__ ((packed));
 101
 102static inline __u16 pn_object(__u8 addr, __u16 port)
 103{
 104        return (addr << 8) | (port & 0x3ff);
 105}
 106
 107static inline __u8 pn_obj(__u16 handle)
 108{
 109        return handle & 0xff;
 110}
 111
 112static inline __u8 pn_dev(__u16 handle)
 113{
 114        return handle >> 8;
 115}
 116
 117static inline __u16 pn_port(__u16 handle)
 118{
 119        return handle & 0x3ff;
 120}
 121
 122static inline __u8 pn_addr(__u16 handle)
 123{
 124        return (handle >> 8) & 0xfc;
 125}
 126
 127static inline void pn_sockaddr_set_addr(struct sockaddr_pn *spn, __u8 addr)
 128{
 129        spn->spn_dev &= 0x03;
 130        spn->spn_dev |= addr & 0xfc;
 131}
 132
 133static inline void pn_sockaddr_set_port(struct sockaddr_pn *spn, __u16 port)
 134{
 135        spn->spn_dev &= 0xfc;
 136        spn->spn_dev |= (port >> 8) & 0x03;
 137        spn->spn_obj = port & 0xff;
 138}
 139
 140static inline void pn_sockaddr_set_object(struct sockaddr_pn *spn,
 141                                                __u16 handle)
 142{
 143        spn->spn_dev = pn_dev(handle);
 144        spn->spn_obj = pn_obj(handle);
 145}
 146
 147static inline void pn_sockaddr_set_resource(struct sockaddr_pn *spn,
 148                                                __u8 resource)
 149{
 150        spn->spn_resource = resource;
 151}
 152
 153static inline __u8 pn_sockaddr_get_addr(const struct sockaddr_pn *spn)
 154{
 155        return spn->spn_dev & 0xfc;
 156}
 157
 158static inline __u16 pn_sockaddr_get_port(const struct sockaddr_pn *spn)
 159{
 160        return ((spn->spn_dev & 0x03) << 8) | spn->spn_obj;
 161}
 162
 163static inline __u16 pn_sockaddr_get_object(const struct sockaddr_pn *spn)
 164{
 165        return pn_object(spn->spn_dev, spn->spn_obj);
 166}
 167
 168static inline __u8 pn_sockaddr_get_resource(const struct sockaddr_pn *spn)
 169{
 170        return spn->spn_resource;
 171}
 172
 173#endif
 174