[PATCHv2] hostapd: reload bss mac files on SIGUSR2
Antonio Quartulli
ordex
Mon Jun 18 14:21:07 PDT 2012
On Sun, Jun 17, 2012 at 11:44:54 +0300, Jouni Malinen wrote:
> On Mon, Jun 11, 2012 at 12:44:30AM +0200, Antonio Quartulli wrote:
> > This patch allows the administrator to modify the provided MAC list for the
> > BSS ACL mechanism at runtime. In the current implementation no runtime change
> > is possible: if the MAC list is modified, hostapd has to be restart so
> > disconnecting all the current clients.
> >
> > After manually modify the MAC files, the USR2 signal will make hostapd reload
> > them and possibly disconnect new not allowed stations.
>
> Why is this needed? Doesn't SIGHUP already reload the files? Using a
> USR2 signal would require more justification since it is the only
> generic signal that remains available and I'm not sure whether this
> functionality is really in need of a global signal (i.e., per-interface
> ctrl_iface would be cleaner).
Clients disconenctions is what I exactly would like to avoid.
If the mac-list is modified such that I added a new allowed station,
why should I disconnect all the other while updating the list?
Imagine hostapd is offering internet connectivity in a public hotspot...If I
were a client I would not be that happy ;P
>
> > diff --git a/hostapd/config_file.c b/hostapd/config_file.c
> > @@ -1391,8 +1394,12 @@ static int hostapd_config_fill(struct hostapd_config *conf,
> > wpa_printf(MSG_ERROR, "Line %d: unknown "
> > "macaddr_acl %d",
> > line, bss->macaddr_acl);
> > + bss->accept_mac_filename[0] = '\0';
> > + bss->deny_mac_filename[0] = '\0';
> > }
> > } else if (os_strcmp(buf, "accept_mac_file") == 0) {
> > + os_strncpy(bss->accept_mac_filename, pos, 256);
> > + bss->accept_mac_filename[255] = '\0';
>
> os_strlcpy() should be used instead of those two calls.
oh, thanks
>
> > +int hostapd_reload_macfile(struct hostapd_iface *iface)
> ...
> > + /* reload accept mac file if any */
> > + if (bss->accept_mac_filename[0] != '\0') {
> > + wpa_printf(MSG_DEBUG, "Reading %s",
> > + bss->accept_mac_filename);
> > + os_free(bss->accept_mac);
> > + bss->accept_mac = NULL;
> > + bss->num_accept_mac = 0;
> > + if (hostapd_config_read_maclist(
> > + bss->accept_mac_filename,
> > + &bss->accept_mac,
> > + &bss->num_accept_mac))
> > + wpa_printf(MSG_ERROR, "Failed to read "
> > + "accept_mac_file '%s'",
> > + bss->accept_mac_filename);
> > + }
>
> Will that error leave hostapd running with empty MAC ACL list? If so, it
> would be better to either leave the old list in use or prevent the use
> of the BSS after such failure.
I think that preventing this BSS to be used would be better. thanks
>
> > + /* deauthenticate listed stations */
> > + if (bss->macaddr_acl == ACCEPT_UNLESS_DENIED)
> > + for (j = 0; j < bss->num_deny_mac; j++)
> > + hostapd_deauth_station(iface->bss[i],
> > + bss->deny_mac[j].addr,
> > + WLAN_REASON_PREV_AUTH_NOT_VALID);
>
> Is this sending Deauthentication frame to every MAC address that is in
> the deny list even if those STAs are not authenticated at the moment?
> That would expose the list by broadcasting it.. This does not sound
> reasonable, i.e., only the STAs that are actually authenticated should
> be deauthenticated.
I definitely agree. Here comes the fact that I don't have a deep knowledge of
the code yet :(
>
> > diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
> > @@ -207,14 +207,15 @@ struct hostapd_bss_config {
> > int ieee802_11f; /* use IEEE 802.11f (IAPP) */
> > char iapp_iface[IFNAMSIZ + 1]; /* interface used with IAPP broadcast
> > * frames */
> > -
> > enum {
>
> Please do not include unrelated changes..
sorry, will remove
>
> > diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
> > @@ -106,7 +106,6 @@ static void hostapd_reload_bss(struct hostapd_data *hapd)
> > wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
> > }
> >
> > -
> > int hostapd_reload_config(struct hostapd_iface *iface)
>
> ... same here..
>
> > diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
> > +void hostapd_free_sta(struct hostapd_data *hapd, u8 *addr, u16 reason)
> > +{
> > + struct sta_info *sta, *prev;
> > +
> > + prev = sta = hapd->sta_list;
> > +
> > + while (sta && memcmp(sta->addr, addr, ETH_ALEN)) {
> > + prev = sta;
> > + sta = sta->next;
> > + }
>
> Should use ap_get_sta() instead of another loop to go through the STA
> list.
>
> > + if (sta == hapd->sta_list)
> > + hapd->sta_list = sta->next;
> > + else
> > + prev->next = sta->next;
> > +
> > + hostapd_free_sta_info(hapd, sta, reason);
>
> Why are the STA list pointers modified here instead of just leaving this
> to ap_free_sta() -> ap_sta_list_del() that gets called from
> hostapd_free_sta_info()?
The idea here was to optimise, and instead of letting ap_free_sta() iterate over
the list each time, I was going through the list manually and deleting the sta
when needed
Thank you very much for your advise Jouni.
Regards,
--
Antonio Quartulli
..each of us alone is worth nothing..
Ernesto "Che" Guevara
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
Url : http://lists.shmoo.com/pipermail/hostap/attachments/20120618/2180cb66/attachment.pgp
More information about the Hostap
mailing list