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/* Automatic protocol selection */
  27#define PN_PROTO_TRANSPORT      0
  28/* Phonet datagram socket */
  29#define PN_PROTO_PHONET         1
  30/* Phonet pipe */
  31#define PN_PROTO_PIPE           2
  32#define PHONET_NPROTO           3
  33
  34/* Socket options for SOL_PNPIPE level */
  35#define PNPIPE_ENCAP            1
  36#define PNPIPE_IFINDEX          2
  37
  38#define PNADDR_ANY              0
  39#define PNPORT_RESOURCE_ROUTING 0
  40
  41/* Values for PNPIPE_ENCAP option */
  42#define PNPIPE_ENCAP_NONE       0
  43#define PNPIPE_ENCAP_IP         1
  44
  45/* ioctls */
  46#define SIOCPNGETOBJECT         (SIOCPROTOPRIVATE + 0)
  47
  48/* Phonet protocol header */
  49struct phonethdr {
  50        __u8    pn_rdev;
  51        __u8    pn_sdev;
  52        __u8    pn_res;
  53        __be16  pn_length;
  54        __u8    pn_robj;
  55        __u8    pn_sobj;
  56} __attribute__((packed));
  57
  58/* Common Phonet payload header */
  59struct phonetmsg {
  60        __u8    pn_trans_id;    /* transaction ID */
  61        __u8    pn_msg_id;      /* message type */
  62        union {
  63                struct {
  64                        __u8    pn_submsg_id;   /* message subtype */
  65                        __u8    pn_data[5];
  66                } base;
  67                struct {
  68                        __u16   pn_e_res_id;    /* extended resource ID */
  69                        __u8    pn_e_submsg_id; /* message subtype */
  70                        __u8    pn_e_data[3];
  71                } ext;
  72        } pn_msg_u;
  73};
  74#define PN_COMMON_MESSAGE       0xF0
  75#define PN_COMMGR               0x10
  76#define PN_PREFIX               0xE0 /* resource for extended messages */
  77#define pn_submsg_id            pn_msg_u.base.pn_submsg_id
  78#define pn_e_submsg_id          pn_msg_u.ext.pn_e_submsg_id
  79#define pn_e_res_id             pn_msg_u.ext.pn_e_res_id
  80#define pn_data                 pn_msg_u.base.pn_data
  81#define pn_e_data               pn_msg_u.ext.pn_e_data
  82
  83/* data for unreachable errors */
  84#define PN_COMM_SERVICE_NOT_IDENTIFIED_RESP     0x01
  85#define PN_COMM_ISA_ENTITY_NOT_REACHABLE_RESP   0x14
  86#define pn_orig_msg_id          pn_data[0]
  87#define pn_status               pn_data[1]
  88#define pn_e_orig_msg_id        pn_e_data[0]
  89#define pn_e_status             pn_e_data[1]
  90
  91/* Phonet socket address structure */
  92struct sockaddr_pn {
  93        sa_family_t spn_family;
  94        __u8 spn_obj;
  95        __u8 spn_dev;
  96        __u8 spn_resource;
  97        __u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - 3];
  98} __attribute__ ((packed));
  99
 100static inline __u16 pn_object(__u8 addr, __u16 port)
 101{
 102        return (addr << 8) | (port & 0x3ff);
 103}
 104
 105static inline __u8 pn_obj(__u16 handle)
 106{
 107        return handle & 0xff;
 108}
 109
 110static inline __u8 pn_dev(__u16 handle)
 111{
 112        return handle >> 8;
 113}
 114
 115static inline __u16 pn_port(__u16 handle)
 116{
 117        return handle & 0x3ff;
 118}
 119
 120static inline __u8 pn_addr(__u16 handle)
 121{
 122        return (handle >> 8) & 0xfc;
 123}
 124
 125static inline void pn_sockaddr_set_addr(struct sockaddr_pn *spn, __u8 addr)
 126{
 127        spn->spn_dev &= 0x03;
 128        spn->spn_dev |= addr & 0xfc;
 129}
 130
 131static inline void pn_sockaddr_set_port(struct sockaddr_pn *spn, __u16 port)
 132{
 133        spn->spn_dev &= 0xfc;
 134        spn->spn_dev |= (port >> 8) & 0x03;
 135        spn->spn_obj = port & 0xff;
 136}
 137
 138static inline void pn_sockaddr_set_object(struct sockaddr_pn *spn,
 139                                                __u16 handle)
 140{
 141        spn->spn_dev = pn_dev(handle);
 142        spn->spn_obj = pn_obj(handle);
 143}
 144
 145static inline void pn_sockaddr_set_resource(struct sockaddr_pn *spn,
 146                                                __u8 resource)
 147{
 148        spn->spn_resource = resource;
 149}
 150
 151static inline __u8 pn_sockaddr_get_addr(const struct sockaddr_pn *spn)
 152{
 153        return spn->spn_dev & 0xfc;
 154}
 155
 156static inline __u16 pn_sockaddr_get_port(const struct sockaddr_pn *spn)
 157{
 158        return ((spn->spn_dev & 0x03) << 8) | spn->spn_obj;
 159}
 160
 161static inline __u16 pn_sockaddr_get_object(const struct sockaddr_pn *spn)
 162{
 163        return pn_object(spn->spn_dev, spn->spn_obj);
 164}
 165
 166static inline __u8 pn_sockaddr_get_resource(const struct sockaddr_pn *spn)
 167{
 168        return spn->spn_resource;
 169}
 170
 171#endif
 172
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.