Annotation of embedaddon/coova-chilli/src/test-radius.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2006-2007 David Bird <david@coova.com>
3: *
4: */
5: #include "system.h"
6: #include "syserr.h"
7: #include "cmdline.h"
8: #include "dhcp.h"
9: #include "radius.h"
10: #include "radius_chillispot.h"
11: #include "radius_wispr.h"
12: #include "redir.h"
13: #include "chilli.h"
14: #include "options.h"
15:
16: static int chilliauth_cb(struct radius_t *radius,
17: struct radius_packet_t *pack,
18: struct radius_packet_t *pack_req, void *cbp) {
19: struct radius_attr_t *attr = NULL;
20: /*char attrs[RADIUS_ATTR_VLEN+1];*/
21: size_t offset = 0;
22:
23: if (!pack) {
24: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Radius request timed out");
25: return 0;
26: }
27:
28: if ((pack->code != RADIUS_CODE_ACCESS_REJECT) &&
29: (pack->code != RADIUS_CODE_ACCESS_CHALLENGE) &&
30: (pack->code != RADIUS_CODE_ACCESS_ACCEPT)) {
31: sys_err(LOG_ERR, __FILE__, __LINE__, 0,
32: "Unknown radius access reply code %d", pack->code);
33: return 0;
34: }
35:
36: /* ACCESS-ACCEPT */
37: if (pack->code != RADIUS_CODE_ACCESS_ACCEPT) {
38: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Administrative-User Login Failed");
39: return 0;
40: }
41:
42: while (!radius_getnextattr(pack, &attr,
43: RADIUS_ATTR_VENDOR_SPECIFIC,
44: RADIUS_VENDOR_CHILLISPOT,
45: RADIUS_ATTR_CHILLISPOT_CONFIG,
46: 0, &offset)) {
47: char value[RADIUS_ATTR_VLEN+1] = "";
48: strncpy(value, (const char *)attr->v.t, attr->l - 2);
49: printf("%s\n", value);
50: }
51:
52: return 0;
53:
54: }
55:
56: int static test_radius() {
57: struct radius_t *radius;
58: struct radius_packet_t radius_pack;
59: struct timeval idleTime;
60: int starttime;
61: int maxfd = 0;
62: fd_set fds;
63: int status;
64:
65: if (!options.adminuser || !options.adminpasswd) return 1;
66:
67: if (radius_new(&radius, &options.radiuslisten, 0, 0, NULL, 0, NULL, NULL, NULL)) {
68: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Failed to create radius");
69: return -1;
70: }
71:
72: radius_set(radius, 0, (options.debug & DEBUG_RADIUS));
73:
74: radius_set_cb_auth_conf(radius, chilliauth_cb);
75:
76: {int cnt=0; for (; cnt < RADIUS_QUEUESIZE * 2; cnt++) {
77:
78: if (radius_default_pack(radius, &radius_pack, RADIUS_CODE_ACCESS_REQUEST)) {
79: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "radius_default_pack() failed");
80: return -1;
81: }
82:
83: radius_addattr(radius, &radius_pack, RADIUS_ATTR_USER_NAME, 0, 0, 0,
84: (uint8_t *)options.adminuser, strlen(options.adminuser));
85:
86: radius_addattr(radius, &radius_pack, RADIUS_ATTR_USER_PASSWORD, 0, 0, 0,
87: (uint8_t *)options.adminpasswd, strlen(options.adminpasswd));
88:
89: radius_addnasip(radius, &radius_pack);
90:
91: radius_addattr(radius, &radius_pack, RADIUS_ATTR_SERVICE_TYPE, 0, 0,
92: RADIUS_SERVICE_TYPE_ADMIN_USER, NULL, 0);
93:
94: if (options.radiusnasid)
95: radius_addattr(radius, &radius_pack, RADIUS_ATTR_NAS_IDENTIFIER, 0, 0, 0,
96: (uint8_t *)options.radiusnasid, strlen(options.radiusnasid));
97:
98: if (options.nasmac)
99: radius_addattr(radius, &radius_pack, RADIUS_ATTR_CALLED_STATION_ID, 0, 0, 0,
100: (uint8_t *)options.nasmac, strlen(options.nasmac));
101:
102: radius_addattr(radius, &radius_pack, RADIUS_ATTR_NAS_PORT_TYPE, 0, 0,
103: options.radiusnasporttype, NULL, 0);
104:
105: if (options.radiuslocationid)
106: radius_addattr(radius, &radius_pack, RADIUS_ATTR_VENDOR_SPECIFIC,
107: RADIUS_VENDOR_WISPR, RADIUS_ATTR_WISPR_LOCATION_ID, 0,
108: (uint8_t *)options.radiuslocationid, strlen(options.radiuslocationid));
109:
110: if (options.radiuslocationname)
111: radius_addattr(radius, &radius_pack, RADIUS_ATTR_VENDOR_SPECIFIC,
112: RADIUS_VENDOR_WISPR, RADIUS_ATTR_WISPR_LOCATION_NAME, 0,
113: (uint8_t *)options.radiuslocationname,
114: strlen(options.radiuslocationname));
115:
116: radius_addattr(radius, &radius_pack, RADIUS_ATTR_MESSAGE_AUTHENTICATOR,
117: 0, 0, 0, NULL, RADIUS_MD5LEN);
118:
119: radius_req(radius, &radius_pack, NULL);
120:
121: if (radius->fd <= 0) {
122: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "not a valid socket!");
123: return -1;
124: }
125:
126: maxfd = radius->fd;
127:
128: starttime = time(NULL);
129: while ((starttime + REDIR_RADIUS_MAX_TIME) > time(NULL)) {
130: FD_ZERO(&fds);
131: FD_SET(radius->fd, &fds);
132:
133: idleTime.tv_sec = 0;
134: idleTime.tv_usec = REDIR_RADIUS_SELECT_TIME;
135: radius_timeleft(radius, &idleTime);
136:
137: switch (status = select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
138: case -1:
139: sys_err(LOG_ERR, __FILE__, __LINE__, errno, "select() returned -1!");
140: break;
141: case 0:
142: radius_timeout(radius);
143: default:
144: break;
145: }
146:
147: if (status > 0) {
148: if (FD_ISSET(radius->fd, &fds)) {
149: if (radius_decaps(radius) < 0) {
150: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "radius_ind() failed!");
151: }
152: break;
153: }
154: }
155: }
156:
157: }};
158:
159: radius_free(radius);
160: return 0;
161: }
162:
163: int main(int argc, char **argv)
164: {
165: if (process_options(argc, argv, 1))
166: exit(1);
167:
168: return test_radius();
169: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>