File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / coova-chilli / src / test-radius.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:48:25 2012 UTC (13 years, 1 month ago) by misho
Branches: coova-chilli, MAIN
CVS tags: v1_0_12, HEAD
coova-chilli

    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>