7 static void reg_rule2rd(__u8 *db, int dblen,
8 __be32 ruleptr, struct ieee80211_reg_rule *rd_reg_rule)
10 struct regdb_file_reg_rule *rule;
11 struct regdb_file_freq_range *freq;
12 struct regdb_file_power_rule *power;
14 struct ieee80211_freq_range *rd_freq_range = &rd_reg_rule->freq_range;
15 struct ieee80211_power_rule *rd_power_rule = &rd_reg_rule->power_rule;
17 rule = crda_get_file_ptr(db, dblen, sizeof(*rule), ruleptr);
18 freq = crda_get_file_ptr(db, dblen, sizeof(*freq), rule->freq_range_ptr);
19 power = crda_get_file_ptr(db, dblen, sizeof(*power), rule->power_rule_ptr);
21 rd_freq_range->start_freq_khz = ntohl(freq->start_freq);
22 rd_freq_range->end_freq_khz = ntohl(freq->end_freq);
23 rd_freq_range->max_bandwidth_khz = ntohl(freq->max_bandwidth);
25 rd_power_rule->max_antenna_gain = ntohl(power->max_antenna_gain);
26 rd_power_rule->max_eirp = ntohl(power->max_eirp);
28 rd_reg_rule->flags = ntohl(rule->flags);
31 /* Converts a file regdomain to ieee80211_regdomain, easier to manage */
32 struct ieee80211_regdomain *country2rd(__u8 *db, int dblen,
33 struct regdb_file_reg_country *country)
35 struct regdb_file_reg_rules_collection *rcoll;
36 struct ieee80211_regdomain *rd;
37 int i, num_rules, size_of_rd;
39 rcoll = crda_get_file_ptr(db, dblen, sizeof(*rcoll),
40 country->reg_collection_ptr);
41 num_rules = ntohl(rcoll->reg_rule_num);
42 /* re-get pointer with sanity checking for num_rules */
43 rcoll = crda_get_file_ptr(db, dblen,
44 sizeof(*rcoll) + num_rules * sizeof(__be32),
45 country->reg_collection_ptr);
47 size_of_rd = sizeof(struct ieee80211_regdomain) +
48 num_rules * sizeof(struct ieee80211_reg_rule);
50 rd = malloc(size_of_rd);
54 memset(rd, 0, size_of_rd);
56 rd->alpha2[0] = country->alpha2[0];
57 rd->alpha2[1] = country->alpha2[1];
58 rd->n_reg_rules = num_rules;
60 for (i = 0; i < num_rules; i++) {
61 reg_rule2rd(db, dblen, rcoll->reg_rule_ptrs[i],
68 static void print_reg_rule(struct ieee80211_reg_rule *rule)
70 struct ieee80211_freq_range *freq;
71 struct ieee80211_power_rule *power;
73 freq = &rule->freq_range;
74 power = &rule->power_rule;
76 printf("\t(%.3f - %.3f @ %.3f), ",
77 ((float)(freq->start_freq_khz))/1000.0,
78 ((float)(freq->end_freq_khz))/1000.0,
79 ((float)(freq->max_bandwidth_khz))/1000.0);
83 if (power->max_antenna_gain)
84 printf("%.2f, ", ((float)(power->max_antenna_gain)/100.0));
89 printf("%.2f)", ((float)(power->max_eirp)/100.0));
93 if (rule->flags & RRF_NO_OFDM)
95 if (rule->flags & RRF_NO_CCK)
97 if (rule->flags & RRF_NO_INDOOR)
98 printf(", NO-INDOOR");
99 if (rule->flags & RRF_NO_OUTDOOR)
100 printf(", NO-OUTDOOR");
101 if (rule->flags & RRF_DFS)
103 if (rule->flags & RRF_PTP_ONLY)
104 printf(", PTP-ONLY");
105 if (rule->flags & RRF_PTMP_ONLY)
106 printf(", PTMP-ONLY");
107 if (rule->flags & RRF_PASSIVE_SCAN)
108 printf(", PASSIVE-SCAN");
109 if (rule->flags & RRF_NO_IBSS)
115 void print_regdom(struct ieee80211_regdomain *rd)
118 printf("country %.2s:\n", rd->alpha2);
119 for (i = 0; i < rd->n_reg_rules; i++)
120 print_reg_rule(&rd->reg_rules[i]);