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