⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lease_token.l

📁 DHCPv6协议在Linux操作系统下的一个客户端实现。
💻 L
📖 第 1 页 / 共 2 页
字号:
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 + -