18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * File: pep.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Phonet Pipe End Point sockets definitions 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2008 Nokia Corporation. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef NET_PHONET_PEP_H 118c2ecf20Sopenharmony_ci#define NET_PHONET_PEP_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistruct pep_sock { 148c2ecf20Sopenharmony_ci struct pn_sock pn_sk; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci /* XXX: union-ify listening vs connected stuff ? */ 178c2ecf20Sopenharmony_ci /* Listening socket stuff: */ 188c2ecf20Sopenharmony_ci struct hlist_head hlist; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci /* Connected socket stuff: */ 218c2ecf20Sopenharmony_ci struct sock *listener; 228c2ecf20Sopenharmony_ci struct sk_buff_head ctrlreq_queue; 238c2ecf20Sopenharmony_ci#define PNPIPE_CTRLREQ_MAX 10 248c2ecf20Sopenharmony_ci atomic_t tx_credits; 258c2ecf20Sopenharmony_ci int ifindex; 268c2ecf20Sopenharmony_ci u16 peer_type; /* peer type/subtype */ 278c2ecf20Sopenharmony_ci u8 pipe_handle; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci u8 rx_credits; 308c2ecf20Sopenharmony_ci u8 rx_fc; /* RX flow control */ 318c2ecf20Sopenharmony_ci u8 tx_fc; /* TX flow control */ 328c2ecf20Sopenharmony_ci u8 init_enable; /* auto-enable at creation */ 338c2ecf20Sopenharmony_ci u8 aligned; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic inline struct pep_sock *pep_sk(struct sock *sk) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci return (struct pep_sock *)sk; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciextern const struct proto_ops phonet_stream_ops; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci/* Pipe protocol definitions */ 448c2ecf20Sopenharmony_cistruct pnpipehdr { 458c2ecf20Sopenharmony_ci u8 utid; /* transaction ID */ 468c2ecf20Sopenharmony_ci u8 message_id; 478c2ecf20Sopenharmony_ci u8 pipe_handle; 488c2ecf20Sopenharmony_ci union { 498c2ecf20Sopenharmony_ci u8 state_after_connect; /* connect request */ 508c2ecf20Sopenharmony_ci u8 state_after_reset; /* reset request */ 518c2ecf20Sopenharmony_ci u8 error_code; /* any response */ 528c2ecf20Sopenharmony_ci u8 pep_type; /* status indication */ 538c2ecf20Sopenharmony_ci u8 data0; /* anything else */ 548c2ecf20Sopenharmony_ci }; 558c2ecf20Sopenharmony_ci u8 data[]; 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci#define other_pep_type data[0] 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb) 608c2ecf20Sopenharmony_ci{ 618c2ecf20Sopenharmony_ci return (struct pnpipehdr *)skb_transport_header(skb); 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#define MAX_PNPIPE_HEADER (MAX_PHONET_HEADER + 4) 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cienum { 678c2ecf20Sopenharmony_ci PNS_PIPE_CREATE_REQ = 0x00, 688c2ecf20Sopenharmony_ci PNS_PIPE_CREATE_RESP, 698c2ecf20Sopenharmony_ci PNS_PIPE_REMOVE_REQ, 708c2ecf20Sopenharmony_ci PNS_PIPE_REMOVE_RESP, 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci PNS_PIPE_DATA = 0x20, 738c2ecf20Sopenharmony_ci PNS_PIPE_ALIGNED_DATA, 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci PNS_PEP_CONNECT_REQ = 0x40, 768c2ecf20Sopenharmony_ci PNS_PEP_CONNECT_RESP, 778c2ecf20Sopenharmony_ci PNS_PEP_DISCONNECT_REQ, 788c2ecf20Sopenharmony_ci PNS_PEP_DISCONNECT_RESP, 798c2ecf20Sopenharmony_ci PNS_PEP_RESET_REQ, 808c2ecf20Sopenharmony_ci PNS_PEP_RESET_RESP, 818c2ecf20Sopenharmony_ci PNS_PEP_ENABLE_REQ, 828c2ecf20Sopenharmony_ci PNS_PEP_ENABLE_RESP, 838c2ecf20Sopenharmony_ci PNS_PEP_CTRL_REQ, 848c2ecf20Sopenharmony_ci PNS_PEP_CTRL_RESP, 858c2ecf20Sopenharmony_ci PNS_PEP_DISABLE_REQ = 0x4C, 868c2ecf20Sopenharmony_ci PNS_PEP_DISABLE_RESP, 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci PNS_PEP_STATUS_IND = 0x60, 898c2ecf20Sopenharmony_ci PNS_PIPE_CREATED_IND, 908c2ecf20Sopenharmony_ci PNS_PIPE_RESET_IND = 0x63, 918c2ecf20Sopenharmony_ci PNS_PIPE_ENABLED_IND, 928c2ecf20Sopenharmony_ci PNS_PIPE_REDIRECTED_IND, 938c2ecf20Sopenharmony_ci PNS_PIPE_DISABLED_IND = 0x66, 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#define PN_PIPE_INVALID_HANDLE 0xff 978c2ecf20Sopenharmony_ci#define PN_PEP_TYPE_COMMON 0x00 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/* Phonet pipe status indication */ 1008c2ecf20Sopenharmony_cienum { 1018c2ecf20Sopenharmony_ci PN_PEP_IND_FLOW_CONTROL, 1028c2ecf20Sopenharmony_ci PN_PEP_IND_ID_MCFC_GRANT_CREDITS, 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci/* Phonet pipe error codes */ 1068c2ecf20Sopenharmony_cienum { 1078c2ecf20Sopenharmony_ci PN_PIPE_NO_ERROR, 1088c2ecf20Sopenharmony_ci PN_PIPE_ERR_INVALID_PARAM, 1098c2ecf20Sopenharmony_ci PN_PIPE_ERR_INVALID_HANDLE, 1108c2ecf20Sopenharmony_ci PN_PIPE_ERR_INVALID_CTRL_ID, 1118c2ecf20Sopenharmony_ci PN_PIPE_ERR_NOT_ALLOWED, 1128c2ecf20Sopenharmony_ci PN_PIPE_ERR_PEP_IN_USE, 1138c2ecf20Sopenharmony_ci PN_PIPE_ERR_OVERLOAD, 1148c2ecf20Sopenharmony_ci PN_PIPE_ERR_DEV_DISCONNECTED, 1158c2ecf20Sopenharmony_ci PN_PIPE_ERR_TIMEOUT, 1168c2ecf20Sopenharmony_ci PN_PIPE_ERR_ALL_PIPES_IN_USE, 1178c2ecf20Sopenharmony_ci PN_PIPE_ERR_GENERAL, 1188c2ecf20Sopenharmony_ci PN_PIPE_ERR_NOT_SUPPORTED, 1198c2ecf20Sopenharmony_ci}; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci/* Phonet pipe states */ 1228c2ecf20Sopenharmony_cienum { 1238c2ecf20Sopenharmony_ci PN_PIPE_DISABLE, 1248c2ecf20Sopenharmony_ci PN_PIPE_ENABLE, 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci/* Phonet pipe sub-block types */ 1288c2ecf20Sopenharmony_cienum { 1298c2ecf20Sopenharmony_ci PN_PIPE_SB_CREATE_REQ_PEP_SUB_TYPE, 1308c2ecf20Sopenharmony_ci PN_PIPE_SB_CONNECT_REQ_PEP_SUB_TYPE, 1318c2ecf20Sopenharmony_ci PN_PIPE_SB_REDIRECT_REQ_PEP_SUB_TYPE, 1328c2ecf20Sopenharmony_ci PN_PIPE_SB_NEGOTIATED_FC, 1338c2ecf20Sopenharmony_ci PN_PIPE_SB_REQUIRED_FC_TX, 1348c2ecf20Sopenharmony_ci PN_PIPE_SB_PREFERRED_FC_RX, 1358c2ecf20Sopenharmony_ci PN_PIPE_SB_ALIGNED_DATA, 1368c2ecf20Sopenharmony_ci}; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci/* Phonet pipe flow control models */ 1398c2ecf20Sopenharmony_cienum { 1408c2ecf20Sopenharmony_ci PN_NO_FLOW_CONTROL, 1418c2ecf20Sopenharmony_ci PN_LEGACY_FLOW_CONTROL, 1428c2ecf20Sopenharmony_ci PN_ONE_CREDIT_FLOW_CONTROL, 1438c2ecf20Sopenharmony_ci PN_MULTI_CREDIT_FLOW_CONTROL, 1448c2ecf20Sopenharmony_ci PN_MAX_FLOW_CONTROL, 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci#define pn_flow_safe(fc) ((fc) >> 1) 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci/* Phonet pipe flow control states */ 1508c2ecf20Sopenharmony_cienum { 1518c2ecf20Sopenharmony_ci PEP_IND_EMPTY, 1528c2ecf20Sopenharmony_ci PEP_IND_BUSY, 1538c2ecf20Sopenharmony_ci PEP_IND_READY, 1548c2ecf20Sopenharmony_ci}; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci#endif 157