udp: Merge udp_send and udp_output
[dragonfly.git] / contrib / wpa_supplicant / wpa_supplicant / blacklist.c
1 /*
2  * wpa_supplicant - Temporary BSSID blacklist
3  * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #include "includes.h"
16
17 #include "common.h"
18 #include "wpa_supplicant_i.h"
19 #include "blacklist.h"
20
21 /**
22  * wpa_blacklist_get - Get the blacklist entry for a BSSID
23  * @wpa_s: Pointer to wpa_supplicant data
24  * @bssid: BSSID
25  * Returns: Matching blacklist entry for the BSSID or %NULL if not found
26  */
27 struct wpa_blacklist * wpa_blacklist_get(struct wpa_supplicant *wpa_s,
28                                          const u8 *bssid)
29 {
30         struct wpa_blacklist *e;
31
32         e = wpa_s->blacklist;
33         while (e) {
34                 if (os_memcmp(e->bssid, bssid, ETH_ALEN) == 0)
35                         return e;
36                 e = e->next;
37         }
38
39         return NULL;
40 }
41
42
43 /**
44  * wpa_blacklist_add - Add an BSSID to the blacklist
45  * @wpa_s: Pointer to wpa_supplicant data
46  * @bssid: BSSID to be added to the blacklist
47  * Returns: 0 on success, -1 on failure
48  *
49  * This function adds the specified BSSID to the blacklist or increases the
50  * blacklist count if the BSSID was already listed. It should be called when
51  * an association attempt fails either due to the selected BSS rejecting
52  * association or due to timeout.
53  *
54  * This blacklist is used to force %wpa_supplicant to go through all available
55  * BSSes before retrying to associate with an BSS that rejected or timed out
56  * association. It does not prevent the listed BSS from being used; it only
57  * changes the order in which they are tried.
58  */
59 int wpa_blacklist_add(struct wpa_supplicant *wpa_s, const u8 *bssid)
60 {
61         struct wpa_blacklist *e;
62
63         e = wpa_blacklist_get(wpa_s, bssid);
64         if (e) {
65                 e->count++;
66                 wpa_printf(MSG_DEBUG, "BSSID " MACSTR " blacklist count "
67                            "incremented to %d",
68                            MAC2STR(bssid), e->count);
69                 return 0;
70         }
71
72         e = os_zalloc(sizeof(*e));
73         if (e == NULL)
74                 return -1;
75         os_memcpy(e->bssid, bssid, ETH_ALEN);
76         e->count = 1;
77         e->next = wpa_s->blacklist;
78         wpa_s->blacklist = e;
79         wpa_printf(MSG_DEBUG, "Added BSSID " MACSTR " into blacklist",
80                    MAC2STR(bssid));
81
82         return 0;
83 }
84
85
86 /**
87  * wpa_blacklist_del - Remove an BSSID from the blacklist
88  * @wpa_s: Pointer to wpa_supplicant data
89  * @bssid: BSSID to be removed from the blacklist
90  * Returns: 0 on success, -1 on failure
91  */
92 int wpa_blacklist_del(struct wpa_supplicant *wpa_s, const u8 *bssid)
93 {
94         struct wpa_blacklist *e, *prev = NULL;
95
96         e = wpa_s->blacklist;
97         while (e) {
98                 if (os_memcmp(e->bssid, bssid, ETH_ALEN) == 0) {
99                         if (prev == NULL) {
100                                 wpa_s->blacklist = e->next;
101                         } else {
102                                 prev->next = e->next;
103                         }
104                         wpa_printf(MSG_DEBUG, "Removed BSSID " MACSTR " from "
105                                    "blacklist", MAC2STR(bssid));
106                         os_free(e);
107                         return 0;
108                 }
109                 prev = e;
110                 e = e->next;
111         }
112         return -1;
113 }
114
115
116 /**
117  * wpa_blacklist_clear - Clear the blacklist of all entries
118  * @wpa_s: Pointer to wpa_supplicant data
119  */
120 void wpa_blacklist_clear(struct wpa_supplicant *wpa_s)
121 {
122         struct wpa_blacklist *e, *prev;
123
124         e = wpa_s->blacklist;
125         wpa_s->blacklist = NULL;
126         while (e) {
127                 prev = e;
128                 e = e->next;
129                 wpa_printf(MSG_DEBUG, "Removed BSSID " MACSTR " from "
130                            "blacklist (clear)", MAC2STR(prev->bssid));
131                 os_free(prev);
132         }
133 }