Lines Matching refs:server

91  * The rule taskq is for processing rule and server removal.  When a user
92 * land rule/server removal request comes in, a taskq is dispatched after
93 * removing the rule/server from all related hashes. This taskq will wait
94 * until all references to the rule/server are gone before removing it.
144 /* Back end server handling routines. */
246 ilb_server_t *server)
260 server->iser_name, cname_buf, KSTAT_TYPE_NAMED,
265 bcopy(&template, &server->iser_kstat, sizeof (template));
266 ksp->ks_data = &server->iser_kstat;
269 kstat_named_setstr(&server->iser_kstat.ip_address,
270 server->iser_ip_addr);
272 ksp->ks_data_size += strlen(server->iser_ip_addr) + 1;
760 ilb_server_t *server;
771 while ((server = tmp_rule->ir_servers) != NULL) {
772 mutex_enter(&server->iser_lock);
773 ilb_destroy_nat_src(&server->iser_nat_src);
782 (uint64_t *)&server->iser_die_time,
786 while (server->iser_refcnt > 1)
787 cv_wait(&server->iser_cv, &server->iser_lock);
788 tmp_rule->ir_servers = server->iser_next;
789 kstat_delete_netstack(server->iser_ksp, stackid);
790 kmem_free(server, sizeof (ilb_server_t));
1155 /* Once we get a hold on the rule, no server can be added/deleted. */
1207 * Add a back end server to a rule. If the address is IPv4, it is assumed
1213 ilb_server_t *server;
1233 /* If someone is already doing server add/del, sleeps and wait. */
1269 * For DSR, there can be no port shifting. Hence the server
1291 for (server = rule->ir_servers; server != NULL;
1292 server = server->iser_next) {
1293 if (IN6_ARE_ADDR_EQUAL(&server->iser_addr_v6, &info->addr) ||
1294 strcasecmp(server->iser_name, info->name) == 0) {
1298 if (server != NULL) {
1303 if ((server = kmem_zalloc(sizeof (ilb_server_t), KM_NOSLEEP)) == NULL) {
1308 (void) memcpy(server->iser_name, info->name, ILB_SERVER_NAMESZ - 1);
1309 (void) inet_ntop(AF_INET6, &info->addr, server->iser_ip_addr,
1310 sizeof (server->iser_ip_addr));
1312 server->iser_ksp = ilb_server_kstat_init(stackid, rule, server);
1313 if (server->iser_ksp == NULL) {
1314 kmem_free(server, sizeof (ilb_server_t));
1319 server->iser_stackid = stackid;
1320 server->iser_addr_v6 = info->addr;
1321 server->iser_min_port = min_port;
1322 server->iser_max_port = max_port;
1324 server->iser_port_range = B_TRUE;
1326 server->iser_port_range = B_FALSE;
1330 * for this server.
1336 * If the server uses a port range, our port allocation
1340 if (server->iser_port_range)
1343 port = server->iser_min_port;
1345 if ((ret = ilb_create_nat_src(ilbs, &server->iser_nat_src,
1346 &server->iser_addr_v6, port, &rule->ir_nat_src_start,
1349 kstat_delete_netstack(server->iser_ksp, stackid);
1350 kmem_free(server, sizeof (ilb_server_t));
1359 * that one or two packets may not be load balanced to a server
1362 server->iser_refcnt = 1;
1363 server->iser_enabled = info->flags & ILB_SERVER_ENABLED ? B_TRUE :
1365 mutex_init(&server->iser_lock, NULL, MUTEX_DEFAULT, NULL);
1366 cv_init(&server->iser_cv, NULL, CV_DEFAULT, NULL);
1370 if ((ret = rule->ir_alg->ilb_alg_server_add(server,
1372 kstat_delete_netstack(server->iser_ksp, stackid);
1373 kmem_free(server, sizeof (ilb_server_t));
1382 server->iser_next = NULL;
1384 server->iser_next = rule->ir_servers;
1386 rule->ir_servers = server;
1401 ilb_server_t *server = (ilb_server_t *)arg;
1403 mutex_enter(&server->iser_lock);
1404 while (server->iser_refcnt > 1)
1405 cv_wait(&server->iser_cv, &server->iser_lock);
1406 kstat_delete_netstack(server->iser_ksp, server->iser_stackid);
1407 kmem_free(server, sizeof (ilb_server_t));
1411 * Delete a back end server from a rule. If the address is IPv4, it is assumed
1418 ilb_server_t *server;
1432 /* If someone is already doing server add/del, sleeps and wait. */
1460 for (server = rule->ir_servers; server != NULL;
1461 prev_server = server, server = server->iser_next) {
1462 if (IN6_ARE_ADDR_EQUAL(&server->iser_addr_v6, addr))
1465 if (server == NULL) {
1474 if ((ret = rule->ir_alg->ilb_alg_server_del(server,
1480 rule->ir_servers = server->iser_next;
1482 prev_server->iser_next = server->iser_next;
1487 * Mark the server as disabled so that if there is any sticky cache
1488 * using this server around, it won't be used.
1490 server->iser_enabled = B_FALSE;
1492 mutex_enter(&server->iser_lock);
1499 ilb_destroy_nat_src(&server->iser_nat_src);
1501 /* If there is a hard limit on when a server should die, set it. */
1503 (void) atomic_swap_64((uint64_t *)&server->iser_die_time,
1508 if (server->iser_refcnt > 1) {
1510 server, TQ_SLEEP);
1511 mutex_exit(&server->iser_lock);
1513 kstat_delete_netstack(server->iser_ksp, server->iser_stackid);
1514 kmem_free(server, sizeof (ilb_server_t));
1534 * server.
1537 * and see which back end server we should send this message to. And we
1673 ilb_server_t *server;
1717 * Note: a reply from back end server should not match a rule. A
1732 * to find a server.
1735 rule->ir_alg->ilb_alg_data, &server);
1737 * This can only happen if there is no server in a rule or all
1745 * If there is a sticky entry for the client, use the previous server
1755 if ((server = ilb_sticky_find_add(ilbs, rule, &addr, server,
1764 * We are holding a reference on the rule, so the server
1767 *lb_dst = server->iser_addr_v6;
1768 ILB_S_KSTAT(server, pkt_processed);
1769 ILB_S_KSTAT_UPDATE(server, bytes_processed, pkt_len);
1778 * The server should return a RST. When we see the
1793 if ((src_ent = ilb_alloc_nat_addr(server->iser_nat_src,
1805 info.nat_dst = server->iser_addr_v6;
1806 if (rule->ir_port_range && server->iser_port_range) {
1808 rule->ir_min_port + server->iser_min_port);
1810 info.nat_dport = htons(server->iser_min_port);
1818 if (ilb_conn_add(ilbs, rule, server, src, sport, dst,
1833 info.nat_dst = server->iser_addr_v6;
1835 if (rule->ir_port_range && server->iser_port_range) {
1837 rule->ir_min_port + server->iser_min_port);
1839 info.nat_dport = htons(server->iser_min_port);
1842 if (ilb_conn_add(ilbs, rule, server, src, sport, dst,
1874 /* This can only happen if there is no server available. */
1956 ilb_server_t *server;
1962 for (server = rule->ir_servers, cnt = *num_servers;
1963 server != NULL && cnt > 0;
1964 server = server->iser_next, cnt--, servers++) {
1965 (void) memcpy(servers->name, server->iser_name,
1967 servers->addr = server->iser_addr_v6;
1968 servers->min_port = htons(server->iser_min_port);
1969 servers->max_port = htons(server->iser_max_port);
1970 servers->flags = server->iser_enabled ? ILB_SERVER_ENABLED : 0;