2 * Application-specific portion of EAPD
5 * Copyright (C) 2010, Broadcom Corporation
8 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
9 * the contents of this file may not be disclosed to third parties, copied
10 * or duplicated in any form, in whole or in part, without the prior
11 * written permission of Broadcom Corporation.
13 * $Id: dcs_eap.c 241391 2011-02-18 03:35:48Z stakita $
20 #include <sys/types.h>
21 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <arpa/inet.h>
27 #include <proto/ethernet.h>
28 #include <proto/eapol.h>
29 #include <proto/eap.h>
30 #include <bcmendian.h>
35 #include <security_ipc.h>
38 dcs_app_recv_handler(eapd_wksp_t
*nwksp
, eapd_cb_t
*from
, uint8
*pData
,
45 dcs_app_set_eventmask(eapd_app_t
*app
)
47 memset(app
->bitvec
, 0, sizeof(app
->bitvec
));
49 setbit(app
->bitvec
, WLC_E_DCS_REQUEST
);
50 setbit(app
->bitvec
, WLC_E_SCAN_COMPLETE
);
55 dcs_app_init(eapd_wksp_t
*nwksp
)
60 struct sockaddr_in addr
;
71 EAPD_INFO("No any DCS application need to run.\n");
76 EAPD_INFO("dcs: init brcm interface %s \n", cb
->ifname
);
77 cb
->brcmSocket
= eapd_add_brcm(nwksp
, cb
->ifname
);
80 /* set this brcmSocket have DCS capability */
81 cb
->brcmSocket
->flag
|= EAPD_CAP_DCS
;
86 /* appSocket for dcs */
87 dcs
->appSocket
= socket(AF_INET
, SOCK_DGRAM
, 0);
88 if (dcs
->appSocket
< 0) {
89 EAPD_ERROR("UDP Open failed.\n");
93 if (setsockopt(dcs
->appSocket
, SOL_SOCKET
, SO_REUSEPORT
, (char*)&reuse
,
95 EAPD_ERROR("UDP setsockopt failed.\n");
96 close(dcs
->appSocket
);
101 if (setsockopt(dcs
->appSocket
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
,
102 sizeof(reuse
)) < 0) {
103 EAPD_ERROR("UDP setsockopt failed.\n");
104 close(dcs
->appSocket
);
110 memset(&addr
, 0, sizeof(struct sockaddr_in
));
111 addr
.sin_family
= AF_INET
;
112 addr
.sin_addr
.s_addr
= INADDR_ANY
;
113 addr
.sin_port
= htons(EAPD_WKSP_DCS_UDP_RPORT
);
114 if (bind(dcs
->appSocket
, (struct sockaddr
*)&addr
, sizeof(addr
)) < 0) {
115 EAPD_ERROR("UDP Bind failed, close dcs appSocket %d\n", dcs
->appSocket
);
116 close(dcs
->appSocket
);
120 EAPD_INFO("DCS appSocket %d opened\n", dcs
->appSocket
);
126 dcs_app_deinit(eapd_wksp_t
*nwksp
)
129 eapd_cb_t
*cb
, *tmp_cb
;
132 EAPD_ERROR("Wrong argument...\n");
139 /* close brcm drvSocket */
140 if (cb
->brcmSocket
) {
141 EAPD_INFO("close dcs brcmSocket %d\n", cb
->brcmSocket
->drvSocket
);
142 eapd_del_brcm(nwksp
, cb
->brcmSocket
);
151 if (dcs
->appSocket
>= 0) {
152 EAPD_INFO("close dcs appSocket %d\n", dcs
->appSocket
);
153 close(dcs
->appSocket
);
161 dcs_app_sendup(eapd_wksp_t
*nwksp
, uint8
*pData
, int pLen
, char *from
)
166 EAPD_ERROR("Wrong argument...\n");
171 if (dcs
->appSocket
>= 0) {
174 struct sockaddr_in to
;
176 to
.sin_addr
.s_addr
= inet_addr(EAPD_WKSP_UDP_ADDR
);
177 to
.sin_family
= AF_INET
;
178 to
.sin_port
= htons(EAPD_WKSP_DCS_UDP_SPORT
);
180 sentBytes
= sendto(dcs
->appSocket
, pData
, pLen
, 0,
181 (struct sockaddr
*)&to
, sizeof(struct sockaddr_in
));
183 if (sentBytes
!= pLen
) {
184 EAPD_ERROR("UDP send failed; sentBytes = %d\n", sentBytes
);
187 /* EAPD_ERROR("Send %d bytes to dcs\n", sentBytes); */
191 EAPD_ERROR("dcs appSocket not created\n");
196 #if EAPD_WKSP_AUTO_CONFIG
198 dcs_app_enabled(char *name
)
200 char value
[128], comb
[32], prefix
[8];
201 char os_name
[IFNAMSIZ
];
204 memset(os_name
, 0, sizeof(os_name
));
206 if (nvifname_to_osifname(name
, os_name
, sizeof(os_name
)))
208 if (wl_probe(os_name
) ||
209 wl_ioctl(os_name
, WLC_GET_INSTANCE
, &unit
, sizeof(unit
)))
211 if (osifname_to_nvifname(name
, prefix
, sizeof(prefix
)))
215 /* ignore if disabled */
216 eapd_safe_get_conf(value
, sizeof(value
), strcat_r(prefix
, "radio", comb
));
217 if (atoi(value
) == 0) {
218 EAPD_INFO("DCS:ignored interface %s. radio disabled\n", os_name
);
222 /* ignore if BSS is disabled */
223 eapd_safe_get_conf(value
, sizeof(value
), strcat_r(prefix
, "bss_enabled", comb
));
224 if (atoi(value
) == 0) {
225 EAPD_INFO("DCS: ignored interface %s, %s is disabled \n", os_name
, comb
);
229 /* if come to here return enabled */
232 #endif /* EAPD_WKSP_AUTO_CONFIG */
235 dcs_app_handle_event(eapd_wksp_t
*nwksp
, uint8
*pData
, int Len
, char *from
)
240 bcm_event_t
*dpkt
= (bcm_event_t
*) pData
;
241 wl_event_msg_t
*event
= &(dpkt
->event
);
243 type
= ntohl(event
->event_type
);
248 if (isset(dcs
->bitvec
, type
) &&
249 !strcmp(cb
->ifname
, from
)) {
251 /* prepend ifname, we reserved IFNAMSIZ length already */
254 memcpy(pData
, event
->ifname
, IFNAMSIZ
);
256 /* send to dcs use cb->ifname */
257 dcs_app_sendup(nwksp
, pData
, Len
, cb
->ifname
);