1  /*
2   * NAN Discovery Engine
3   * Copyright (c) 2024, Qualcomm Innovation Center, Inc.
4   *
5   * This software may be distributed under the terms of the BSD license.
6   * See README for more details.
7   */
8  
9  #ifndef NAN_DE_H
10  #define NAN_DE_H
11  
12  #include "nan.h"
13  
14  /* Maximum number of active local publish and subscribe instances */
15  #ifndef NAN_DE_MAX_SERVICE
16  #define NAN_DE_MAX_SERVICE 20
17  #endif /* NAN_DE_MAX_SERVICE */
18  
19  struct nan_de;
20  
21  enum nan_de_reason {
22  	NAN_DE_REASON_TIMEOUT,
23  	NAN_DE_REASON_USER_REQUEST,
24  	NAN_DE_REASON_FAILURE,
25  };
26  
27  struct nan_callbacks {
28  	void *ctx;
29  
30  	int (*tx)(void *ctx, unsigned int freq, unsigned int wait_time,
31  		  const u8 *dst, const u8 *src, const u8 *bssid,
32  		  const struct wpabuf *buf);
33  	int (*listen)(void *ctx, unsigned int freq, unsigned int duration);
34  
35  	/* NAN DE Events */
36  	void (*discovery_result)(void *ctx, int subscribe_id,
37  				 enum nan_service_protocol_type srv_proto_type,
38  				 const u8 *ssi, size_t ssi_len,
39  				 int peer_publish_id,
40  				 const u8 *peer_addr, bool fsd, bool fsd_gas);
41  
42  	void (*replied)(void *ctx, int publish_id, const u8 *peer_addr,
43  			int peer_subscribe_id,
44  			enum nan_service_protocol_type srv_proto_type,
45  			const u8 *ssi, size_t ssi_len);
46  
47  	void (*publish_terminated)(void *ctx, int publish_id,
48  				    enum nan_de_reason reason);
49  
50  	void (*subscribe_terminated)(void *ctx, int subscribe_id,
51  				     enum nan_de_reason reason);
52  
53  	void (*receive)(void *ctx, int id, int peer_instance_id,
54  			const u8 *ssi, size_t ssi_len,
55  			const u8 *peer_addr);
56  
57  	void (*process_p2p_usd_elems)(void *ctx, const u8 *buf,
58  				      u16 buf_len, const u8 *peer_addr,
59  				      unsigned int freq);
60  };
61  
62  bool nan_de_is_nan_network_id(const u8 *addr);
63  bool nan_de_is_p2p_network_id(const u8 *addr);
64  struct nan_de * nan_de_init(const u8 *nmi, bool offload, bool ap,
65  			    unsigned int max_listen,
66  			    const struct nan_callbacks *cb);
67  void nan_de_flush(struct nan_de *de);
68  void nan_de_deinit(struct nan_de *de);
69  
70  void nan_de_listen_started(struct nan_de *de, unsigned int freq,
71  			   unsigned int duration);
72  void nan_de_listen_ended(struct nan_de *de, unsigned int freq);
73  void nan_de_tx_status(struct nan_de *de, unsigned int freq, const u8 *dst);
74  void nan_de_tx_wait_ended(struct nan_de *de);
75  
76  void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
77  		   unsigned int freq, const u8 *buf, size_t len);
78  const u8 * nan_de_get_service_id(struct nan_de *de, int id);
79  
80  struct nan_publish_params {
81  	/* configuration_parameters */
82  
83  	/* Publish type */
84  	bool unsolicited;
85  	bool solicited;
86  
87  	/* Solicited transmission type */
88  	bool solicited_multicast;
89  
90  	/* Time to live (in seconds); 0 = one TX only */
91  	unsigned int ttl;
92  
93  	/* Event conditions */
94  	bool disable_events;
95  
96  	/* Further Service Discovery flag */
97  	bool fsd;
98  
99  	/* Further Service Discovery function */
100  	bool fsd_gas;
101  
102  	/* Default frequency (defaultPublishChannel) */
103  	unsigned int freq;
104  
105  	/* Multi-channel frequencies (publishChannelList) */
106  	const int *freq_list;
107  
108  	/* Announcement period in ms; 0 = use default */
109  	unsigned int announcement_period;
110  };
111  
112  /* Returns -1 on failure or >0 publish_id */
113  int nan_de_publish(struct nan_de *de, const char *service_name,
114  		   enum nan_service_protocol_type srv_proto_type,
115  		   const struct wpabuf *ssi, const struct wpabuf *elems,
116  		   struct nan_publish_params *params, bool p2p);
117  
118  void nan_de_cancel_publish(struct nan_de *de, int publish_id);
119  
120  int nan_de_update_publish(struct nan_de *de, int publish_id,
121  			  const struct wpabuf *ssi);
122  
123  int nan_de_unpause_publish(struct nan_de *de, int publish_id,
124  			   u8 peer_instance_id, const u8 *peer_addr);
125  
126  struct nan_subscribe_params {
127  	/* configuration_parameters */
128  
129  	/* Subscribe type */
130  	bool active;
131  
132  	/* Time to live (in seconds); 0 = until first result */
133  	unsigned int ttl;
134  
135  	/* Selected frequency */
136  	unsigned int freq;
137  
138  	/* Multi-channel frequencies (publishChannelList) */
139  	const int *freq_list;
140  
141  	/* Query period in ms; 0 = use default */
142  	unsigned int query_period;
143  };
144  
145  /* Returns -1 on failure or >0 subscribe_id */
146  int nan_de_subscribe(struct nan_de *de, const char *service_name,
147  		     enum nan_service_protocol_type srv_proto_type,
148  		     const struct wpabuf *ssi, const struct wpabuf *elems,
149  		     struct nan_subscribe_params *params, bool p2p);
150  
151  void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id);
152  
153  /* handle = publish_id or subscribe_id
154   * req_instance_id = peer publish_id or subscribe_id */
155  int nan_de_transmit(struct nan_de *de, int handle,
156  		    const struct wpabuf *ssi, const struct wpabuf *elems,
157  		    const u8 *peer_addr, u8 req_instance_id);
158  
159  #endif /* NAN_DE_H */
160