| #!/usr/bin/python -S |
| |
| """Functions related to bandsteering.""" |
| |
| import errno |
| import glob |
| import hashlib |
| import os |
| |
| import experiment |
| import utils |
| |
| |
| _BANDSTEERING_DIR = '/tmp/wifi/steering' |
| |
| |
| def hostapd_options(band, ssid): |
| """Returns hostapd options for bandsteering. |
| |
| Respects the experiments WifiBandsteering and WifiReverseBandsteering, in that |
| order. |
| |
| Uses (and renames if necessary) a preexisting bandsteering directory for this |
| band, if one exists. Otherwise, creates that directory. |
| |
| Args: |
| band: The band on which hostapd is being started. |
| ssid: The SSID of the AP. |
| |
| Returns: |
| A list containing options to be passed to hostapd. |
| |
| Raises: |
| BinWifiException: If the directory for storing bandsteering timestamps |
| cannot be created. |
| """ |
| if experiment.enabled('WifiBandsteering'): |
| target = '5' |
| elif experiment.enabled('WifiReverseBandsteering'): |
| target = '2.4' |
| elif experiment.enabled('WifiHostapdLogging'): |
| target = '' |
| else: |
| return [] |
| |
| band_dir = _bandsteering_dir(band, ssid) |
| target_dir = _bandsteering_dir(target, ssid) |
| |
| # Make sure band_dir exist, since we want hostapd to write to it. If there's |
| # a pre-existing one for the same band, use that; otherwise, create it. |
| subdirs = (os.path.normpath(path) |
| for path in glob.glob(os.path.join(_BANDSTEERING_DIR, '*/.'))) |
| |
| for subdir in subdirs: |
| if os.path.basename(subdir).startswith(band): |
| try: |
| os.rename(subdir, band_dir) |
| except OSError: |
| raise utils.BinWifiException("Couldn't update bandsteering directory") |
| break |
| else: |
| try: |
| os.makedirs(band_dir) |
| except OSError as e: |
| if e.errno != errno.EEXIST: |
| raise utils.BinWifiException( |
| "Couldn't create bandsteering directory %s", band_dir) |
| |
| result = ['-L', band_dir] |
| if target and band != target: |
| result += ['-S', target_dir] |
| |
| return result |
| |
| |
| def _bandsteering_dir(band, ssid): |
| dir_suffix = hashlib.md5(ssid).hexdigest()[:10] |
| return os.path.join(_BANDSTEERING_DIR, '%s_%s' % (band, dir_suffix)) |