pool_t pool;
};
-static unsigned int ip_addr_hash(const void *p)
+static unsigned int login_proxy_record_hash(const void *p)
{
- const struct ip_addr *ip = p;
+ const struct login_proxy_record *rec = p;
- return net_ip_hash(ip);
+ return net_ip_hash(&rec->ip) ^ rec->port;
}
-static int ip_addr_cmp(const void *p1, const void *p2)
+static int login_proxy_record_cmp(const void *p1, const void *p2)
{
- const struct ip_addr *ip1 = p1, *ip2 = p2;
+ const struct login_proxy_record *rec1 = p1, *rec2 = p2;
- return net_ip_compare(ip1, ip2) ? 0 : 1;
+ if (!net_ip_compare(&rec1->ip, &rec2->ip))
+ return 1;
+
+ return (int)rec1->port - (int)rec2->port;
}
struct login_proxy_state *login_proxy_state_init(void)
state = i_new(struct login_proxy_state, 1);
state->pool = pool_alloconly_create("login proxy state", 1024);
state->hash = hash_table_create(default_pool, state->pool, 0,
- ip_addr_hash, ip_addr_cmp);
+ login_proxy_record_hash,
+ login_proxy_record_cmp);
return state;
}
struct login_proxy_record *
login_proxy_state_get(struct login_proxy_state *state,
- const struct ip_addr *ip)
+ const struct ip_addr *ip, unsigned int port)
{
- struct login_proxy_record *rec;
- struct ip_addr *new_ip;
+ struct login_proxy_record *rec, key;
- rec = hash_table_lookup(state->hash, ip);
- if (rec == NULL) {
- new_ip = p_new(state->pool, struct ip_addr, 1);
- *new_ip = *ip;
+ memset(&key, 0, sizeof(key));
+ key.ip = *ip;
+ key.port = port;
+ rec = hash_table_lookup(state->hash, &key);
+ if (rec == NULL) {
rec = p_new(state->pool, struct login_proxy_record, 1);
- hash_table_insert(state->hash, new_ip, rec);
+ rec->ip = *ip;
+ rec->port = port;
+ hash_table_insert(state->hash, rec, rec);
}
return rec;
}
#include <sys/time.h>
struct login_proxy_record {
+ struct ip_addr ip;
+ unsigned int port;
+ unsigned int num_waiting_connections;
+
struct timeval last_failure;
struct timeval last_success;
- unsigned int num_waiting_connections;
};
struct login_proxy_state *login_proxy_state_init(void);
struct login_proxy_record *
login_proxy_state_get(struct login_proxy_state *state,
- const struct ip_addr *ip);
+ const struct ip_addr *ip, unsigned int port);
#endif