12b27bdccSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
29995a32bSRémi Denis-Courmont /*
39995a32bSRémi Denis-Courmont * File: pep.h
49995a32bSRémi Denis-Courmont *
59995a32bSRémi Denis-Courmont * Phonet Pipe End Point sockets definitions
69995a32bSRémi Denis-Courmont *
79995a32bSRémi Denis-Courmont * Copyright (C) 2008 Nokia Corporation.
89995a32bSRémi Denis-Courmont */
99995a32bSRémi Denis-Courmont
109995a32bSRémi Denis-Courmont #ifndef NET_PHONET_PEP_H
119995a32bSRémi Denis-Courmont #define NET_PHONET_PEP_H
129995a32bSRémi Denis-Courmont
13*949d6b40SJakub Kicinski #include <linux/skbuff.h>
14*949d6b40SJakub Kicinski #include <net/phonet/phonet.h>
15*949d6b40SJakub Kicinski
169995a32bSRémi Denis-Courmont struct pep_sock {
179995a32bSRémi Denis-Courmont struct pn_sock pn_sk;
189995a32bSRémi Denis-Courmont
199641458dSRémi Denis-Courmont /* XXX: union-ify listening vs connected stuff ? */
209995a32bSRémi Denis-Courmont /* Listening socket stuff: */
219641458dSRémi Denis-Courmont struct hlist_head hlist;
229995a32bSRémi Denis-Courmont
239995a32bSRémi Denis-Courmont /* Connected socket stuff: */
249641458dSRémi Denis-Courmont struct sock *listener;
25c41bd97fSRémi Denis-Courmont struct sk_buff_head ctrlreq_queue;
26c41bd97fSRémi Denis-Courmont #define PNPIPE_CTRLREQ_MAX 10
27be677730SRémi Denis-Courmont atomic_t tx_credits;
2802a47617SRémi Denis-Courmont int ifindex;
299641458dSRémi Denis-Courmont u16 peer_type; /* peer type/subtype */
309641458dSRémi Denis-Courmont u8 pipe_handle;
319641458dSRémi Denis-Courmont
329641458dSRémi Denis-Courmont u8 rx_credits;
339641458dSRémi Denis-Courmont u8 rx_fc; /* RX flow control */
349641458dSRémi Denis-Courmont u8 tx_fc; /* TX flow control */
359641458dSRémi Denis-Courmont u8 init_enable; /* auto-enable at creation */
36fea93eceSRémi Denis-Courmont u8 aligned;
379995a32bSRémi Denis-Courmont };
389995a32bSRémi Denis-Courmont
pep_sk(struct sock * sk)399995a32bSRémi Denis-Courmont static inline struct pep_sock *pep_sk(struct sock *sk)
409995a32bSRémi Denis-Courmont {
419995a32bSRémi Denis-Courmont return (struct pep_sock *)sk;
429995a32bSRémi Denis-Courmont }
439995a32bSRémi Denis-Courmont
449995a32bSRémi Denis-Courmont extern const struct proto_ops phonet_stream_ops;
459995a32bSRémi Denis-Courmont
469641458dSRémi Denis-Courmont /* Pipe protocol definitions */
479641458dSRémi Denis-Courmont struct pnpipehdr {
489641458dSRémi Denis-Courmont u8 utid; /* transaction ID */
499641458dSRémi Denis-Courmont u8 message_id;
509641458dSRémi Denis-Courmont u8 pipe_handle;
519641458dSRémi Denis-Courmont union {
529641458dSRémi Denis-Courmont u8 state_after_connect; /* connect request */
539641458dSRémi Denis-Courmont u8 state_after_reset; /* reset request */
549641458dSRémi Denis-Courmont u8 error_code; /* any response */
559641458dSRémi Denis-Courmont u8 pep_type; /* status indication */
566321aa19SArnd Bergmann u8 data0; /* anything else */
579641458dSRémi Denis-Courmont };
586321aa19SArnd Bergmann u8 data[];
599641458dSRémi Denis-Courmont };
606321aa19SArnd Bergmann #define other_pep_type data[0]
619641458dSRémi Denis-Courmont
pnp_hdr(struct sk_buff * skb)629641458dSRémi Denis-Courmont static inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb)
639641458dSRémi Denis-Courmont {
649641458dSRémi Denis-Courmont return (struct pnpipehdr *)skb_transport_header(skb);
659641458dSRémi Denis-Courmont }
669641458dSRémi Denis-Courmont
679641458dSRémi Denis-Courmont #define MAX_PNPIPE_HEADER (MAX_PHONET_HEADER + 4)
689641458dSRémi Denis-Courmont
699641458dSRémi Denis-Courmont enum {
706482f554SRémi Denis-Courmont PNS_PIPE_CREATE_REQ = 0x00,
716482f554SRémi Denis-Courmont PNS_PIPE_CREATE_RESP,
726482f554SRémi Denis-Courmont PNS_PIPE_REMOVE_REQ,
736482f554SRémi Denis-Courmont PNS_PIPE_REMOVE_RESP,
746482f554SRémi Denis-Courmont
759641458dSRémi Denis-Courmont PNS_PIPE_DATA = 0x20,
76fc6a1107SRémi Denis-Courmont PNS_PIPE_ALIGNED_DATA,
779641458dSRémi Denis-Courmont
789641458dSRémi Denis-Courmont PNS_PEP_CONNECT_REQ = 0x40,
799641458dSRémi Denis-Courmont PNS_PEP_CONNECT_RESP,
809641458dSRémi Denis-Courmont PNS_PEP_DISCONNECT_REQ,
819641458dSRémi Denis-Courmont PNS_PEP_DISCONNECT_RESP,
829641458dSRémi Denis-Courmont PNS_PEP_RESET_REQ,
839641458dSRémi Denis-Courmont PNS_PEP_RESET_RESP,
849641458dSRémi Denis-Courmont PNS_PEP_ENABLE_REQ,
859641458dSRémi Denis-Courmont PNS_PEP_ENABLE_RESP,
869641458dSRémi Denis-Courmont PNS_PEP_CTRL_REQ,
879641458dSRémi Denis-Courmont PNS_PEP_CTRL_RESP,
889641458dSRémi Denis-Courmont PNS_PEP_DISABLE_REQ = 0x4C,
899641458dSRémi Denis-Courmont PNS_PEP_DISABLE_RESP,
909641458dSRémi Denis-Courmont
919641458dSRémi Denis-Courmont PNS_PEP_STATUS_IND = 0x60,
929641458dSRémi Denis-Courmont PNS_PIPE_CREATED_IND,
939641458dSRémi Denis-Courmont PNS_PIPE_RESET_IND = 0x63,
949641458dSRémi Denis-Courmont PNS_PIPE_ENABLED_IND,
959641458dSRémi Denis-Courmont PNS_PIPE_REDIRECTED_IND,
969641458dSRémi Denis-Courmont PNS_PIPE_DISABLED_IND = 0x66,
979641458dSRémi Denis-Courmont };
989641458dSRémi Denis-Courmont
999641458dSRémi Denis-Courmont #define PN_PIPE_INVALID_HANDLE 0xff
1009641458dSRémi Denis-Courmont #define PN_PEP_TYPE_COMMON 0x00
1019641458dSRémi Denis-Courmont
1029641458dSRémi Denis-Courmont /* Phonet pipe status indication */
1039641458dSRémi Denis-Courmont enum {
1049641458dSRémi Denis-Courmont PN_PEP_IND_FLOW_CONTROL,
1059641458dSRémi Denis-Courmont PN_PEP_IND_ID_MCFC_GRANT_CREDITS,
1069641458dSRémi Denis-Courmont };
1079641458dSRémi Denis-Courmont
1089641458dSRémi Denis-Courmont /* Phonet pipe error codes */
1099641458dSRémi Denis-Courmont enum {
1109641458dSRémi Denis-Courmont PN_PIPE_NO_ERROR,
1119641458dSRémi Denis-Courmont PN_PIPE_ERR_INVALID_PARAM,
1129641458dSRémi Denis-Courmont PN_PIPE_ERR_INVALID_HANDLE,
1139641458dSRémi Denis-Courmont PN_PIPE_ERR_INVALID_CTRL_ID,
1149641458dSRémi Denis-Courmont PN_PIPE_ERR_NOT_ALLOWED,
1159641458dSRémi Denis-Courmont PN_PIPE_ERR_PEP_IN_USE,
1169641458dSRémi Denis-Courmont PN_PIPE_ERR_OVERLOAD,
1179641458dSRémi Denis-Courmont PN_PIPE_ERR_DEV_DISCONNECTED,
1189641458dSRémi Denis-Courmont PN_PIPE_ERR_TIMEOUT,
1199641458dSRémi Denis-Courmont PN_PIPE_ERR_ALL_PIPES_IN_USE,
1209641458dSRémi Denis-Courmont PN_PIPE_ERR_GENERAL,
1219641458dSRémi Denis-Courmont PN_PIPE_ERR_NOT_SUPPORTED,
1229641458dSRémi Denis-Courmont };
1239641458dSRémi Denis-Courmont
1249641458dSRémi Denis-Courmont /* Phonet pipe states */
1259641458dSRémi Denis-Courmont enum {
1269641458dSRémi Denis-Courmont PN_PIPE_DISABLE,
1279641458dSRémi Denis-Courmont PN_PIPE_ENABLE,
1289641458dSRémi Denis-Courmont };
1299641458dSRémi Denis-Courmont
1309641458dSRémi Denis-Courmont /* Phonet pipe sub-block types */
1319641458dSRémi Denis-Courmont enum {
1329641458dSRémi Denis-Courmont PN_PIPE_SB_CREATE_REQ_PEP_SUB_TYPE,
1339641458dSRémi Denis-Courmont PN_PIPE_SB_CONNECT_REQ_PEP_SUB_TYPE,
1349641458dSRémi Denis-Courmont PN_PIPE_SB_REDIRECT_REQ_PEP_SUB_TYPE,
1359641458dSRémi Denis-Courmont PN_PIPE_SB_NEGOTIATED_FC,
1369641458dSRémi Denis-Courmont PN_PIPE_SB_REQUIRED_FC_TX,
1379641458dSRémi Denis-Courmont PN_PIPE_SB_PREFERRED_FC_RX,
138fea93eceSRémi Denis-Courmont PN_PIPE_SB_ALIGNED_DATA,
1399641458dSRémi Denis-Courmont };
1409641458dSRémi Denis-Courmont
1419641458dSRémi Denis-Courmont /* Phonet pipe flow control models */
1429641458dSRémi Denis-Courmont enum {
1439641458dSRémi Denis-Courmont PN_NO_FLOW_CONTROL,
1449641458dSRémi Denis-Courmont PN_LEGACY_FLOW_CONTROL,
1459641458dSRémi Denis-Courmont PN_ONE_CREDIT_FLOW_CONTROL,
1469641458dSRémi Denis-Courmont PN_MULTI_CREDIT_FLOW_CONTROL,
1478f44fcc7SRémi Denis-Courmont PN_MAX_FLOW_CONTROL,
1489641458dSRémi Denis-Courmont };
1499641458dSRémi Denis-Courmont
1509641458dSRémi Denis-Courmont #define pn_flow_safe(fc) ((fc) >> 1)
1519641458dSRémi Denis-Courmont
1529641458dSRémi Denis-Courmont /* Phonet pipe flow control states */
1539641458dSRémi Denis-Courmont enum {
1549641458dSRémi Denis-Courmont PEP_IND_EMPTY,
1559641458dSRémi Denis-Courmont PEP_IND_BUSY,
1569641458dSRémi Denis-Courmont PEP_IND_READY,
1579641458dSRémi Denis-Courmont };
1589641458dSRémi Denis-Courmont
1599995a32bSRémi Denis-Courmont #endif
160