X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Finclude%2Fradiusd.h;h=dbb128d0779758acfeffafaeb347a0d0413bfb57;hb=8dcf3e2a2b53342b0d6a65d7078b6c4629548321;hp=7a394c86a7a4b318224dafa229ec4d8dd94c2f68;hpb=f1120bb8189caeba928f15caa77a22a494f8a550;p=freeradius.git diff --git a/src/include/radiusd.h b/src/include/radiusd.h index 7a394c8..dbb128d 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -89,6 +89,8 @@ typedef struct auth_req REQUEST; #ifndef WITHOUT_COMMAND_SOCKET #ifdef HAVE_SYS_UN_H #define WITH_COMMAND_SOCKET (1) +#else +#define WITHOUT_COMMAND_SOCKET (1) #endif #endif @@ -128,8 +130,8 @@ typedef struct radclient { #endif #endif -#ifdef WITH_TCP int proto; +#ifdef WITH_TCP int max_connections; int num_connections; #endif @@ -140,6 +142,7 @@ typedef struct radclient { time_t created; time_t last_new_client; char *client_server; + int rate_limit; #endif #ifdef WITH_COA @@ -215,7 +218,7 @@ struct auth_req { pthread_t child_pid; #endif time_t timestamp; - int number; /* internal server number */ + unsigned int number; /* internal server number */ rad_listen_t *listener; #ifdef WITH_PROXY @@ -304,7 +307,7 @@ typedef struct pair_list { typedef int (*rad_listen_recv_t)(rad_listen_t *, RAD_REQUEST_FUNP *, REQUEST **); typedef int (*rad_listen_send_t)(rad_listen_t *, REQUEST *); -typedef int (*rad_listen_print_t)(rad_listen_t *, char *, size_t); +typedef int (*rad_listen_print_t)(const rad_listen_t *, char *, size_t); typedef int (*rad_listen_encode_t)(rad_listen_t *, REQUEST *); typedef int (*rad_listen_decode_t)(rad_listen_t *, REQUEST *); @@ -318,6 +321,9 @@ struct rad_listen_t { int fd; const char *server; int status; +#ifdef WITH_TCP + int count; +#endif rad_listen_recv_t recv; rad_listen_send_t send; @@ -332,10 +338,50 @@ struct rad_listen_t { #endif }; +/* + * This shouldn't really be exposed... + */ +typedef struct listen_socket_t { + /* + * For normal sockets. + */ + fr_ipaddr_t my_ipaddr; + int my_port; + + const char *interface; +#ifdef SO_BROADCAST + int broadcast; +#endif + + /* for outgoing sockets */ + home_server *home; + fr_ipaddr_t other_ipaddr; + int other_port; + + int proto; + +#ifdef WITH_TCP + /* for a proxy connecting to home servers */ + time_t last_packet; + time_t opened; + fr_event_t *ev; + + /* for clients connecting to the server */ + int max_connections; + int num_connections; + struct listen_socket_t *parent; + RADCLIENT *client; + + RADIUS_PACKET *packet; /* for reading partial packets */ +#endif + RADCLIENT_LIST *clients; +} listen_socket_t; + #define RAD_LISTEN_STATUS_INIT (0) #define RAD_LISTEN_STATUS_KNOWN (1) -#define RAD_LISTEN_STATUS_CLOSED (2) -#define RAD_LISTEN_STATUS_FINISH (3) +#define RAD_LISTEN_STATUS_REMOVE_FD (2) +#define RAD_LISTEN_STATUS_CLOSED (3) +#define RAD_LISTEN_STATUS_FINISH (4) typedef enum radlog_dest_t { RADLOG_STDOUT = 0, @@ -356,7 +402,9 @@ typedef struct main_config_t { int log_auth_goodpass; int allow_core_dumps; int debug_level; +#ifdef WITH_PROXY int proxy_requests; +#endif int reject_delay; int status_server; int max_request_time; @@ -518,11 +566,8 @@ void client_delete(RADCLIENT_LIST *clients, RADCLIENT *client); RADCLIENT *client_create(RADCLIENT_LIST *clients, REQUEST *request); #endif RADCLIENT *client_find(const RADCLIENT_LIST *clients, - const fr_ipaddr_t *ipaddr -#ifdef WITH_TCP - , int proto -#endif -); + const fr_ipaddr_t *ipaddr, int proto); + RADCLIENT *client_findbynumber(const RADCLIENT_LIST *clients, int number); RADCLIENT *client_find_old(const fr_ipaddr_t *ipaddr); @@ -586,7 +631,7 @@ int radius_callback_compare(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR **reply_pairs); int radius_find_compare(int attribute); VALUE_PAIR *radius_paircreate(REQUEST *request, VALUE_PAIR **vps, - int attribute, int type); + int attribute, int vendor, int type); VALUE_PAIR *radius_pairmake(REQUEST *request, VALUE_PAIR **vps, const char *attribute, const char *value, int operator); @@ -631,9 +676,10 @@ void fr_suid_down_permanent(void); /* listen.c */ void listen_free(rad_listen_t **head); int listen_init(CONF_SECTION *cs, rad_listen_t **head); -rad_listen_t *proxy_new_listener(fr_ipaddr_t *ipaddr, int exists); +int proxy_new_listener(home_server *home, int src_port); RADCLIENT *client_listener_find(const rad_listen_t *listener, const fr_ipaddr_t *ipaddr, int src_port); + #ifdef WITH_STATS RADCLIENT_LIST *listener_find_client_list(const fr_ipaddr_t *ipaddr, int port); @@ -649,7 +695,7 @@ int received_request(rad_listen_t *listener, RADIUS_PACKET *packet, REQUEST **prequest, RADCLIENT *client); REQUEST *received_proxy_response(RADIUS_PACKET *packet); -void event_new_fd(rad_listen_t *listener); +int event_new_fd(rad_listen_t *listener); /* evaluate.c */ int radius_evaluate_condition(REQUEST *request, int modreturn, int depth,