📄 lease_token.l
字号:
int do_iaidaddr_hash(lease_rec, key) struct dhcp6_lease *lease_rec; struct client6_if *key;{ struct dhcp6_iaidaddr *iaidaddr; struct dhcp6_lease *found_lease; struct timeb now; time_t offset; struct timeval timo; double d; if (!VALID_LEASE_FLAG(lease_flags) || (lease_rec->lease_addr.preferlifetime > lease_rec->lease_addr.validlifetime)) { dprintf(LOG_ERR, "parse an invalid lease %s/%d within line %d", in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen, num_lines); return (-1); } ftime(&now); offset = now.time - lease_rec->start_date; dprintf(LOG_DEBUG, "now : %ld; offset: %ld ", now.time, offset); if (offset > lease_rec->lease_addr.validlifetime) { dprintf(LOG_INFO, "This lease addr %s/%d has been expired.", in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen); free(lease_rec); return (0); } if (lease_rec->state == INVALID) { dprintf(LOG_INFO, "This lease addr %s/%d is invalid. Removing.", in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen); found_lease = hash_search(lease_hash_table, &lease_rec->lease_addr); /* remove the previous old lease */ if(found_lease) { remove_lease(found_lease); } free(lease_rec); return (0); } if (dhcp6_mode == DHCP6_MODE_CLIENT) { if (add_lease(&client6_iaidaddr, lease_rec) != 0) return (-1); else { memcpy(&client6_iaidaddr.client6_info, &client6_info, sizeof(client6_iaidaddr.client6_info)); dprintf(LOG_DEBUG, "hash add client iaidaddr type %d for " " duid %s for iaid %u", client6_iaidaddr.client6_info.type, duidstr(&client6_iaidaddr.client6_info.clientid), client6_iaidaddr.client6_info.iaidinfo.iaid); return (0); } } iaidaddr = (struct dhcp6_iaidaddr *)hash_search(server6_hash_table, key); if (iaidaddr){ if (iaidaddr->client6_info.iaidinfo.iaid != client6_info.iaidinfo.iaid || duidcmp(&iaidaddr->client6_info.clientid, &client6_info.clientid)) { dprintf(LOG_DEBUG, "%s" "this client iaidinfo is different to others", FNAME); return (-1); } found_lease = hash_search(lease_hash_table, &lease_rec->lease_addr); /* remove the previous old lease */ if(found_lease) { if (found_lease->start_date < lease_rec->start_date) { dprintf(LOG_DEBUG, "%s" "remove old lease %s/%d", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen); /* update the client6_info too */ memcpy(&iaidaddr->client6_info, &client6_info, sizeof(iaidaddr->client6_info)); iaidaddr->start_date = lease_rec->start_date; remove_lease(found_lease); } else { free(lease_rec); return (0); } } } else { iaidaddr = (struct dhcp6_iaidaddr *)malloc(sizeof(*iaidaddr)); if (!iaidaddr) { dprintf(LOG_ERR, "%s" "failed to allocate memory", FNAME); return (-1); } memset(iaidaddr, 0, sizeof(*iaidaddr)); TAILQ_INIT(&iaidaddr->lease_list); /* get the client info */ memcpy(&iaidaddr->client6_info, &client6_info, sizeof(iaidaddr->client6_info)); if (hash_add(server6_hash_table, &iaidaddr->client6_info, iaidaddr) != 0) { dprintf(LOG_ERR, "%s" "hash add failed", FNAME); free(iaidaddr); return (-1); } dprintf(LOG_DEBUG, "hash add client iaidaddr %u type %d for duid %s", iaidaddr->client6_info.iaidinfo.iaid, iaidaddr->client6_info.type, duidstr(&iaidaddr->client6_info.clientid)); } if (add_lease(iaidaddr, lease_rec) != 0) return (-1); iaidaddr->state = ACTIVE; iaidaddr->start_date = lease_rec->start_date; d = get_max_validlifetime(iaidaddr) - offset; timo.tv_sec = (long)d; timo.tv_usec = 0; /* update the start date and timer */ if (!iaidaddr->timer && (iaidaddr->timer = dhcp6_add_timer(dhcp6_iaidaddr_timo, iaidaddr)) == NULL) { dprintf(LOG_ERR, "%s" "failed to add a timer for iaid %u", FNAME, iaidaddr->client6_info.iaidinfo.iaid); return (-1); } dhcp6_set_timer(&timo, iaidaddr->timer); return (0);}static int add_lease(iaidaddr, lease) struct dhcp6_iaidaddr *iaidaddr; struct dhcp6_lease *lease;{ struct timeval timo; struct timeb now; time_t offset; struct dhcp6_lease *found_lease; double d; /* set up timer out for lease, iaidaddr timer out will be set up in * post_conf_lease */ ftime(&now); offset = now.time - lease_rec->start_date; if (dhcp6_mode == DHCP6_MODE_CLIENT) { if ((found_lease = dhcp6_find_lease(iaidaddr, &lease_rec->lease_addr)) != NULL) { if (!(found_lease->start_date > lease_rec->start_date)) { dprintf(LOG_DEBUG, "%s" "remove old lease %s/%d", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen); if (iaidaddr->client6_info.iaidinfo.iaid != client6_info.iaidinfo.iaid) { dprintf(LOG_DEBUG, "%s" " this lease %s client iaidinfo is different" " to the previous lease", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0)); return (-1); } iaidaddr->client6_info.iaidinfo.renewtime = client6_info.iaidinfo.renewtime; iaidaddr->client6_info.iaidinfo.rebindtime = client6_info.iaidinfo.rebindtime; iaidaddr->start_date = lease_rec->start_date; remove_lease(found_lease); } else { free(lease_rec); return (0); } } /* if this is the first lease */ if (TAILQ_EMPTY(&iaidaddr->lease_list)) { if (iaidaddr->client6_info.iaidinfo.iaid != client6_info.iaidinfo.iaid) { dprintf(LOG_DEBUG, "%s" " this lease %s client iaidinfo is different" " to the previous lease", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0)); return (-1); } iaidaddr->client6_info.iaidinfo.renewtime = client6_info.iaidinfo.renewtime; iaidaddr->client6_info.iaidinfo.rebindtime = client6_info.iaidinfo.rebindtime; iaidaddr->start_date = lease_rec->start_date; } if (!memcmp(&iaidaddr->client6_info, &client6_info, sizeof(iaidaddr->client6_info))) { /* iaidaddr->start_date != lease_rec->start_date) */ dprintf(LOG_DEBUG, "%s" " this lease %s client iaidinfo is different" " to the previous lease", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0)); return (-1); } } if (lease_rec->state == INVALID) { dprintf(LOG_DEBUG, "parse an invalid state lease %s/%d in line %d", in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen, num_lines); free(lease_rec); return (0); } if ((lease_rec->timer = dhcp6_add_timer(dhcp6_lease_timo, lease_rec)) == NULL) { dprintf(LOG_ERR, "%s" " failed to create a timer for lease %s", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0)); return (-1); } if (lease_rec->lease_addr.preferlifetime > offset) { lease_rec->state = ACTIVE; d = lease_rec->lease_addr.preferlifetime - offset; } else { lease_rec->state = EXPIRED; d = lease_rec->lease_addr.validlifetime - offset; } timo.tv_sec = (long)d; timo.tv_usec = 0; dhcp6_set_timer(&timo, lease_rec->timer); if (dhcp6_mode == DHCP6_MODE_SERVER) { if (hash_add(lease_hash_table, &lease_rec->lease_addr, lease_rec) != 0) { dprintf(LOG_ERR, "%s" "hash add lease failed for %s", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0)); free(lease_rec); return (-1); } } lease_rec->iaidaddr = iaidaddr; lease_rec->lease_addr.status_code = DH6OPT_STCODE_UNDEFINE; TAILQ_INSERT_TAIL(&iaidaddr->lease_list, lease_rec, link); dprintf(LOG_INFO, "%s" "add lease addr %s/%d type %d to %u", FNAME, in6addr2str(&lease_rec->lease_addr.addr, 0), lease_rec->lease_addr.plen, lease_rec->lease_addr.type, lease_rec->iaidaddr->client6_info.iaidinfo.iaid); return (0);}static intremove_lease(lease) struct dhcp6_lease *lease;{ if (dhcp6_mode == DHCP6_MODE_SERVER) { if (hash_delete(lease_hash_table, &lease->lease_addr) != 0) { dprintf(LOG_ERR, "%s" "failed to remove an address %s from hash", FNAME, in6addr2str(&lease->lease_addr.addr, 0)); return (-1); } } if (lease->timer) dhcp6_remove_timer(lease->timer); TAILQ_REMOVE(&lease->iaidaddr->lease_list, lease, link); dprintf(LOG_INFO, "%s" "removed lease addr %s/%d from %u", FNAME, in6addr2str(&lease->lease_addr.addr, 0), lease->lease_addr.plen, lease->iaidaddr->client6_info.iaidinfo.iaid); free(lease); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -