xref: /OK3568_Linux_fs/kernel/include/net/phonet/phonet.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * File: af_phonet.h
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Phonet sockets kernel definitions
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) 2008 Nokia Corporation.
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef AF_PHONET_H
11*4882a593Smuzhiyun #define AF_PHONET_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun  * The lower layers may not require more space, ever. Make sure it's
15*4882a593Smuzhiyun  * enough.
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun #define MAX_PHONET_HEADER	(8 + MAX_HEADER)
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun  * Every Phonet* socket has this structure first in its
21*4882a593Smuzhiyun  * protocol-specific structure under name c.
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun struct pn_sock {
24*4882a593Smuzhiyun 	struct sock	sk;
25*4882a593Smuzhiyun 	u16		sobject;
26*4882a593Smuzhiyun 	u16		dobject;
27*4882a593Smuzhiyun 	u8		resource;
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
pn_sk(struct sock * sk)30*4882a593Smuzhiyun static inline struct pn_sock *pn_sk(struct sock *sk)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun 	return (struct pn_sock *)sk;
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun extern const struct proto_ops phonet_dgram_ops;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun void pn_sock_init(void);
38*4882a593Smuzhiyun struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa);
39*4882a593Smuzhiyun void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb);
40*4882a593Smuzhiyun void phonet_get_local_port_range(int *min, int *max);
41*4882a593Smuzhiyun int pn_sock_hash(struct sock *sk);
42*4882a593Smuzhiyun void pn_sock_unhash(struct sock *sk);
43*4882a593Smuzhiyun int pn_sock_get_port(struct sock *sk, unsigned short sport);
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun struct sock *pn_find_sock_by_res(struct net *net, u8 res);
46*4882a593Smuzhiyun int pn_sock_bind_res(struct sock *sock, u8 res);
47*4882a593Smuzhiyun int pn_sock_unbind_res(struct sock *sk, u8 res);
48*4882a593Smuzhiyun void pn_sock_unbind_all_res(struct sock *sk);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun int pn_skb_send(struct sock *sk, struct sk_buff *skb,
51*4882a593Smuzhiyun 		const struct sockaddr_pn *target);
52*4882a593Smuzhiyun 
pn_hdr(struct sk_buff * skb)53*4882a593Smuzhiyun static inline struct phonethdr *pn_hdr(struct sk_buff *skb)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	return (struct phonethdr *)skb_network_header(skb);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
pn_msg(struct sk_buff * skb)58*4882a593Smuzhiyun static inline struct phonetmsg *pn_msg(struct sk_buff *skb)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	return (struct phonetmsg *)skb_transport_header(skb);
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /*
64*4882a593Smuzhiyun  * Get the other party's sockaddr from received skb. The skb begins
65*4882a593Smuzhiyun  * with a Phonet header.
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun static inline
pn_skb_get_src_sockaddr(struct sk_buff * skb,struct sockaddr_pn * sa)68*4882a593Smuzhiyun void pn_skb_get_src_sockaddr(struct sk_buff *skb, struct sockaddr_pn *sa)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	struct phonethdr *ph = pn_hdr(skb);
71*4882a593Smuzhiyun 	u16 obj = pn_object(ph->pn_sdev, ph->pn_sobj);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	sa->spn_family = AF_PHONET;
74*4882a593Smuzhiyun 	pn_sockaddr_set_object(sa, obj);
75*4882a593Smuzhiyun 	pn_sockaddr_set_resource(sa, ph->pn_res);
76*4882a593Smuzhiyun 	memset(sa->spn_zero, 0, sizeof(sa->spn_zero));
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun static inline
pn_skb_get_dst_sockaddr(struct sk_buff * skb,struct sockaddr_pn * sa)80*4882a593Smuzhiyun void pn_skb_get_dst_sockaddr(struct sk_buff *skb, struct sockaddr_pn *sa)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun 	struct phonethdr *ph = pn_hdr(skb);
83*4882a593Smuzhiyun 	u16 obj = pn_object(ph->pn_rdev, ph->pn_robj);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	sa->spn_family = AF_PHONET;
86*4882a593Smuzhiyun 	pn_sockaddr_set_object(sa, obj);
87*4882a593Smuzhiyun 	pn_sockaddr_set_resource(sa, ph->pn_res);
88*4882a593Smuzhiyun 	memset(sa->spn_zero, 0, sizeof(sa->spn_zero));
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* Protocols in Phonet protocol family. */
92*4882a593Smuzhiyun struct phonet_protocol {
93*4882a593Smuzhiyun 	const struct proto_ops	*ops;
94*4882a593Smuzhiyun 	struct proto		*prot;
95*4882a593Smuzhiyun 	int			sock_type;
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun int phonet_proto_register(unsigned int protocol,
99*4882a593Smuzhiyun 		const struct phonet_protocol *pp);
100*4882a593Smuzhiyun void phonet_proto_unregister(unsigned int protocol,
101*4882a593Smuzhiyun 		const struct phonet_protocol *pp);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun int phonet_sysctl_init(void);
104*4882a593Smuzhiyun void phonet_sysctl_exit(void);
105*4882a593Smuzhiyun int isi_register(void);
106*4882a593Smuzhiyun void isi_unregister(void);
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #endif
109