/*
 * Wi-Fi Protected Setup - External Registrar
 * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#ifndef WPS_ER_H
#define WPS_ER_H

#include "utils/list.h"

struct wps_er_sta {
	struct dl_list list;
	struct wps_er_ap *ap;
	u8 addr[ETH_ALEN];
	u16 config_methods;
	u8 uuid[WPS_UUID_LEN];
	u8 pri_dev_type[8];
	u16 dev_passwd_id;
	int m1_received;
	char *manufacturer;
	char *model_name;
	char *model_number;
	char *serial_number;
	char *dev_name;
	struct wps_data *wps;
	struct http_client *http;
	struct wps_credential *cred;
};

struct wps_er_ap {
	struct dl_list list;
	struct wps_er *er;
	struct dl_list sta; /* list of STAs/Enrollees using this AP */
	struct in_addr addr;
	char *location;
	struct http_client *http;
	struct wps_data *wps;

	u8 uuid[WPS_UUID_LEN];
	u8 pri_dev_type[8];
	u8 wps_state;
	u8 mac_addr[ETH_ALEN];
	char *friendly_name;
	char *manufacturer;
	char *manufacturer_url;
	char *model_description;
	char *model_name;
	char *model_number;
	char *model_url;
	char *serial_number;
	char *udn;
	char *upc;

	char *scpd_url;
	char *control_url;
	char *event_sub_url;

	int subscribed;
	u8 sid[WPS_UUID_LEN];
	unsigned int id;

	struct wps_credential *ap_settings;

	void (*m1_handler)(struct wps_er_ap *ap, struct wpabuf *m1);
};

struct wps_er_ap_settings {
	struct dl_list list;
	u8 uuid[WPS_UUID_LEN];
	struct wps_credential ap_settings;
};

struct wps_er {
	struct wps_context *wps;
	char ifname[17];
	u8 mac_addr[ETH_ALEN]; /* mac addr of network i.f. we use */
	char *ip_addr_text; /* IP address of network i.f. we use */
	unsigned ip_addr; /* IP address of network i.f. we use (host order) */
	int multicast_sd;
	int ssdp_sd;
	struct dl_list ap;
	struct dl_list ap_unsubscribing;
	struct dl_list ap_settings;
	struct http_server *http_srv;
	int http_port;
	unsigned int next_ap_id;
	unsigned int event_id;
	int deinitializing;
	void (*deinit_done_cb)(void *ctx);
	void *deinit_done_ctx;
	struct in_addr filter_addr;
	int skip_set_sel_reg;
	const u8 *set_sel_reg_uuid_filter;
};


/* wps_er.c */
void wps_er_ap_add(struct wps_er *er, const u8 *uuid, struct in_addr *addr,
		   const char *location, int max_age);
void wps_er_ap_remove(struct wps_er *er, struct in_addr *addr);
int wps_er_ap_cache_settings(struct wps_er *er, struct in_addr *addr);

/* wps_er_ssdp.c */
int wps_er_ssdp_init(struct wps_er *er);
void wps_er_ssdp_deinit(struct wps_er *er);
void wps_er_send_ssdp_msearch(struct wps_er *er);

#endif /* WPS_ER_H */
