1: /*************************************************************************
2: * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
3: * by Michael Pounov <misho@aitbg.com>
4: *
5: * $Author: misho $
6: * $Id: athctl.c,v 1.1.2.2 2010/10/23 01:50:49 misho Exp $
7: *
8: *************************************************************************/
9: #include "global.h"
10: #include "athctl.h"
11:
12:
13: int Verbose;
14: extern char compiled[], compiledby[], compilehost[];
15:
16:
17: static void
18: Usage()
19: {
20: printf( "athCtl is tool for Atheros WiFi cards managment \n"
21: "=== %s === %s@%s ===\n\n"
22: " Syntax: athctl [options] [exec_file]\n\n"
23: "\t-v\t\tVerbose ...\n"
24: "\t-t\t\tGet current Atheros maximum range in meters\n"
25: "\t-i <iface_no>\tApply to this Atheros interface number (like ath0 == 0)\n"
26: "\t-d <distance>\tMode distance, meters to target\n"
27: "\t-c <timeout>\tMode distance, mS timeouts correction\n"
28: "\n", compiled, compiledby, compilehost);
29: }
30:
31: static int
32: calcDistance(int ifid, int dist, int cor)
33: {
34: int slottime[2], timeout[2];
35: size_t len;
36: char szStr[STRSIZ];
37:
38: slottime[0] = 9 + (dist / 300) + (dist % 300 ? 1 : 0);
39: timeout[0] = slottime[0] * 2 + 3 + cor;
40: VERB(3) printf("Info:: slottime=%d timeout=%d\n", slottime[0], timeout[0]);
41:
42: memset(szStr, 0, STRSIZ);
43: snprintf(szStr, STRSIZ, SC_SLOTTIME, ifid);
44: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
45: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
46: return -1;
47: } else if (sysctlbyname(szStr, &slottime[1], &len, NULL, 0) == -1) {
48: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
49: return -1;
50: } else if (sysctlbyname(szStr, NULL, NULL, &slottime[0], sizeof slottime[0]) == -1) {
51: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, slottime[1],
52: errno, strerror(errno));
53: return -1;
54: } else
55: VERB(1) printf("Info:: set slottime(%d) from %d to %d ... OK!\n", len,
56: slottime[1], slottime[0]);
57:
58: memset(szStr, 0, STRSIZ);
59: snprintf(szStr, STRSIZ, SC_ACKTIMEOUT, ifid);
60: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
61: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
62: return -1;
63: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
64: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
65: return -1;
66: } else if (sysctlbyname(szStr, NULL, NULL, &timeout[0], sizeof timeout[0]) == -1) {
67: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, timeout[1],
68: errno, strerror(errno));
69: return -1;
70: } else
71: VERB(1) printf("Info:: set acktimeout(%d) from %d to %d ... OK!\n", len,
72: timeout[1], timeout[0]);
73:
74: memset(szStr, 0, STRSIZ);
75: snprintf(szStr, STRSIZ, SC_CTSTIMEOUT, ifid);
76: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
77: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
78: return -1;
79: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
80: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
81: return -1;
82: } else if (sysctlbyname(szStr, NULL, NULL, &timeout[0], sizeof timeout[0]) == -1) {
83: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, timeout[1],
84: errno, strerror(errno));
85: return -1;
86: } else
87: VERB(1) printf("Info:: set ctstimeout(%d) from %d to %d ... OK!\n", len,
88: timeout[1], timeout[0]);
89:
90: return timeout[0];
91: }
92:
93:
94: static int
95: calcTimeout(int ifid, int cor)
96: {
97: int slottime[2], timeout[2];
98: size_t len;
99: char szStr[STRSIZ];
100:
101: memset(szStr, 0, STRSIZ);
102: snprintf(szStr, STRSIZ, SC_SLOTTIME, ifid);
103: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
104: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
105: return -1;
106: } else if (sysctlbyname(szStr, &slottime[1], &len, NULL, 0) == -1) {
107: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
108: return -1;
109: } else
110: VERB(1) printf("Info:: get slottime(%d) %d ... OK!\n", len, slottime[1]);
111:
112: memset(szStr, 0, STRSIZ);
113: snprintf(szStr, STRSIZ, SC_ACKTIMEOUT, ifid);
114: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
115: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
116: return -1;
117: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
118: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
119: return -1;
120: } else
121: VERB(1) printf("Info:: get acktimeout(%d) %d ... OK!\n", len, timeout[1]);
122:
123: slottime[0] = (timeout[1] - 3 - cor) / 2;
124: VERB(3) printf("Info:: calculated slottime=%d\n", slottime[0]);
125: timeout[0] = (slottime[0] - 10) * 300;
126: VERB(3) printf("Info:: calculated timeout=%d\n", timeout[0]);
127:
128: return timeout[0];
129: }
130: // ----------------------------------------------------
131:
132: int
133: main(int argc, char **argv)
134: {
135: char ch, mode = 0;
136: int ret = 0, dist = 0, cor = 0, ino = 0;
137:
138: while ((ch = getopt(argc, argv, "hvti:d:c:")) != -1)
139: switch (ch) {
140: case 'v':
141: Verbose++;
142: break;
143: case 't':
144: mode |= 2;
145: break;
146: case 'i':
147: ino = strtol(optarg, NULL, 0);
148: if (ino < 0) {
149: printf("Error:: in interface number %d\n", ino);
150: return 1;
151: }
152: break;
153: case 'd':
154: mode |= 1;
155: dist = strtol(optarg, NULL, 0);
156: if (dist < 1) {
157: printf("Error:: in distance meters %d\n", dist);
158: return 1;
159: }
160: break;
161: case 'c':
162: mode |= 1;
163: cor = strtol(optarg, NULL, 0);
164: break;
165: case 'h':
166: default:
167: Usage();
168: return 1;
169: }
170: argc -= optind;
171: argv += optind;
172: if (!mode) {
173: printf("Error:: not selected mode for operation ...\n");
174: return 1;
175: }
176:
177: if (mode & 1)
178: if ((ret = calcDistance(ino, dist, cor)) < 1)
179: return 2;
180: if (mode & 2) {
181: if ((ret = calcTimeout(ino, cor)) < 1)
182: return 2;
183: else {
184: VERB(1)
185: printf("Maximum approximate distance ~%d meters\n", ret);
186: else
187: printf("~%d\n", ret);
188: }
189: }
190:
191: return 0;
192: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>