Updates spec file version
[platform/upstream/crda.git] / print-regdom.c
1 #include <errno.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <arpa/inet.h>
5 #include "reglib.h"
6
7 static void reg_rule2rd(__u8 *db, int dblen,
8         __be32 ruleptr, struct ieee80211_reg_rule *rd_reg_rule)
9 {
10         struct regdb_file_reg_rule *rule;
11         struct regdb_file_freq_range *freq;
12         struct regdb_file_power_rule *power;
13
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;
16
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);
20
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);
24
25         rd_power_rule->max_antenna_gain = ntohl(power->max_antenna_gain);
26         rd_power_rule->max_eirp = ntohl(power->max_eirp);
27
28         rd_reg_rule->flags = ntohl(rule->flags);
29 }
30
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)
34 {
35         struct regdb_file_reg_rules_collection *rcoll;
36         struct ieee80211_regdomain *rd;
37         int i, num_rules, size_of_rd;
38
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);
46
47         size_of_rd = sizeof(struct ieee80211_regdomain) +
48                 num_rules * sizeof(struct ieee80211_reg_rule);
49
50         rd = malloc(size_of_rd);
51         if (!rd)
52                 return NULL;
53
54         memset(rd, 0, size_of_rd);
55
56         rd->alpha2[0] = country->alpha2[0];
57         rd->alpha2[1] = country->alpha2[1];
58         rd->n_reg_rules = num_rules;
59
60         for (i = 0; i < num_rules; i++) {
61                 reg_rule2rd(db, dblen, rcoll->reg_rule_ptrs[i],
62                         &rd->reg_rules[i]);
63         }
64
65         return rd;
66 }
67
68 static void print_reg_rule(struct ieee80211_reg_rule *rule)
69 {
70         struct ieee80211_freq_range *freq;
71         struct ieee80211_power_rule *power;
72
73         freq  = &rule->freq_range;
74         power = &rule->power_rule;
75
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);
80
81         printf("(");
82
83         if (power->max_antenna_gain)
84                 printf("%.2f, ", ((float)(power->max_antenna_gain)/100.0));
85         else
86                 printf("N/A, ");
87
88         if (power->max_eirp)
89                 printf("%.2f)", ((float)(power->max_eirp)/100.0));
90         else
91                 printf("N/A)");
92
93         if (rule->flags & RRF_NO_OFDM)
94                 printf(", NO-OFDM");
95         if (rule->flags & RRF_NO_CCK)
96                 printf(", 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)
102                 printf(", 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)
110                 printf(", NO-IBSS");
111
112         printf("\n");
113 }
114
115 void print_regdom(struct ieee80211_regdomain *rd)
116 {
117         unsigned int i;
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]);
121         printf("\n");
122 }