1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* File: pep.h
*
* Phonet Pipe End Point sockets definitions
*
* Copyright (C) 2008 Nokia Corporation.
*/
#ifndef NET_PHONET_PEP_H
#define NET_PHONET_PEP_H
#include <linux/skbuff.h>
#include <net/phonet/phonet.h>
struct pep_sock {
struct pn_sock pn_sk;
/* XXX: union-ify listening vs connected stuff ? */
/* Listening socket stuff: */
struct hlist_head hlist;
/* Connected socket stuff: */
struct sock *listener;
struct sk_buff_head ctrlreq_queue;
#define PNPIPE_CTRLREQ_MAX 10
atomic_t tx_credits;
int ifindex;
u16 peer_type; /* peer type/subtype */
u8 pipe_handle;
u8 rx_credits;
u8 rx_fc; /* RX flow control */
u8 tx_fc; /* TX flow control */
u8 init_enable; /* auto-enable at creation */
u8 aligned;
};
static inline struct pep_sock *pep_sk(struct sock *sk)
{
return (struct pep_sock *)sk;
}
extern const struct proto_ops phonet_stream_ops;
/* Pipe protocol definitions */
struct pnpipehdr {
u8 utid; /* transaction ID */
u8 message_id;
u8 pipe_handle;
union {
u8 state_after_connect; /* connect request */
u8 state_after_reset; /* reset request */
u8 error_code; /* any response */
u8 pep_type; /* status indication */
u8 data0; /* anything else */
};
u8 data[];
};
#define other_pep_type data[0]
static inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb)
{
return (struct pnpipehdr *)skb_transport_header(skb);
}
#define MAX_PNPIPE_HEADER (MAX_PHONET_HEADER + 4)
enum {
PNS_PIPE_CREATE_REQ = 0x00,
PNS_PIPE_CREATE_RESP,
PNS_PIPE_REMOVE_REQ,
PNS_PIPE_REMOVE_RESP,
PNS_PIPE_DATA = 0x20,
PNS_PIPE_ALIGNED_DATA,
PNS_PEP_CONNECT_REQ = 0x40,
PNS_PEP_CONNECT_RESP,
PNS_PEP_DISCONNECT_REQ,
PNS_PEP_DISCONNECT_RESP,
PNS_PEP_RESET_REQ,
PNS_PEP_RESET_RESP,
PNS_PEP_ENABLE_REQ,
PNS_PEP_ENABLE_RESP,
PNS_PEP_CTRL_REQ,
PNS_PEP_CTRL_RESP,
PNS_PEP_DISABLE_REQ = 0x4C,
PNS_PEP_DISABLE_RESP,
PNS_PEP_STATUS_IND = 0x60,
PNS_PIPE_CREATED_IND,
PNS_PIPE_RESET_IND = 0x63,
PNS_PIPE_ENABLED_IND,
PNS_PIPE_REDIRECTED_IND,
PNS_PIPE_DISABLED_IND = 0x66,
};
#define PN_PIPE_INVALID_HANDLE 0xff
#define PN_PEP_TYPE_COMMON 0x00
/* Phonet pipe status indication */
enum {
PN_PEP_IND_FLOW_CONTROL,
PN_PEP_IND_ID_MCFC_GRANT_CREDITS,
};
/* Phonet pipe error codes */
enum {
PN_PIPE_NO_ERROR,
PN_PIPE_ERR_INVALID_PARAM,
PN_PIPE_ERR_INVALID_HANDLE,
PN_PIPE_ERR_INVALID_CTRL_ID,
PN_PIPE_ERR_NOT_ALLOWED,
PN_PIPE_ERR_PEP_IN_USE,
PN_PIPE_ERR_OVERLOAD,
PN_PIPE_ERR_DEV_DISCONNECTED,
PN_PIPE_ERR_TIMEOUT,
PN_PIPE_ERR_ALL_PIPES_IN_USE,
PN_PIPE_ERR_GENERAL,
PN_PIPE_ERR_NOT_SUPPORTED,
};
/* Phonet pipe states */
enum {
PN_PIPE_DISABLE,
PN_PIPE_ENABLE,
};
/* Phonet pipe sub-block types */
enum {
PN_PIPE_SB_CREATE_REQ_PEP_SUB_TYPE,
PN_PIPE_SB_CONNECT_REQ_PEP_SUB_TYPE,
PN_PIPE_SB_REDIRECT_REQ_PEP_SUB_TYPE,
PN_PIPE_SB_NEGOTIATED_FC,
PN_PIPE_SB_REQUIRED_FC_TX,
PN_PIPE_SB_PREFERRED_FC_RX,
PN_PIPE_SB_ALIGNED_DATA,
};
/* Phonet pipe flow control models */
enum {
PN_NO_FLOW_CONTROL,
PN_LEGACY_FLOW_CONTROL,
PN_ONE_CREDIT_FLOW_CONTROL,
PN_MULTI_CREDIT_FLOW_CONTROL,
PN_MAX_FLOW_CONTROL,
};
#define pn_flow_safe(fc) ((fc) >> 1)
/* Phonet pipe flow control states */
enum {
PEP_IND_EMPTY,
PEP_IND_BUSY,
PEP_IND_READY,
};
#endif
|