bgscan.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * WPA Supplicant - background scan and roaming interface
  3. * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include "common.h"
  10. #include "wpa_supplicant_i.h"
  11. #include "config_ssid.h"
  12. #include "bgscan.h"
  13. #ifdef CONFIG_BGSCAN_SIMPLE
  14. extern const struct bgscan_ops bgscan_simple_ops;
  15. #endif /* CONFIG_BGSCAN_SIMPLE */
  16. #ifdef CONFIG_BGSCAN_LEARN
  17. extern const struct bgscan_ops bgscan_learn_ops;
  18. #endif /* CONFIG_BGSCAN_LEARN */
  19. static const struct bgscan_ops * bgscan_modules[] = {
  20. #ifdef CONFIG_BGSCAN_SIMPLE
  21. &bgscan_simple_ops,
  22. #endif /* CONFIG_BGSCAN_SIMPLE */
  23. #ifdef CONFIG_BGSCAN_LEARN
  24. &bgscan_learn_ops,
  25. #endif /* CONFIG_BGSCAN_LEARN */
  26. NULL
  27. };
  28. int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
  29. const char *name)
  30. {
  31. const char *params;
  32. size_t nlen;
  33. int i;
  34. const struct bgscan_ops *ops = NULL;
  35. bgscan_deinit(wpa_s);
  36. if (name == NULL)
  37. return -1;
  38. params = os_strchr(name, ':');
  39. if (params == NULL) {
  40. params = "";
  41. nlen = os_strlen(name);
  42. } else {
  43. nlen = params - name;
  44. params++;
  45. }
  46. for (i = 0; bgscan_modules[i]; i++) {
  47. if (os_strncmp(name, bgscan_modules[i]->name, nlen) == 0) {
  48. ops = bgscan_modules[i];
  49. break;
  50. }
  51. }
  52. if (ops == NULL) {
  53. wpa_printf(MSG_ERROR, "bgscan: Could not find module "
  54. "matching the parameter '%s'", name);
  55. return -1;
  56. }
  57. wpa_s->bgscan_priv = ops->init(wpa_s, params, ssid);
  58. if (wpa_s->bgscan_priv == NULL)
  59. return -1;
  60. wpa_s->bgscan = ops;
  61. wpa_printf(MSG_DEBUG, "bgscan: Initialized module '%s' with "
  62. "parameters '%s'", ops->name, params);
  63. return 0;
  64. }
  65. void bgscan_deinit(struct wpa_supplicant *wpa_s)
  66. {
  67. if (wpa_s->bgscan && wpa_s->bgscan_priv) {
  68. wpa_printf(MSG_DEBUG, "bgscan: Deinitializing module '%s'",
  69. wpa_s->bgscan->name);
  70. wpa_s->bgscan->deinit(wpa_s->bgscan_priv);
  71. wpa_s->bgscan = NULL;
  72. wpa_s->bgscan_priv = NULL;
  73. }
  74. }
  75. int bgscan_notify_scan(struct wpa_supplicant *wpa_s,
  76. struct wpa_scan_results *scan_res)
  77. {
  78. if (wpa_s->bgscan && wpa_s->bgscan_priv)
  79. return wpa_s->bgscan->notify_scan(wpa_s->bgscan_priv,
  80. scan_res);
  81. return 0;
  82. }
  83. void bgscan_notify_beacon_loss(struct wpa_supplicant *wpa_s)
  84. {
  85. if (wpa_s->bgscan && wpa_s->bgscan_priv)
  86. wpa_s->bgscan->notify_beacon_loss(wpa_s->bgscan_priv);
  87. }
  88. void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above,
  89. int current_signal, int current_noise,
  90. int current_txrate)
  91. {
  92. if (wpa_s->bgscan && wpa_s->bgscan_priv)
  93. wpa_s->bgscan->notify_signal_change(wpa_s->bgscan_priv, above,
  94. current_signal,
  95. current_noise,
  96. current_txrate);
  97. }