diff -Nur chillispot-1.1.0.orig/src/chilli.c chillispot-1.1.0/src/chilli.c --- chillispot-1.1.0.orig/src/chilli.c 2009-08-11 15:10:56.000000000 -0300 +++ chillispot-1.1.0/src/chilli.c 2009-08-13 13:17:24.000000000 -0300 @@ -102,6 +102,7 @@ #include "dhcp.h" #include "cmdline.h" #include "chilli.h" +#include "remotectrl.h" struct options_t options; @@ -127,6 +128,12 @@ /* Forward declarations */ int static acct_req(struct app_conn_t *conn, int status_type); int static config_radius(); +void admin_disconnect(struct app_conn_t *appconn, int terminateCause); +void admin_authorize(struct app_conn_t *appconn); +int send_acct_head( struct rmt_socket_t *client, struct app_conn_t *appconn); +int send_Connection( struct rmt_socket_t *client, struct app_conn_t *appconn ); +int send_Acct_Setting ( struct rmt_socket_t *client, struct app_conn_t *appconn ); +int send_Accounting( struct rmt_socket_t *client, struct app_conn_t *appconn ); /* Fireman catches falling childs and eliminates zombies */ void static fireman(int signum) { @@ -180,19 +187,18 @@ struct timeval timenow; uint64_t timediff; /* In microseconds */ int result = 0; - gettimeofday(&timenow, NULL); timediff = (timenow.tv_sec - conn->last_time.tv_sec) * ((uint64_t) 1000000); timediff += (timenow.tv_usec - conn->last_time.tv_usec); - /* if (options.debug) printf("Leaky bucket timediff: %lld, bucketup: %d, bucketdown: %d %d %d\n", - timediff, conn->bucketup, conn->bucketdown, - octetsup, octetsdown);*/ - - if (conn->bandwidthmaxup) { +/* if (options.debug) + printf("Leaky bucket timediff: %lld, bucketup: %d, bucketdown: %d %d %d\n", + timediff, conn->bucketup, conn->bucketdown, octetsup, octetsdown); +*/ + if (conn->bandwidthmaxup) { /* Subtract what the leak since last time we visited */ if (conn->bucketup > ((timediff * conn->bandwidthmaxup)/8000000)) { conn->bucketup -= (timediff * conn->bandwidthmaxup) / 8000000; @@ -200,9 +206,9 @@ else { conn->bucketup = 0; } - +// printf("octetsup: %d -> conn->bucketup+octetsup: %d > conn->bucketupsize: %d \n", octetsup, conn->bucketup + octetsup, conn->bucketupsize); if ((conn->bucketup + octetsup) > conn->bucketupsize) { - /*if (options.debug) printf("Leaky bucket deleting uplink packet\n");*/ + if (options.debug) printf("Leaky bucket deleting uplink packet\n"); result = -1; } else { @@ -217,9 +223,10 @@ else { conn->bucketdown = 0; } +// printf("octetsdown: %d -> conn->bucketdown+octetsdown: %d > conn->bucketdownsize: %d \n", octetsdown, conn->bucketdown + octetsdown, conn->bucketdownsize); if ((conn->bucketdown + octetsdown) > conn->bucketdownsize) { - /*if (options.debug) printf("Leaky bucket deleting downlink packet\n");*/ + if (options.debug) printf("Leaky bucket deleting downlink packet\n"); result = -1; } else { @@ -233,6 +240,7 @@ } #endif /* ifndef NO_LEAKY_BUCKET */ + /* Run external script */ int set_env(char *name, char *value, int len, struct in_addr *addr, @@ -550,7 +558,7 @@ return -1; } - if (cmdline_parser_configfile (args_info.conf_arg, &args_info, 0, 0, 0)) { + if (cmdline_parser_configfile (args_info.conf_arg, &args_info, 0, 0, 0)) { sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Failed to parse configuration file: %s!", args_info.conf_arg); @@ -1056,7 +1064,21 @@ strlen(args_info.macallowed_arg[numargs]))) return -1; } - + /* remote monitor */ + /* Defaults to net plus 1 */ + if (!args_info.rmtlisten_arg) + options.rmtlisten.s_addr = options.uamlisten.s_addr; + else + if (!inet_aton(args_info.rmtlisten_arg, &options.rmtlisten)){ + sys_err(LOG_ERR, __FILE__, __LINE__, 0, + "Invalid Remote monitor IP address: %s!", args_info.rmtlisten_arg); + return -1; + } + /* rmtport */ + options.rmtport = args_info.rmtport_arg; + options.rmtpasswd = args_info.rmtpasswd_arg; + options.bandwidthmaxup = args_info.bandwidthmaxup_arg; + options.bandwidthmaxdown = args_info.bandwidthmaxdown_arg; /* foreground */ /* If flag not given run as a daemon */ @@ -1095,7 +1117,6 @@ memcpy(&options, &options2, sizeof(options)); return; } - /* Options which we do not allow to be affected */ /* fg, conf and statedir are not stored in options */ options.net = options2.net; /* net */ @@ -1123,6 +1144,13 @@ options.eapolenable = options2.eapolenable; /* eapolenable */ options.pidfile = options2.pidfile; /* pidfile */ + options.rmtlisten = options2.rmtlisten; /* remote listen */ + options.rmtport = options2.rmtport; /* remote port */ + options.rmtpasswd = options2.rmtpasswd; /* remote password */ + +// options.bandwidthmaxup = options2.bandwidthmaxup; /* remote password */ +// options.bandwidthmaxdown = options2.bandwidthmaxdown; /* remote password */ + /* Reinit DHCP parameters */ (void) dhcp_set(dhcp, (options.debug & DEBUG_DHCP), options.uamserver, options.uamserverlen, options.uamanydns, @@ -3099,9 +3127,8 @@ appconn->bucketupsize = BUCKET_SIZE_MIN; #endif } - else { + else appconn->bandwidthmaxup = 0; - } /* Bandwidth down */ if (!radius_getattr(pack, &attr, RADIUS_ATTR_VENDOR_SPECIFIC, @@ -3116,9 +3143,8 @@ appconn->bucketdownsize = BUCKET_SIZE_MIN; #endif } - else { + else appconn->bandwidthmaxdown = 0; - } #ifdef RADIUS_ATTR_CHILLISPOT_BANDWIDTH_MAX_UP /* Bandwidth up */ @@ -3623,7 +3649,7 @@ appconn->input_octets +=len; #ifndef NO_LEAKY_BUCKET #ifdef COUNT_UPLINK_DROP - if (leaky_bucket(appconn, len, 0)) return 0; + if (leaky_bucket(appconn, len, 0)==-1) return 0; #endif /* ifdef COUNT_UPLINK_DROP */ #endif /* ifndef NO_LEAKY_BUCKET */ } @@ -3889,6 +3915,10 @@ struct sigaction act; struct itimerval itval; + struct rmt_socket_t srv; + struct rmt_socket_t client[MAX_CLIENTS]; + int activeClients = 0; /* Número clientes conectados */ + /* open a connection to the syslog daemon */ /*openlog(PACKAGE, LOG_PID, LOG_DAEMON);*/ openlog(PACKAGE, (LOG_PID | LOG_PERROR), LOG_DAEMON); @@ -4046,6 +4076,8 @@ if (options.debug) printf("Waiting for client request...\n"); + + srv = rmtctrl_initSrv(options.rmtlisten, options.rmtport); /******************************************************************/ /* Main select loop */ @@ -4053,6 +4085,8 @@ while (keep_going) { + rmtctrl_srv(srv,client,&activeClients); + if (do_timeouts) { /*if (options.debug) printf("Do timeouts!\n");*/ (void) radius_timeout(radius); @@ -4178,3 +4212,487 @@ return 0; } + +void rmtctrl_msg_proccess(struct rmt_socket_t *client) +{ + msg_head_t header; + char *msg=NULL; + char *reg=NULL; + struct app_conn_t *appconn; + struct dhcp_conn_t *dhcpconn; + char str[2048]; + int found=0; + int rslt=0; + int n; + uint64_t l; + rslt = rmtctrl_read_msg(client,&header,&msg); + if (rslt > 0) + { + switch (header.id) + { + case QRY_CONNECTED_LIST: + rslt += send_srvData(client); + rslt += rmtctrl_write_msg(client,MSG_START,0, "\n" ); + rslt += rmtctrl_write_msg(client,MSG_PART,0, "Ord ---------- User Name ----------- -- MAC Address -- -- IP Address - -- Input - - Output - Sta\n" ); + for (n=0; ninuse != 0)){ + dhcpconn = (struct dhcp_conn_t*) appconn->dnlink; + found++; + l = found; + rslt += send_number(client, MSG_PART, 0, "%3s ", l); + rslt += send_line(client,MSG_PART,0, "%-32s ",appconn->proxyuser); + rslt += send_mac(client,MSG_PART,0, "%17s ",appconn->hismac); + rslt += send_line(client,MSG_PART,0, "%15s ",inet_ntoa(appconn->hisip)); + rslt += send_number(client,MSG_PART,0, "%10s ",appconn->input_octets); + rslt += send_number(client,MSG_PART,0, "%10s ",appconn->output_octets); + rslt += send_number(client, MSG_PART, 0, " %s ",appconn->authenticated); + rslt += send_number(client, MSG_PART, 0, " %s \n",dhcpconn->authstate); + } + } + rslt += send_number(client,MSG_END,found, "Total of connected device(s) %s\n",found); + break; + case QRY_CONNECTED_FULL_LIST: + rslt += send_srvData(client); + rslt += rmtctrl_write_msg(client,MSG_START,0, "\n" ); + for (n=0; ninuse != 0)){ + found++; + l = found; + rslt += send_number(client, MSG_PART, 0, "Connection : %s\n{\n", l); + rslt += send_acct_head( client, appconn); + rslt += send_line(client, MSG_PART, 0, "%s\n", "}"); + } + } + rslt += send_number(client, MSG_END, found, "Total of connected device(s) %s\n",found); + break; + case QRY_STATUS: + /// + rslt += send_Status(client, appconn); + break; + case CMD_AUTHORIZE: + for (n=0; ninuse != 0) && (appconn->authenticated == 0)) + { + switch (header.extra) + { + case EXTRA_MAC_OP: + if ( strcmp(msg,mac2str(appconn->hismac)) == 0) + { + found++; + l=1; + break; + } + break; + case EXTRA_IP_OP: + if ( strcmp(msg,inet_ntoa(appconn->hisip)) == 0) + { + found++; + l=1; + break; + } + break; + case EXTRA_USER_OP: + if ( strcmp(msg,appconn->proxyuser) == 0) + { + found++; + l=1; + break; + } + break; + default: + found++; + l=1; + break; + } + if ( l == 1 ){ + admin_authorize(appconn); + rslt += send_srvData( client ); + rslt += rmtctrl_write_msg(client,MSG_PART,0, " \n" ); + rslt += send_acct_head( client, appconn); + sys_err(LOG_NOTICE, __FILE__, __LINE__, 0, + "Admin Authorize MAC=%s IP=%s", + mac2str(appconn->hismac), inet_ntoa(appconn->hisip)); + } + } + } + if (found == 0) + rslt += rmtctrl_write_msg(client,MSG_END,0, "Not device found to Authorze\n" ); + else + { + rslt += send_number(client, MSG_END, found, "Autorized %s device(s)\n",found); + } + break; + case CMD_DISCONNECT: + for (n=0; ninuse != 0) && (appconn->authenticated == 1)) + { + if (dhcpconn = (struct dhcp_conn_t*) appconn->dnlink) { + switch (header.extra) + { + case EXTRA_MAC_OP: + if ( strcmp(msg,mac2str(appconn->hismac)) == 0) + { + found++; + l=1; + break; + } + break; + case EXTRA_IP_OP: + if ( strcmp(msg,inet_ntoa(appconn->hisip)) == 0) + { + found++; + l=1; + break; + } + break; + case EXTRA_USER_OP: + if ( strcmp(msg,appconn->proxyuser) == 0) + { + found++; + l=1; + break; + } + break; + default: + found++; + l=1; + break; + } + if ( l == 1 ) { + rslt += send_srvData( client ); + rslt += rmtctrl_write_msg(client,MSG_PART,0, " \n" ); + rslt += send_acct_head( client, appconn); + admin_disconnect(appconn, RADIUS_TERMINATE_CAUSE_ADMIN_RESET); + sys_err(LOG_NOTICE, __FILE__, __LINE__, 0, + "Admin Disconnect username=%s IP=%s", + appconn->user, inet_ntoa(appconn->hisip)); + } + } + } + } + if (found == 0) + rslt += rmtctrl_write_msg(client,MSG_END,0, "Not decice found to Disconnect\n" ); + else + { + rslt += send_number(client, MSG_END, found, "Disconnect %s device(s)\n",found); + } + break; + default: + rslt += rmtctrl_write_msg(client,MSG_END,0, "Unknow command.\n" ); + break; + } + } + else + { + printf("Desde %s se recibieron %d bytes y se enviaron %d bytes\n",inet_ntoa(client->addr.sin_addr),client->Rx,client->Tx); + close(client->fd); /* cierra fd_rmt_client */ + printf("Client cerro conexión desde %s\n",inet_ntoa(client->addr.sin_addr) ); + client->fd = -1; + } + if(msg) + free(msg); +} + +void admin_authorize(struct app_conn_t *appconn) +{ + struct radius_packet_t radius_pack; + strcpy(appconn->user,"Admin-Authorize"); + strcpy(appconn->proxyuser,"Admin-Authorize"); + appconn->proxyuserlen = strlen(appconn->proxyuser); + appconn->interim_interval = 600; + appconn->terminate_cause = 0; + appconn->idletimeout = 300; + + radius_default_pack(radius, &radius_pack, RADIUS_CODE_ACCESS_REQUEST); + radius_pack.code = RADIUS_CODE_ACCESS_REQUEST; +// (void) radius_addattr(radius, &radius_pack, RADIUS_ATTR_USER_NAME, 0, 0, 0, +// (uint8_t*) appconn->proxyuser, appconn->proxyuserlen); + + if ( options.bandwidthmaxup > 0 ){ + appconn->bandwidthmaxup = options.bandwidthmaxup * 1024; + appconn->bucketupsize = BUCKET_TIME * appconn->bandwidthmaxup / 8000; + if (appconn->bucketupsize < BUCKET_SIZE_MIN) + appconn->bucketupsize = BUCKET_SIZE_MIN; + } + if ( options.bandwidthmaxdown > 0 ){ + appconn->bandwidthmaxdown = options.bandwidthmaxdown * 1024; + appconn->bucketdownsize = BUCKET_TIME * appconn->bandwidthmaxdown / 8000; + if (appconn->bucketdownsize < BUCKET_SIZE_MIN) + appconn->bucketdownsize = BUCKET_SIZE_MIN; + } + dnprot_accept(appconn); +} + +void admin_disconnect(struct app_conn_t *appconn, int terminateCause) +{ + dnprot_terminate(appconn); + (void) acct_req(appconn, RADIUS_STATUS_TYPE_STOP); + set_sessionid(appconn); +} + +int send_acct_head( struct rmt_socket_t *client, struct app_conn_t *appconn) +{ + int rslt; + rslt += send_Connection( client, appconn ); + rslt += send_Acct_Setting( client, appconn ); + rslt += send_Accounting( client, appconn ); + return rslt; +} + +int send_Connection( struct rmt_socket_t *client, struct app_conn_t *appconn ) +{ + int rslt; + uint64_t l; + rslt += send_line(client, MSG_PART, 0, "\tSession-Id = %s\n",appconn->sessionid); + rslt += send_line(client, MSG_PART, 0, "\tUser-Name = %s\n",appconn->user); +// rslt = send_line(client, MSG_PART, 0, "\tnasip=%s\n",appconn->nasip); + rslt += send_mac(client, MSG_PART, 0, "\tClient-Mac-Address = %s\n",appconn->hismac); + rslt += send_mac(client, MSG_PART, 0, "\tNas-Mac-Address = %s\n",appconn->ourmac); +// rslt += send_line(client, MSG_PART, 0, "\tourip=%s\n",inet_ntoa(appconn->ourip)); + rslt += send_line(client, MSG_PART, 0, "\tClient-Ip = %s\n",inet_ntoa(appconn->hisip)); + rslt += send_line(client, MSG_PART, 0, "\tClient-Require-Ip = %s\n",inet_ntoa(appconn->reqip)); + rslt += send_number(client, MSG_PART, 0, "\tAutheticated = %s\n",appconn->authenticated); + l = appconn->uamtime; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tUAM-Time = %s\n",l); + if (strlen(appconn->userurl)>0) + rslt = send_line(client, MSG_PART, 0, "\tUser-URL = %s\n",appconn->userurl); + return rslt; +} + +int send_Acct_Setting ( struct rmt_socket_t *client, struct app_conn_t *appconn ) +{ + int rslt = 0; + uint64_t l; + if (appconn->authenticated == 0 ) return 0; + /* Account Settings */ + l = appconn->sessionterminatetime; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tSession-Terminate-Time = %s\n",l); + l = appconn->sessiontimeout; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tSession-Timeout = %s\n",l); + l = appconn->idletimeout; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tIdle-Timeout = %s\n",l); + l = appconn->bandwidthmaxup; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tBandwidth-Max-Up = %s\n",l); + l = appconn->bandwidthmaxdown; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tBandwidth-Max-Down = %s\n",l); + l = appconn->maxinputoctets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tMax-Input-Octets = %s\n",l); + l = appconn->maxoutputoctets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tMax-Output-Octets = %s\n",l); + l = appconn->maxtotaloctets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tMax-Total-Octets = %s\n",l); + return rslt; +} + +int send_Accounting( struct rmt_socket_t *client, struct app_conn_t *appconn ) +{ + if (appconn->authenticated == 0 ) return 0; + int rslt = 0; + uint64_t l; + l = appconn->start_time.tv_sec; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tStart-Time = %s\n",l); + l = appconn->interim_time.tv_sec; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tInterim-Time = %s\n",l); + l = appconn->interim_interval; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tInterim-Interval = %s\n",l); + l = appconn->last_time.tv_sec; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tLast-Time = %s\n",l); + l = appconn->input_packets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tInput-Packets = %s\n",l); + l = appconn->output_packets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tOutput-Packets = %s\n",l); + l = appconn->input_octets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tInput-Octets = %s\n",l); + l = appconn->output_octets; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tOutput-Octets = %s\n",l); + l = appconn->terminate_cause; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tTerminate-Cause = %s\n",l); + l = appconn->bucketup; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tBucket-Up = %s\n",l); + l = appconn->bucketdown; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tBucket-Down = %s\n",l); + l = appconn->bucketupsize; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tBucket-Up-Size = %s\n",l); + l = appconn->bucketdownsize; + if (l > 0) + rslt += send_number(client, MSG_PART, 0, "\tBucket-Down-Size = %s\n",l); + return rslt; +} + +int send_srvData( struct rmt_socket_t *client) +{ + int rslt=0; + rslt += send_line(client, MSG_PART, 0, "%s\n",options.radiusnasid); + if (options.radiuslocationid) + rslt += send_line(client, MSG_PART, 0, "\tLOCATION ID:%s\n",options.radiuslocationid); + if (options.radiuslocationname) + rslt += send_line(client, MSG_PART, 0, "\tLOCATION NAME:%s\n",options.radiuslocationname); +// rslt += send_line(client, MSG_PART, 0, "\tDEVICE: %s ",tun->devname); +// rslt += send_line(client, MSG_PART, 0, "INTERFACE: %s\n",options.dhcpif); +// rslt += send_line(client, MSG_PART, 0, "\tIP ADDR: %s ",inet_ntoa(options.dhcplisten)); +// rslt += send_line(client, MSG_PART, 0, "NETWORK: %s ",inet_ntoa(options.net)); +// rslt += send_line(client, MSG_PART, 0, "MASK: %s\n",inet_ntoa(options.mask)); + if (options.dns1.s_addr) + rslt += send_line(client, MSG_PART, 0, "\tDNS SERVERS: %s - ",inet_ntoa(options.dns1)); + if (options.dns2.s_addr) + rslt += send_line(client, MSG_PART, 0, "%s\n",inet_ntoa(options.dns2)); + rslt += send_line(client, MSG_PART, 0, "\tRADIUS SERVERS: %s - ",inet_ntoa(options.radiusserver1)); + rslt += send_line(client, MSG_PART, 0, "%s\n",inet_ntoa(options.radiusserver2)); + return rslt; +} + +int send_Status( struct rmt_socket_t *client, struct app_conn_t *appconn ) +{ + int rslt = 0; + int n; + uint64_t l; + l = options.debug; + rslt += send_number(client, MSG_PART, 0, "\tdebug=%s\n",l); + /* conf */ + l = options.interval; + rslt += send_number(client, MSG_PART, 0, "\tinterval=%s\n",l); + rslt += send_line(client, MSG_PART, 0, "\tpidfile=%s\n",options.pidfile); + /* TUN parameters */ + rslt += send_line(client, MSG_PART, 0, "\tnet=%s\n",inet_ntoa(options.net)); /* Network IP address */ + rslt += send_line(client, MSG_PART, 0, "\tmask=%s\n",inet_ntoa(options.mask)); /* Network mask */ + rslt += send_line(client, MSG_PART, 0, "\tnetc=%s\n",options.netc); + rslt += send_line(client, MSG_PART, 0, "\tmaskc=%s\n",options.maskc); + l = options.allowdyn; + rslt += send_number(client, MSG_PART, 0, "\tallowdyn=%s\n",l); /* Allow dynamic address allocation */ + rslt += send_line(client, MSG_PART, 0, "\tdynip=%s\n",options.dynip); /* Dynamic IP address pool */ + + l = options.allowstat; + rslt += send_number(client, MSG_PART, 0, "\tallowstat=%s\n",l); /* Allow static address allocation */ + rslt += send_line(client, MSG_PART, 0, "\tstatip=%s\n",options.statip); /* Static IP address pool */ + + rslt += send_line(client, MSG_PART, 0, "\tdns1=%s\n",inet_ntoa(options.dns1)); /* Primary DNS server IP address */ + rslt += send_line(client, MSG_PART, 0, "\tdns2=%s\n",inet_ntoa(options.dns2)); /* Secondary DNS server IP address */ + rslt += send_line(client, MSG_PART, 0, "\tdomain=%s\n",options.domain); /* Domain to use for DNS lookups */ + rslt += send_line(client, MSG_PART, 0, "\tipup=%s\n",options.ipup); /* Script to run after link-up */ + rslt += send_line(client, MSG_PART, 0, "\tipdown=%s\n",options.ipdown); /* Script to run after link-down */ + rslt += send_line(client, MSG_PART, 0, "\tconup=%s\n",options.conup); /* Script to run after user logon */ + rslt += send_line(client, MSG_PART, 0, "\tcondown=%s\n",options.condown); /* Script to run after user logoff */ + /* Radius parameters */ + rslt += send_line(client, MSG_PART, 0, "\tradiuslisten=%s\n",inet_ntoa(options.radiuslisten)); /* IP address to listen to */ + rslt += send_line(client, MSG_PART, 0, "\tradiusserver1=%s\n",inet_ntoa(options.radiusserver1)); /* IP address of radius server 1 */ + rslt += send_line(client, MSG_PART, 0, "\tradiusserver2=%s\n",inet_ntoa(options.radiusserver2)); /* IP address of radius server 2 */ + l = options.radiusauthport; + rslt += send_number(client, MSG_PART, 0, "\tradiusauthport=%s\n",l); /* Authentication UDP port */ + l = options.radiusacctport; + rslt += send_number(client, MSG_PART, 0, "\tradiusacctport=%s\n",l); /* Accounting UDP port */ + rslt += send_line(client, MSG_PART, 0, "\tradiussecret=%s\n",options.radiussecret); /* Radius shared secret */ + rslt += send_line(client, MSG_PART, 0, "\tradiusnasid=%s\n",options.radiusnasid); /* Radius NAS-Identifier */ + rslt += send_line(client, MSG_PART, 0, "\tradiuscalled=%s\n",options.radiuscalled); /* Radius Called-Station-ID */ + rslt += send_line(client, MSG_PART, 0, "\tradiusnasip=%s\n",inet_ntoa(options.radiusnasip)); /* Radius NAS-IP-Address */ + rslt += send_line(client, MSG_PART, 0, "\tradiuslocationid=%s\n",options.radiuslocationid); /* WISPr location ID */ + rslt += send_line(client, MSG_PART, 0, "\tradiuslocationname=%s\n",options.radiuslocationname); /* WISPr location name */ + l = options.radiusnasporttype; + rslt += send_number(client, MSG_PART, 0, "\tradiusnasporttype=%s\n",l); /* NAS-Port-Type */ + l = options.coaport; + rslt += send_number(client, MSG_PART, 0, "\tcoaport=%s\n",l); /* UDP port to listen to */ + l = options.coanoipcheck; + rslt += send_number(client, MSG_PART, 0, "\tcoaipcheck=%s\n",l); /* Allow disconnect from any IP */ + /* Radius proxy parameters */ + rslt += send_line(client, MSG_PART, 0, "\tproxylisten=%s\n",inet_ntoa(options.proxylisten)); /* IP address to listen to */ + l = options.proxyport; + rslt += send_number(client, MSG_PART, 0, "\tproxyport=%s\n",l); /* UDP port to listen to */ + rslt += send_line(client, MSG_PART, 0, "\tproxyaddr=%s\n",inet_ntoa(options.proxyaddr)); /* IP address of proxy client(s) */ + rslt += send_line(client, MSG_PART, 0, "\tproxymask=%s\n",inet_ntoa(options.proxymask)); /* IP mask of proxy client(s) */ + rslt += send_line(client, MSG_PART, 0, "\tproxysecret=%s\n",options.proxysecret); /* Proxy shared secret */ + /* Radius configuration management parameters */ + rslt += send_line(client, MSG_PART, 0, "\tconfusername=%s\n",options.confusername); /* Username for remote config */ + rslt += send_line(client, MSG_PART, 0, "\tconfpassword=%s\n",options.confpassword); /* Password for remote config */ + /* DHCP parameters */ + l = options.nodhcp; + rslt += send_number(client, MSG_PART, 0, "\tnodhcp=%s\n",l); /* Do not use DHCP */ + rslt += send_line(client, MSG_PART, 0, "\tdhcpif=%s\n",options.dhcpif); /* Interface: eth0 */ + rslt += send_mac(client, MSG_PART, 0, "\tdhcpmac=%s\n",options.dhcpmac); /* Interface MAC address */ + l = options.dhcpusemac; + rslt += send_number(client, MSG_PART, 0, "\tdhcpusemac=%s\n",l); /* Use given MAC or interface default */ + rslt += send_line(client, MSG_PART, 0, "\tdhcplisten=%s\n",inet_ntoa(options.dhcplisten)); /* IP address to listen to */ + l = options.lease; + rslt += send_number(client, MSG_PART, 0, "\tlease=%s\n",l); /* DHCP lease time */ + /* EAPOL parameters */ + l = options.eapolenable; + rslt += send_number(client, MSG_PART, 0, "\teapolenable=%s\n",l); /* Use eapol */ + /* UAM parameters */ + l = options.uamserverlen; + rslt += send_number(client, MSG_PART, 0, "\tuamserverlen=%s\n",l); /* Number of UAM servers */ + for (n = 0; n < options.uamserverlen; n++){ + rslt += send_number(client, MSG_PART, 0, "\tuamokip[%s]=",n); + rslt += send_line(client, MSG_PART, 0, "%s\n",inet_ntoa(options.uamserver[n])); /* IP address of UAM server */ + } + l = options.uamserverport; + rslt += send_number(client, MSG_PART, 0, "\tuamserverport=%s\n",l); /* Port of UAM server */ + rslt += send_line(client, MSG_PART, 0, "\tuamsecret=%s\n",options.uamsecret); /* Shared secret */ + rslt += send_line(client, MSG_PART, 0, "\tuamurl=%s\n",options.uamurl); /* URL of authentication server */ + rslt += send_line(client, MSG_PART, 0, "\tuamhomepage=%s\n",options.uamhomepage); /* URL of redirection homepage */ + l = options.uamhomepageport; + rslt += send_number(client, MSG_PART, 0, "\tuamhomepageport=%s\n",l); /* Port of redirection homepage */ + rslt += send_line(client, MSG_PART, 0, "\tuamlisten=%s\n",inet_ntoa(options.uamlisten)); /* IP address of local authentication */ + l = options.uamport; + rslt += send_number(client, MSG_PART, 0, "\tuamport=%s\n",l); /* TCP port to listen to */ + l = options.uamokiplen; + rslt += send_number(client, MSG_PART, 0, "\tuamokiplen=%s\n",l); /* Number of allowed IP addresses */ + for (n=0; n < options.uamokiplen; n++){ + rslt += send_number(client, MSG_PART, 0, "\tuamokip[%s]=",n); + rslt = send_line(client, MSG_PART, 0, "%s\n",inet_ntoa(options.uamokip[n])); /* List of allowed IP addresses */ + } + l = options.uamoknetlen; + rslt += send_number(client, MSG_PART, 0, "\tuamoknetlen=%s\n",l); /* Number of networks */ + for (n=0; n < options.uamoknetlen; n++){ + rslt += send_number(client, MSG_PART, 0, "\tuamoknet[%s]=",n); + rslt += send_line(client, MSG_PART, 0, "%s/",inet_ntoa(options.uamokaddr[n])); /* List of allowed network IP */ + rslt += send_line(client, MSG_PART, 0, "%s\n",inet_ntoa(options.uamokmask[n])); /* List of allowed network mask */ + } + l = options.uamanydns; + rslt += send_number(client, MSG_PART, 0, "\tuamanydns=%s\n",l); /* Allow client to use any DNS server */ + /* MAC Authentication */ + l = options.macauth; + rslt += send_number(client, MSG_PART, 0, "\tmacauth=%s\n",l); /* Use MAC authentication */ + l = options.macoklen; + rslt += send_number(client, MSG_PART, 0, "\tmacoklen=%s\n",l); /* Number of MAC addresses */ + for (n=0; n < options.macoklen; n++){ + rslt += send_number(client, MSG_PART, 0, "\tmacok[%s]=",n); + rslt += send_mac(client, MSG_PART, 0, "\%s\n",options.macok[n]); /* Allowed MACs */ + } + rslt += send_line(client, MSG_PART, 0, "\tmacsuffix=%s\n",options.macsuffix); + rslt += send_line(client, MSG_PART, 0, "\tmacpasswd=%s\n",options.macpasswd); + + rslt += send_line(client, MSG_PART, 0, "\trmtlisten=%s\n",inet_ntoa(options.rmtlisten)); + l = options.rmtport; + rslt += send_number(client, MSG_PART, 0, "\trmtport=%s\n",l); /* Number of MAC addresses */ + rslt += send_line(client, MSG_PART, 0, "\trmtpasswd=%s\n",options.rmtpasswd); + rslt += send_number(client, MSG_PART, 0, "\tbandwidthmaxup=%s\n",options.bandwidthmaxup); + rslt += send_number(client, MSG_PART, 0, "\tbandwidthmaxdown=%s\n",options.bandwidthmaxdown); + rslt += rmtctrl_write_msg(client,MSG_END,0, "End of configuration\n"); +} diff -Nur chillispot-1.1.0.orig/src/chilli.h chillispot-1.1.0/src/chilli.h --- chillispot-1.1.0.orig/src/chilli.h 2009-08-11 15:10:56.000000000 -0300 +++ chillispot-1.1.0/src/chilli.h 2009-08-12 13:52:24.000000000 -0300 @@ -50,8 +50,8 @@ /* If the constants below are defined packets which have been dropped by the traffic shaper will be counted towards accounting and volume limitation */ -/* #define COUNT_DOWNLINK_DROP 1 */ -/* #define COUNT_UPLINK_DROP 1 */ +#define COUNT_DOWNLINK_DROP 1 +#define COUNT_UPLINK_DROP 1 #define APP_NUM_CONN 128 #define EAP_LEN 2048 /* TODO: Rather large */ @@ -68,7 +68,7 @@ #define CHALLENGESIZE 24 /* From chap.h MAX_CHALLENGE_LENGTH */ #define USERURLSIZE 256 /* Max length of URL requested by user */ -#define BUCKET_SIZE 300000 /* Size of leaky bucket (~200 packets) */ +//#define BUCKET_SIZE 300000 /* Size of leaky bucket (~200 packets) */ /* Time length of leaky bucket in milliseconds */ /* Bucket size = BUCKET_TIME * Bandwidth-Max radius attribute */ @@ -194,12 +194,14 @@ struct in_addr dns1; struct in_addr dns2; struct timeval last_time; /* Last time a packet was received or sent */ + struct timeval last_up_time; /* Last time a packet was received or sent */ + struct timeval last_down_time; /* Last time a packet was received or sent */ /* Leaky bucket */ - uint32_t bucketup; - uint32_t bucketdown; - uint32_t bucketupsize; - uint32_t bucketdownsize; + uint64_t bucketup; + uint64_t bucketdown; + uint64_t bucketupsize; + uint64_t bucketdownsize; /* UAM information */ uint8_t uamchal[REDIR_MD5LEN]; @@ -305,6 +307,11 @@ int macoklen; /* Number of MAC addresses */ char* macsuffix; /* Suffix to add to MAC address */ char* macpasswd; /* Password to use for MAC authentication */ + struct in_addr rmtlisten; /* IP address of remote monitor and config */ + int rmtport; /* TCP port to listen to monitor and config*/ + char* rmtpasswd; /* Password to use for MAC authentication */ + int bandwidthmaxup; /* Default Max Up Bandwith setting */ + int bandwidthmaxdown; /* Default Max Up Bandwith setting */ }; extern struct app_conn_t connection[APP_NUM_CONN]; Los ficheros binarios chillispot-1.1.0.orig/src/chilli.o y chillispot-1.1.0/src/chilli.o son distintos diff -Nur chillispot-1.1.0.orig/src/cmdline.c chillispot-1.1.0/src/cmdline.c --- chillispot-1.1.0.orig/src/cmdline.c 2006-09-24 14:48:26.000000000 -0300 +++ chillispot-1.1.0/src/cmdline.c 2009-08-11 16:17:58.000000000 -0300 @@ -113,6 +113,11 @@ args_info->macallowed_given = 0 ; args_info->macsuffix_given = 0 ; args_info->macpasswd_given = 0 ; + args_info->rmtlisten_given = 0 ; + args_info->rmtport_given = 0 ; + args_info->rmtpasswd_given = 0 ; + args_info->bandwidthmaxup_given = 0 ; + args_info->bandwidthmaxdown_given = 0 ; } static @@ -216,7 +221,19 @@ args_info->macsuffix_orig = NULL; args_info->macpasswd_arg = gengetopt_strdup ("password"); args_info->macpasswd_orig = NULL; - + args_info->rmtport_arg = 3991; + args_info->rmtport_orig = NULL; + args_info->rmtlisten_arg = gengetopt_strdup("127.0.0.1"); + args_info->rmtlisten_orig = NULL; + args_info->rmtport_orig = NULL; + args_info->rmtpasswd_arg = NULL; + args_info->rmtpasswd_orig = NULL; + + args_info->bandwidthmaxup_arg = 0; + args_info->bandwidthmaxup_orig = NULL; + args_info->bandwidthmaxdown_arg = 0; + args_info->bandwidthmaxdown_orig = NULL; + } void @@ -284,7 +301,12 @@ printf("%s\n"," --macauth Authenticate based on MAC address \n (default=off)"); printf("%s\n"," --macallowed=STRING List of allowed MAC addresses"); printf("%s\n"," --macsuffix=STRING Suffix to add to the MAC address"); - printf("%s\n"," --macpasswd=STRING Password used when performing MAC \n authentication (default=`password')"); + printf("%s\n"," --macpasswd=STRING Password used when performing MAC \n authentication (default='password')"); + printf("%s\n"," --rmtlisten=STRING IP address to listen to for monitor and \n configuration (default=`127.0.0.1')"); + printf("%s\n"," --rmtport=INT TCP port to bind to for monitor and \n configuration (default=`3991')"); + printf("%s\n"," --rmtpasswd=STRING Password used for remote monitor and \n configuration\n"); + printf("%s\n"," --bandwidthmaxup=INT Deafaul Max Up Setting in Kilobits\n"); + printf("%s\n"," --bandwidthmaxdown=INT Deafaul Max Down Setting in Kilobits\n"); } @@ -675,6 +697,11 @@ free (args_info->uamport_orig); /* free previous argument */ args_info->uamport_orig = 0; } + if (args_info->macpasswd_orig) + { + free (args_info->macpasswd_orig); /* free previous argument */ + args_info->macpasswd_orig = 0; + } if (args_info->uamallowed_arg) { for (i = 0; i < args_info->uamallowed_given; ++i) @@ -739,6 +766,34 @@ free (args_info->macpasswd_orig); /* free previous argument */ args_info->macpasswd_orig = 0; } + if (args_info->rmtlisten_orig) + { + free (args_info->rmtlisten_orig); /* free previous argument */ + args_info->rmtlisten_orig = 0; + } + if (args_info->rmtport_orig) + { + free (args_info->rmtport_orig); /* free previous argument */ + args_info->rmtport_orig = 0; + } + + if (args_info->rmtpasswd_orig) + { + free (args_info->rmtpasswd_orig); // free previous argument + args_info->rmtpasswd_orig = 0; + } + + if (args_info->bandwidthmaxup_orig) + { + free (args_info->bandwidthmaxup_orig); // free previous argument + args_info->bandwidthmaxup_orig = 0; + } + + if (args_info->bandwidthmaxdown_orig) + { + free (args_info->bandwidthmaxdown_orig); // free previous argument + args_info->bandwidthmaxdown_orig = 0; + } clear_given (args_info); } @@ -1109,7 +1164,41 @@ fprintf(outfile, "%s\n", "macpasswd"); } } - + if (args_info->rmtlisten_given) { + if (args_info->rmtlisten_orig) { + fprintf(outfile, "%s=\"%s\"\n", "rmtlisten", args_info->rmtlisten_orig); + } else { + fprintf(outfile, "%s\n", "rmtlisten"); + } + } + if (args_info->rmtport_given) { + if (args_info->rmtport_orig) { + fprintf(outfile, "%s=\"%s\"\n", "rmtport", args_info->rmtport_orig); + } else { + fprintf(outfile, "%s\n", "rmtport"); + } + } + if (args_info->rmtpasswd_given) { + if (args_info->rmtpasswd_orig) { + fprintf(outfile, "%s=\"%s\"\n", "rmtpasswd", args_info->rmtpasswd_orig); + } else { + fprintf(outfile, "%s\n", "rmtpasswd"); + } + } + if (args_info->bandwidthmaxup_given) { + if (args_info->bandwidthmaxup_orig) { + fprintf(outfile, "%s=\"%s\"\n", "bandwidthmaxup", args_info->bandwidthmaxup_orig); + } else { + fprintf(outfile, "%s\n", "bandwidthmaxup"); + } + } + if (args_info->bandwidthmaxdown_given) { + if (args_info->bandwidthmaxdown_orig) { + fprintf(outfile, "%s=\"%s\"\n", "bandwidthmaxdown", args_info->bandwidthmaxdown_orig); + } else { + fprintf(outfile, "%s\n", "bandwidthmaxdown"); + } + } fclose (outfile); i = EXIT_SUCCESS; @@ -1221,6 +1310,7 @@ { int c; /* Character of the parsed option. */ char *multi_token, *multi_next; /* for multiple options */ + char quehace[100]; int i; /* Counter */ @@ -1299,6 +1389,11 @@ { "macallowed", 1, NULL, 0 }, { "macsuffix", 1, NULL, 0 }, { "macpasswd", 1, NULL, 0 }, + { "rmtport", 1, NULL, 0 }, + { "rmtlisten", 1, NULL, 0 }, + { "rmtpasswd", 1, NULL, 0 }, + { "bandwidthmaxup", 1, NULL, 0 }, + { "bandwidthmaxdown", 1, NULL, 0 }, { NULL, 0, NULL, 0 } }; @@ -1380,8 +1475,6 @@ free (args_info->net_orig); /* free previous string */ args_info->net_orig = gengetopt_strdup (optarg); break; - - case 0: /* Long option with no short option */ /* Which modules to print debug messages for. */ if (strcmp (long_options[option_index].name, "debugfacility") == 0) @@ -2273,7 +2366,93 @@ free (args_info->macpasswd_orig); /* free previous string */ args_info->macpasswd_orig = gengetopt_strdup (optarg); } - + /* IP address to listen to for remote monitor and config. */ + else if (strcmp (long_options[option_index].name, "rmtlisten") == 0) + { + if (local_args_info.rmtlisten_given) + { + fprintf (stderr, "%s: `--rmtlisten' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->rmtlisten_given && ! override) + continue; + local_args_info.rmtlisten_given = 1; + args_info->rmtlisten_given = 1; + if (args_info->rmtlisten_arg) + free (args_info->rmtlisten_arg); /* free previous string */ + args_info->rmtlisten_arg = gengetopt_strdup (optarg); + if (args_info->rmtlisten_orig) + free (args_info->rmtlisten_orig); /* free previous string */ + args_info->rmtlisten_orig = gengetopt_strdup (optarg); + } + /* TCP port to bind to for authentication requests. */ + else if (strcmp (long_options[option_index].name, "rmtport") == 0) + { + if (local_args_info.rmtport_given) + { + fprintf (stderr, "%s: `--rmtport' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->rmtport_given && ! override) + continue; + local_args_info.rmtport_given = 1; + args_info->rmtport_given = 1; + args_info->rmtport_arg = strtol (optarg,&stop_char,0); + if (args_info->rmtport_orig) + free (args_info->rmtport_orig); /* free previous string */ + args_info->rmtport_orig = gengetopt_strdup (optarg); + } + /* Password used when performing remote config. */ + else if (strcmp (long_options[option_index].name, "rmtpasswd") == 0) + { + if (local_args_info.rmtpasswd_given) + { + fprintf (stderr, "%s: `--rmtpasswd' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->rmtpasswd_given && ! override) + continue; + local_args_info.rmtpasswd_given = 1; + args_info->rmtpasswd_given = 1; + if (args_info->rmtpasswd_arg) + free (args_info->rmtpasswd_arg); // free previous string + args_info->rmtpasswd_arg = gengetopt_strdup (optarg); + if (args_info->rmtpasswd_orig) + free (args_info->rmtpasswd_orig); // free previous string + args_info->rmtpasswd_orig = gengetopt_strdup (optarg); + } + else if (strcmp (long_options[option_index].name, "bandwidthmaxup") == 0) + { + if (local_args_info.bandwidthmaxup_given) + { + fprintf (stderr, "%s: `--bandwidthmaxup' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->bandwidthmaxup_given && ! override) + continue; + local_args_info.bandwidthmaxup_given = 1; + args_info->bandwidthmaxup_given = 1; + args_info->bandwidthmaxup_arg = strtol (optarg,&stop_char,0); + if (args_info->bandwidthmaxup_orig) + free (args_info->bandwidthmaxup_orig); /* free previous string */ + args_info->bandwidthmaxup_orig = gengetopt_strdup (optarg); + } + else if (strcmp (long_options[option_index].name, "bandwidthmaxdown") == 0) + { + if (local_args_info.bandwidthmaxdown_given) + { + fprintf (stderr, "%s: `--bandwidthmaxdown' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->bandwidthmaxdown_given && ! override) + continue; + local_args_info.bandwidthmaxdown_given = 1; + args_info->bandwidthmaxdown_given = 1; + args_info->bandwidthmaxdown_arg = strtol (optarg,&stop_char,0); + if (args_info->bandwidthmaxdown_orig) + free (args_info->bandwidthmaxdown_orig); /* free previous string */ + args_info->bandwidthmaxdown_orig = gengetopt_strdup (optarg); + } break; case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ diff -Nur chillispot-1.1.0.orig/src/cmdline.ggo chillispot-1.1.0/src/cmdline.ggo --- chillispot-1.1.0.orig/src/cmdline.ggo 2006-09-24 14:48:26.000000000 -0300 +++ chillispot-1.1.0/src/cmdline.ggo 2009-08-11 16:17:58.000000000 -0300 @@ -119,3 +119,12 @@ option "macsuffix" - "Suffix to add to the MAC address" string no option "macpasswd" - "Password used when performing MAC authentication" string default="password" no +# Remote Monitor and Config +option "rmtlisten" - "IP address to listen to for authentication requests" string default="127.0.0.1" no +option "rmtport" - "TCP port to bind to for authentication requests" int default="3991" no +option "rmtpasswd" - "Password used when performing MAC authentication" string no + +# Extra settings +option "bandwidthmaxup" - "Default bandwidth control to apply when account don't have setting" int no +option "bandwidthmaxdown" - "Default bandwidth control to apply when account don't have setting" int no + diff -Nur chillispot-1.1.0.orig/src/cmdline.h chillispot-1.1.0/src/cmdline.h --- chillispot-1.1.0.orig/src/cmdline.h 2006-09-24 14:48:26.000000000 -0300 +++ chillispot-1.1.0/src/cmdline.h 2009-08-11 16:17:58.000000000 -0300 @@ -122,6 +122,17 @@ char * macsuffix_orig; /* Suffix to add to the MAC address original value given at command line. */ char * macpasswd_arg; /* Password used when performing MAC authentication (default='password'). */ char * macpasswd_orig; /* Password used when performing MAC authentication original value given at command line. */ + int rmtport_arg; /* TCP port to bind to for remote monitor and config (default='3991'). */ + char * rmtport_orig; /* TCP port to bind to for remote monitor and config original value given at command line. */ + char * rmtlisten_arg; /* IP address to listen to for remote monitor and config. */ + char * rmtlisten_orig; /* IP address to listen to for remote monitor and config original value given at command line. */ + char * rmtpasswd_arg; /* Password for remote monitor and config. */ + char * rmtpasswd_orig; /* Password for remote monitor and config original value given at command line. */ + int bandwidthmaxup_arg; /* Default Bandwidth Max Up. */ + char *bandwidthmaxup_orig; /* Default Bandwidth Max Up value given at command line. */ + int bandwidthmaxdown_arg; /* Default Bandwidth Max Down. */ + char *bandwidthmaxdown_orig; /* Default Bandwidth Max Down value given at command line. */ + int help_given ; /* Whether help was given. */ int version_given ; /* Whether version was given. */ @@ -177,7 +188,11 @@ unsigned int macallowed_given ; /* Whether macallowed was given. */ int macsuffix_given ; /* Whether macsuffix was given. */ int macpasswd_given ; /* Whether macpasswd was given. */ - + int rmtport_given ; /* Whether uamport was given. */ + int rmtlisten_given ; /* Whether uamlisten was given. */ + int rmtpasswd_given ; /* Whether confpassword was given. */ + int bandwidthmaxup_given ; + int bandwidthmaxdown_given ; } ; int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info); diff -Nur chillispot-1.1.0.orig/src/Makefile chillispot-1.1.0/src/Makefile --- chillispot-1.1.0.orig/src/Makefile 2009-08-11 15:11:28.000000000 -0300 +++ chillispot-1.1.0/src/Makefile 2009-08-11 16:18:32.000000000 -0300 @@ -54,7 +54,7 @@ am_chilli_OBJECTS = chilli.$(OBJEXT) tun.$(OBJEXT) cmdline.$(OBJEXT) \ ippool.$(OBJEXT) radius.$(OBJEXT) md5.$(OBJEXT) \ redir.$(OBJEXT) dhcp.$(OBJEXT) syserr.$(OBJEXT) \ - iphash.$(OBJEXT) lookup.$(OBJEXT) + iphash.$(OBJEXT) lookup.$(OBJEXT) remotectrl.$(OBJEXT) chilli_OBJECTS = $(am_chilli_OBJECTS) chilli_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) @@ -172,7 +172,7 @@ # add -pg to enable gprof AM_CFLAGS = -D_GNU_SOURCE -fno-builtin -DSBINDIR='"$(sbindir)"' -chilli_SOURCES = chilli.c defs.h tun.c tun.h cmdline.c cmdline.h ippool.c ippool.h radius.h radius.c md5.c md5.h redir.h redir.c dhcp.c dhcp.h syserr.c syserr.h iphash.c iphash.h lookup.c lookup.h +chilli_SOURCES = chilli.c defs.h tun.c tun.h cmdline.c cmdline.h ippool.c ippool.h radius.h radius.c md5.c md5.h redir.h redir.c dhcp.c dhcp.h syserr.c syserr.h iphash.c iphash.h lookup.c lookup.h remotectrl.c remotectrl.h all: all-am .SUFFIXES: diff -Nur chillispot-1.1.0.orig/src/Makefile.in chillispot-1.1.0/src/Makefile.in --- chillispot-1.1.0.orig/src/Makefile.in 2006-09-24 16:34:58.000000000 -0300 +++ chillispot-1.1.0/src/Makefile.in 2009-08-11 16:17:58.000000000 -0300 @@ -54,7 +54,7 @@ am_chilli_OBJECTS = chilli.$(OBJEXT) tun.$(OBJEXT) cmdline.$(OBJEXT) \ ippool.$(OBJEXT) radius.$(OBJEXT) md5.$(OBJEXT) \ redir.$(OBJEXT) dhcp.$(OBJEXT) syserr.$(OBJEXT) \ - iphash.$(OBJEXT) lookup.$(OBJEXT) + iphash.$(OBJEXT) lookup.$(OBJEXT) remotectrl.$(OBJEXT) chilli_OBJECTS = $(am_chilli_OBJECTS) chilli_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) @@ -172,7 +172,7 @@ # add -pg to enable gprof AM_CFLAGS = -D_GNU_SOURCE -fno-builtin -DSBINDIR='"$(sbindir)"' -chilli_SOURCES = chilli.c defs.h tun.c tun.h cmdline.c cmdline.h ippool.c ippool.h radius.h radius.c md5.c md5.h redir.h redir.c dhcp.c dhcp.h syserr.c syserr.h iphash.c iphash.h lookup.c lookup.h +chilli_SOURCES = chilli.c defs.h tun.c tun.h cmdline.c cmdline.h ippool.c ippool.h radius.h radius.c md5.c md5.h redir.h redir.c dhcp.c dhcp.h syserr.c syserr.h iphash.c iphash.h lookup.c lookup.h remotectrl.c remotectrl.h all: all-am .SUFFIXES: diff -Nur chillispot-1.1.0.orig/src/remotectrl.c chillispot-1.1.0/src/remotectrl.c --- chillispot-1.1.0.orig/src/remotectrl.c 1969-12-31 21:00:00.000000000 -0300 +++ chillispot-1.1.0/src/remotectrl.c 2009-08-11 16:17:58.000000000 -0300 @@ -0,0 +1,340 @@ +#include +#include +#include +#include +#include + +#include "remotectrl.h" + +/* +char *vstrcat(char *first, ...) +{ + size_t len = 0; + char *retbuf; + va_list argp; + char *p; + char *tmp=""; + if(first == NULL) + first=tmp; +// return NULL; + + len = strlen(first); + + va_start(argp, first); + + while((p = va_arg(argp, char *)) != NULL) + len += strlen(p); + + va_end(argp); + retbuf = (char *)malloc(len + 1); // +1 for trailing \0 + + if(retbuf == NULL) + return NULL; // error + + (void)strcpy(retbuf, first); + + va_start(argp, first); + + while((p = va_arg(argp, char *)) != NULL) + (void)strcat(retbuf, p); + + va_end(argp); + + return retbuf; +} +*/ + +int rmtctrl_write_msg( struct rmt_socket_t *sckHnd, uint32_t id, uint32_t extra, char *message ){ + msg_head_t header; + int rslt; + header.id = id; + header.len = strlen(message); + header.extra = extra; + rslt = send(sckHnd->fd,&header,sizeof(struct msg_head_t),0); + if (rslt != -1 && header.len > 0) { + sckHnd->Tx += rslt; + rslt = send(sckHnd->fd, message, header.len, 0); + if (rslt > 0) + { + sckHnd->Tx += rslt; + rslt += sizeof(struct msg_head_t); + } + } + return rslt; +} + +int rmtctrl_read_msg( struct rmt_socket_t *sckHnd, msg_head_t *head, char **message ) +{ +// msg_head_t header; + int rslt; + char *buffer; + int reading = 0; + int aux = 0; + rslt = recv(sckHnd->fd, head, sizeof(struct msg_head_t), 0); + if (rslt == sizeof(struct msg_head_t) ) { + sckHnd->Rx += rslt; + *message = (char *)malloc(head->len+1); + memset(*message,'\0', head->len+1); + while ( reading < head->len ){ + aux = recv(sckHnd->fd, *message, head->len, 0); + switch ( aux ) + { + case -1: + switch (errno) + { + case EINTR: + case EAGAIN: + usleep (100); + break; + default: + return -1; + } + break; + case 0: // mean socket was closed + sckHnd->Rx += reading; + return reading; + break; + break; + default: + reading+=aux; + break; + } + } +/* + buffer = (char *)malloc(head->len+1); + while ( reading < head->len ){ + memset(buffer,'\0', head->len+1); + aux = recv(sckHnd->fd, buffer, head->len, 0); + switch ( aux ) { + case -1: + switch (errno){ + case EINTR: + case EAGAIN: + usleep (100); + break; + default: + return -1; + } + break; + case 0: // mean socket was closed + sckHnd->Rx += reading; + return reading; + break; + break; + default: + if (reading == 0) + *message=(char *)malloc(aux+1); + else + *message=(char*)realloc(*message,(reading+aux+1)*sizeof(char)); +// strcat(*message, buffer); + memcpy(*message+reading, buffer, aux); + reading += aux; + *message[reading]=0; + } + } + free(buffer); +*/ + sckHnd->Rx += reading; + reading += rslt; + return reading; + } + return rslt; +} + +void rmtctrl_newClient(struct rmt_socket_t srv, struct rmt_socket_t *client, int *activeClients) +{ + int rslt; + int cli = (*activeClients); + rmtctrl_accept(srv,&client[cli]); + if (client[(*activeClients)].fd != -1) + { + (*activeClients)++; + } + if ((*activeClients) >= MAX_CLIENTS) + { + (*activeClients)--; + rslt = rmtctrl_write_msg(&client[(*activeClients)],MSG_END,0, "Sorry Server is too Busy\n Try more late\n" ); + if (rslt > 0) client[(*activeClients)].Tx += rslt; + rmtctrl_close(&client[(*activeClients)]); + } +} + +void rmtctrl_close ( struct rmt_socket_t *client ) +{ + printf("Desde %s se recibieron %d bytes y se enviaron %d bytes\n",inet_ntoa(client->addr.sin_addr),client->Rx,client->Tx); + close(client->fd); /* cierra fd_rmt_client */ + printf("Se cerro conexión desde %s\n",inet_ntoa(client->addr.sin_addr) ); + client->fd = -1; +} + +void rmtctrl_accept (struct rmt_socket_t srv, struct rmt_socket_t *client ) +{ + int sin_size=sizeof(struct sockaddr_in); + int int_Send; + struct sockaddr_in addr; + + if ((client->fd = accept(srv.fd,(struct sockaddr *)&client->addr,&sin_size))!=-1) + { + client->Rx = 0; + client->Tx = 0; + unsigned char c = sizeof(uint32_t); + int_Send = send(client->fd, &c, 1, 0); + if (int_Send > 0) client->Tx += int_Send; + printf("Se abrió una conexión desde %s\n", inet_ntoa(client->addr.sin_addr)); + } +} + +//void cleanClients (int *table, int *n) +void rmtctrl_cleanClients (struct rmt_socket_t *client, int *n) +{ + int i,j; + + if ((client == NULL) || ((*n) == 0)) + return; + + j=0; + for (i=0; i<(*n); i++) + { + if (client[i].fd != -1) + { + client[j].fd = client[i].fd; + client[j].addr = client[i].addr; + client[j].Rx = client[i].Rx; + client[j].Tx = client[i].Tx; + j++; + } + } + + *n = j; +} + +int rmtctrl_maxValue (struct rmt_socket_t *client, int n) +{ + int i; + int max; + + if ((client == NULL) || (n<1)) + return 0; + + max = client[0].fd; + for (i=0; i max) + max = client[i].fd; + + return max; +} + +struct rmt_socket_t rmtctrl_initSrv(struct in_addr rmtlisten, int rmtport){ + struct rmt_socket_t srv; + if ((srv.fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { + printf("error en socket()\n"); + exit(1); + } + srv.addr.sin_family = AF_INET; + srv.addr.sin_port = htons(rmtport); + srv.addr.sin_addr.s_addr = rmtlisten.s_addr; + bzero(&(srv.addr.sin_zero),8); + + if(bind(srv.fd,(struct sockaddr*)&srv.addr,sizeof(struct sockaddr))==-1) { + printf("error en bind() \n"); + exit(-1); + } + + if(listen(srv.fd,BACKLOG) == -1) { + printf("error en listen()\n"); + exit(-1); + } + return srv; +} + +void rmtctrl_srv(struct rmt_socket_t srv, struct rmt_socket_t *client, int *activeClients) +{ + fd_set fdRead; + int maxHnd; + int i; + struct timeval nowait; + memset((char *)&nowait,0,sizeof(nowait)); + + rmtctrl_cleanClients(client, activeClients); + FD_ZERO (&fdRead); + FD_SET (srv.fd, &fdRead); + + for (i=0; i<*activeClients; i++) + FD_SET (client[i].fd, &fdRead); + + maxHnd = rmtctrl_maxValue (client, *activeClients); + + if (maxHnd < srv.fd) + maxHnd = srv.fd; + + select (maxHnd + 1, &fdRead, NULL, NULL,&nowait); + for (i=0; i<*activeClients; i++) + { + if (FD_ISSET (client[i].fd, &fdRead)) + { + rmtctrl_msg_proccess(&client[i]); + } + } + if (FD_ISSET (srv.fd, &fdRead)) + rmtctrl_newClient(srv,client, &(*activeClients)); +} + +int send_line( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, char *data) +{ + char str[2048]; + memset(str,'\0',2048); + sprintf(str,fmt,data); + return rmtctrl_write_msg(client,msg_type,msg_extra, str); +} + +int send_octets( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, uint64_t value) +{ + char *Buffer = (char *)octets2str(value); + int ret = send_line( client, msg_type, msg_extra, fmt, Buffer); + free(Buffer); + return ret; +} + +int send_mac( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, uint8_t *value) +{ + char *Buffer = (char*)mac2str(value); + int ret = send_line( client, msg_type, msg_extra, fmt, Buffer); + free(Buffer); + return ret; +} + +int send_number( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, uint64_t value) +{ + char Buffer[64]; + sprintf(Buffer,"%d", value); + return send_line( client, msg_type, msg_extra, fmt, Buffer); +} + +const char * mac2str(uint8_t *mac) +{ + char *buffer; + buffer=(char*)malloc(18*sizeof(char)); + memset(buffer,'\0',18); + (void) sprintf(buffer,"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X", + mac[0], mac[1], + mac[2], mac[3], + mac[4], mac[5]); + return buffer; +} + +const char * octets2str(uint64_t value) +{ + char *buffer; + buffer=(char*)malloc(13*sizeof(char)); + memset(buffer,'\0',13); + if (value/8 > 1073741824){ // gigas + sprintf(buffer,"%.1f(GiB)",((value/8.0)/1073741824.0)); + }else if (value/8 > 1048576){ // megas + sprintf(buffer,"%.1f(MiB)",((value/8.0)/1048576.0)); + }else if (value/8 > 1024){ // KiloBytes + sprintf(buffer,"%.1f(KiB)",((value/8.0)/1024.0)); + }else // Bytes + sprintf(buffer,"%.1f(B)",(value/8)); + return buffer; +} + diff -Nur chillispot-1.1.0.orig/src/remotectrl.h chillispot-1.1.0/src/remotectrl.h --- chillispot-1.1.0.orig/src/remotectrl.h 1969-12-31 21:00:00.000000000 -0300 +++ chillispot-1.1.0/src/remotectrl.h 2009-08-11 16:17:58.000000000 -0300 @@ -0,0 +1,86 @@ +#include +#ifndef _RMTCTRL_H +#define _RMTCTRL_H + +enum +{ + MSG_OK = 0, + MSG_START = 1, + MSG_PART = 2, + MSG_END = 3, + QRY_STATUS = 100, + QRY_CONNECTED_LIST = 101, + QRY_CONNECTED_FULL_LIST = 102, + QRY_MACADDR = 103, + QRY_IPADDR = 104, + QRY_USERNAME = 105, + + CMD_AUTHORIZE = 200, + CMD_DISCONNECT = 201, + + EXTRA_ALL_OP = 300, + EXTRA_MAC_OP = 301, + EXTRA_IP_OP = 302, + EXTRA_USER_OP = 303, +}; + +enum +{ + STRING, + IP_ADDR, + MAC_ADDR, + NUMBER, + OCTETS, +}; + +#define PORT 15557 /* El puerto que ser? abierto */ +#define BACKLOG 2 /* El n?mero de conexiones permitidas */ +#define MAX_CLIENTS 10 +static char CONVERT_BUFF[1024]; + +typedef struct msg_head_t { + uint32_t id; + uint32_t extra; + uint32_t len; +} msg_head_t; + +typedef struct rmt_socket_t { + int fd; + struct sockaddr_in addr; + int Rx; + int Tx; +} rmt_socket_t; + +//char *vstrcat(char *first, ...); + + +int rmtctrl_write_msg( struct rmt_socket_t *sckHnd, uint32_t id, uint32_t extra, char *message ); +int rmtctrl_read_msg( struct rmt_socket_t *sckHnd, msg_head_t *head, char **message ); +void rmtctrl_newClient(struct rmt_socket_t srv, struct rmt_socket_t *client, int *activeClients); +void rmtctrl_close ( struct rmt_socket_t *client ); +void rmtctrl_accept (struct rmt_socket_t srv, struct rmt_socket_t *client ); +void rmtctrl_cleanClients (struct rmt_socket_t *client, int *n); + +//inicializa las variables y arranca el servidor +struct rmt_socket_t rmtctrl_initSrv(struct in_addr rmtlisten, int rmtport); +//esta funcion es la que va dentro del loop del programa que lo utiliza +void rmtctrl_srv(struct rmt_socket_t srv, struct rmt_socket_t *client, int *activeClients); +//En esta funcion es donde se define como se procesan los mensajes +void rmtctrl_msg_proccess(struct rmt_socket_t *client); + +//char * pepe(char *dest, char *sep, char *src); + +//char * send_value(char *name, char *value, int len, struct in_addr *addr, +// uint8_t *mac, long int *integer); +//int addfield(char* reg, char *field, char sep); +//int addfield1(char** reg,int rlen, char *field, int flen, char sep); +//int sendConnectedInfo(struct app_conn_t *appconn, struct rmt_socket_t *client); +//const char * value2str( int type, void *value); +const char * octets2str(uint64_t value); +const char * mac2str(uint8_t *mac); +int send_line( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, char *data); +int send_octets( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, uint64_t value); +int send_mac( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, uint8_t *value); +int send_number( struct rmt_socket_t *client, int msg_type, int msg_extra, char *fmt, uint64_t value); + +#endif /* !_RMTCTRL_H */ Los ficheros binarios chillispot-1.1.0.orig/src/remotectrl.o y chillispot-1.1.0/src/remotectrl.o son distintos