310-vif_radio_mask.patch 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. --- a/interface.c
  2. +++ b/interface.c
  3. @@ -226,6 +226,43 @@ nla_put_failure:
  4. return 1;
  5. }
  6. +static int parse_radio_list(char *str, struct nl_msg *msg)
  7. +{
  8. + unsigned int mask = 0;
  9. + unsigned long id;
  10. + char *end;
  11. +
  12. + if (!str)
  13. + return 1;
  14. +
  15. + if (!strcmp(str, "all"))
  16. + goto out;
  17. +
  18. + while (1) {
  19. + if (!*str)
  20. + return 1;
  21. +
  22. + id = strtoul(str, &end, 0);
  23. + if (id > 31)
  24. + return 1;
  25. +
  26. + mask |= 1 << id;
  27. + if (!*end)
  28. + break;
  29. +
  30. + if (end == str || *end != ',')
  31. + return 1;
  32. +
  33. + str = end + 1;
  34. + }
  35. +
  36. +out:
  37. + NLA_PUT_U32(msg, NL80211_ATTR_VIF_RADIO_MASK, mask);
  38. + return 0;
  39. +nla_put_failure:
  40. + return 1;
  41. +}
  42. +
  43. static int handle_interface_add(struct nl80211_state *state,
  44. struct nl_msg *msg,
  45. int argc, char **argv,
  46. @@ -287,6 +324,15 @@ try_another:
  47. fprintf(stderr, "flags error\n");
  48. return 2;
  49. }
  50. + } else if (strcmp(argv[0], "radios") == 0) {
  51. + argc--;
  52. + argv++;
  53. + if (parse_radio_list(argv[0], msg)) {
  54. + fprintf(stderr, "Invalid radio list\n");
  55. + return 2;
  56. + }
  57. + argc--;
  58. + argv++;
  59. } else {
  60. return 1;
  61. }
  62. @@ -306,14 +352,14 @@ try_another:
  63. nla_put_failure:
  64. return -ENOBUFS;
  65. }
  66. -COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>]",
  67. +COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>] [radios all|<id>[,<id>...]]",
  68. NL80211_CMD_NEW_INTERFACE, 0, CIB_PHY, handle_interface_add,
  69. "Add a new virtual interface with the given configuration.\n"
  70. IFACE_TYPES "\n\n"
  71. "The flags are only used for monitor interfaces, valid flags are:\n"
  72. VALID_FLAGS "\n\n"
  73. "The mesh_id is used only for mesh mode.");
  74. -COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>]",
  75. +COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>] [radios all|<id>[,<id>...]]",
  76. NL80211_CMD_NEW_INTERFACE, 0, CIB_NETDEV, handle_interface_add, NULL);
  77. static int handle_interface_del(struct nl80211_state *state,
  78. @@ -493,6 +539,19 @@ static int print_iface_handler(struct nl
  79. printf("\n");
  80. }
  81. }
  82. +
  83. + if (tb_msg[NL80211_ATTR_VIF_RADIO_MASK]) {
  84. + uint32_t mask = nla_get_u32(tb_msg[NL80211_ATTR_VIF_RADIO_MASK]);
  85. + int i;
  86. +
  87. + if (mask) {
  88. + printf("%s\tRadios:", indent);
  89. + for (i = 0; mask; i++, mask >>= 1)
  90. + if (mask & 1)
  91. + printf(" %d", i);
  92. + printf("\n");
  93. + }
  94. + }
  95. return NL_SKIP;
  96. }