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

📄 spi.c

📁 FREESWAN VPN源代码包
💻 C
📖 第 1 页 / 共 5 页
字号:
			extensions[0],			&extensions[0]);	}	if(debug) {		fprintf(stdout, "%s: base message assembled.\n", program_name);	}		switch(alg) {	case XF_AHHMACMD5:	case XF_ESP3DESMD596:		authalg = SADB_AALG_MD5HMAC;		break;	case XF_AHHMACSHA1:	case XF_ESP3DESSHA196:		authalg = SADB_AALG_SHA1HMAC;		break;#ifndef NO_KERNEL_ALG	case XF_OTHER_ALG:		authalg= esp_info->authalg;		if(debug) {			fprintf(stdout, "%s: debug: authalg=%d\n",				program_name, authalg);		}		break;#endif /* NO_KERNEL_ALG */	case XF_ESP3DESMD5:	default:		authalg = SADB_AALG_NONE;	}	switch(alg) {	case XF_ESP3DES:	case XF_ESP3DESMD596:	case XF_ESP3DESSHA196:		encryptalg = SADB_EALG_3DESCBC;		break;	case XF_COMPDEFLATE:		encryptalg = SADB_X_CALG_DEFLATE;		break;#ifndef NO_KERNEL_ALG	case XF_OTHER_ALG:		encryptalg= esp_info->encryptalg;		if(debug) {			fprintf(stdout, "%s: debug: encryptalg=%d\n",				program_name, encryptalg);		}		break;#endif /* NO_KERNEL_ALG */	default:		encryptalg = SADB_EALG_NONE;	}	if(!(alg == XF_CLR /* IE: pfkey_msg->sadb_msg_type == SADB_FLUSH */)) {		if((error = pfkey_sa_build(&extensions[SADB_EXT_SA],					   SADB_EXT_SA,					   htonl(spi), /* in network order */					   replay_window,					   SADB_SASTATE_MATURE,					   authalg,					   encryptalg,					   0))) {			fprintf(stderr, "%s: Trouble building sa extension, error=%d.\n",				program_name, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			fprintf(stdout, "%s: extensions[0]=%p previously set with msg_hdr.\n",				program_name,				extensions[0]);		}		if(debug) {			fprintf(stdout, "%s: assembled SA extension, pfkey msg authalg=%d encalg=%d.\n",				program_name,				authalg,				encryptalg);		}		#if 1 /* def PFKEY_LIFETIME */		if(debug) {			int i,j;			for(i = 0; i < life_maxsever; i++) {				for(j = 0; j < life_maxtype; j++) {					fprintf(stdout, "i=%d, j=%d, life_opt[%d][%d]=%p, life[%d][%d]=%d\n",						i, j, i, j, life_opt[i][j], i, j, life[i][j]);				}			}		}		if(life_opt[life_soft][life_alloc] != NULL ||		   life_opt[life_soft][life_bytes] != NULL ||		   life_opt[life_soft][life_addtime] != NULL ||		   life_opt[life_soft][life_usetime] != NULL ||		   life_opt[life_soft][life_packets] != NULL) {			if((error = pfkey_lifetime_build(&extensions[SADB_EXT_LIFETIME_SOFT],							 SADB_EXT_LIFETIME_SOFT,							 life[life_soft][life_alloc],/*-1,*/		/*allocations*/							 life[life_soft][life_bytes],/*-1,*/		/*bytes*/							 life[life_soft][life_addtime],/*-1,*/		/*addtime*/							 life[life_soft][life_usetime],/*-1,*/		/*usetime*/							 life[life_soft][life_packets]/*-1*/))) {	/*packets*/				fprintf(stderr, "%s: Trouble building lifetime_s extension, error=%d.\n",					program_name, error);				pfkey_extensions_free(extensions);				exit(1);			}			if(debug) {				fprintf(stdout, "%s: lifetime_s extension assembled.\n",					program_name);			}		}		if(life_opt[life_hard][life_alloc] != NULL ||		   life_opt[life_hard][life_bytes] != NULL ||		   life_opt[life_hard][life_addtime] != NULL ||		   life_opt[life_hard][life_usetime] != NULL ||		   life_opt[life_hard][life_packets] != NULL) {			if((error = pfkey_lifetime_build(&extensions[SADB_EXT_LIFETIME_HARD],							 SADB_EXT_LIFETIME_HARD,							 life[life_hard][life_alloc],/*-1,*/		/*allocations*/							 life[life_hard][life_bytes],/*-1,*/		/*bytes*/							 life[life_hard][life_addtime],/*-1,*/		/*addtime*/							 life[life_hard][life_usetime],/*-1,*/		/*usetime*/							 life[life_hard][life_packets]/*-1*/))) {	/*packets*/				fprintf(stderr, "%s: Trouble building lifetime_h extension, error=%d.\n",					program_name, error);				pfkey_extensions_free(extensions);				exit(1);			}			if(debug) {				fprintf(stdout, "%s: lifetime_h extension assembled.\n",					program_name);			}		}#endif /* PFKEY_LIFETIME */				if(debug) {                	addrtot(&src, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: assembling address_s extension (%s).\n",				program_name, ipaddr_txt);		}			if((error = pfkey_address_build(&extensions[SADB_EXT_ADDRESS_SRC],						SADB_EXT_ADDRESS_SRC,						0,						0,						sockaddrof(&src)))) {                	addrtot(&src, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stderr, "%s: Trouble building address_s extension (%s), error=%d.\n",				program_name, ipaddr_txt, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			ip_address temp_addr;						switch(address_family) {				case AF_INET:					initaddr((const unsigned char *)&(((struct sockaddr_in*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_SRC])) + 1))->sin_addr),						sockaddrlenof(&src), address_family, &temp_addr);					break;				case AF_INET6:					initaddr((const unsigned char *)&(((struct sockaddr_in6*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_SRC])) + 1))->sin6_addr),						sockaddrlenof(&src), address_family, &temp_addr);					break;				default:					fprintf(stdout, "%s: unknown address family (%d).\n",						program_name, address_family);					exit(1);			}                	addrtot(&temp_addr, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: address_s extension assembled (%s).\n",				program_name, ipaddr_txt);		}			if(debug) {                	addrtot(&edst, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: assembling address_d extension (%s).\n",				program_name, ipaddr_txt);		}			if((error = pfkey_address_build(&extensions[SADB_EXT_ADDRESS_DST],						SADB_EXT_ADDRESS_DST,						0,						0,						sockaddrof(&edst)))) {                	addrtot(&edst, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stderr, "%s: Trouble building address_d extension (%s), error=%d.\n",				program_name, ipaddr_txt, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			ip_address temp_addr;			switch(address_family) {				case AF_INET:					initaddr((const unsigned char *)&(((struct sockaddr_in*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_DST])) + 1))->sin_addr),						4, address_family, &temp_addr);					break;				case AF_INET6:					initaddr((const unsigned char *)&(((struct sockaddr_in6*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_DST])) + 1))->sin6_addr),						16, address_family, &temp_addr);					break;				default:					fprintf(stdout, "%s: unknown address family (%d).\n",						program_name, address_family);					exit(1);			}                	addrtot(&temp_addr, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: address_d extension assembled (%s).\n",				program_name, ipaddr_txt);		}#if PFKEY_PROXY		anyaddr(address_family, &pfkey_address_p_ska);		if((error = pfkey_address_build(&extensions[SADB_EXT_ADDRESS_PROXY],						SADB_EXT_ADDRESS_PROXY,						0,						0,						sockaddrof(&pfkey_address_p_ska)))) {			fprintf(stderr, "%s: Trouble building address_p extension, error=%d.\n",				program_name, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			fprintf(stdout, "%s: address_p extension assembled.\n", program_name);		}#endif /* PFKEY_PROXY */				switch(alg) {#ifndef NO_KERNEL_ALG		/*	Allow no auth ... after all is local root decision 8)  */		case XF_OTHER_ALG:			if (!authalg)				break;#endif /* NO_KERNEL_ALG */		case XF_AHHMACMD5:		case XF_ESP3DESMD596:		case XF_AHHMACSHA1:		case XF_ESP3DESSHA196:			if((error = pfkey_key_build(&extensions[SADB_EXT_KEY_AUTH],						    SADB_EXT_KEY_AUTH,						    authkeylen * 8,						    authkey))) {				fprintf(stderr, "%s: Trouble building key_a extension, error=%d.\n",					program_name, error);				pfkey_extensions_free(extensions);				exit(1);			}			if(debug) {				fprintf(stdout, "%s: key_a extension assembled.\n",					program_name);			}			break;		default:		}				switch(alg) {		case XF_ESP3DES:		case XF_ESP3DESMD596:		case XF_ESP3DESSHA196:#ifndef NO_KERNEL_ALG		case XF_OTHER_ALG:#endif /* NO_KERNEL_ALG */			if((error = pfkey_key_build(&extensions[SADB_EXT_KEY_ENCRYPT],						    SADB_EXT_KEY_ENCRYPT,						    enckeylen * 8,						    enckey))) {				fprintf(stderr, "%s: Trouble building key_e extension, error=%d.\n",					program_name, error);				pfkey_extensions_free(extensions);				exit(1);			}			if(debug) {				fprintf(stdout, "%s: key_e extension assembled.\n",					program_name);			}			break;		default:		}		#ifdef PFKEY_IDENT /* GG: looks wierd, not touched */		if((pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_SRC],				      SADB_EXT_IDENTITY_SRC,				      SADB_IDENTTYPE_PREFIX,				      0,				      strlen(pfkey_ident_s_ska),				      pfkey_ident_s_ska))) {			fprintf(stderr, "%s: Trouble building ident_s extension, error=%d.\n",				program_name, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(subnettoa(addr, mask, format, pfkey_ident_s_ska,			     sizeof(pfkey_ident_s_ska) ) !=		   sizeof(pfkey_ident_s_ska) ) {			exit (1);		}				if((error = pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_DST],					      SADB_EXT_IDENTITY_DST,					      SADB_IDENTTYPE_PREFIX,					      0,					      strlen(pfkey_ident_d_ska),					      pfkey_ident_d_ska))) {			fprintf(stderr, "%s: Trouble building ident_d extension, error=%d.\n",				program_name, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(subnettoa(addr, mask, format, pfkey_ident_d_ska,			     sizeof(pfkey_ident_d_ska) ) !=		   sizeof(pfkey_ident_d_ska) ) {			exit (1);		}		if(debug) {			fprintf(stdout, "%s: ident extensions assembled.\n",				program_name);		}#endif /* PFKEY_IDENT */	}		if(debug) {		fprintf(stdout, "%s: assembling pfkey msg....\n",			program_name);	}	if((error = pfkey_msg_build(&pfkey_msg, extensions, EXT_BITS_IN))) {		fprintf(stderr, "%s: Trouble building pfkey message, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		exit(1);	}	if(debug) {		fprintf(stdout, "%s: assembled.\n",			program_name);	}	if(debug) {		fprintf(stdout, "%s: writing pfkey msg.\n",			program_name);	}	if((error = write(pfkey_sock,			  pfkey_msg,			  pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN)) !=	   pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) {		fprintf(stderr, "%s: pfkey write failed, returning %d with errno=%d.\n",			program_name, error, errno);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		switch(errno) {		case EACCES:			fprintf(stderr, "access denied.  ");			if(getuid() == 0) {				fprintf(stderr, "Check permissions.  Should be 600.\n");			} else {				fprintf(stderr, "You must be root to open this file.\n");			}			break;		case EUNATCH:			fprintf(stderr, "Netlink not enabled OR KLIPS not loaded.\n");			break;		case EBUSY:			fprintf(stderr, "KLIPS is busy.  Most likely a serious internal error occured in a previous command.  Please report as much detail as possible to development team.\n");			break;		case EINVAL:			fprintf(stderr, "Invalid argument, check kernel log messages for specifics.\n");			break;		case ENODEV:			fprintf(stderr, "KLIPS not loaded or enabled.\n");			fprintf(stderr, "No device?!?\n");			break;		case ENOBUFS:			fprintf(stderr, "No kernel memory to allocate SA.\n");			break;		case ESOCKTNOSUPPORT:			fprintf(stderr, "Algorithm support not available in the kernel.  Please compile in support.\n");			break;		case EEXIST:			fprintf(stderr, "SA already in use.  Delete old one first.\n");			break;		case ENOENT:			fprintf(stderr, "device does not exist.  See FreeS/WAN installation procedure.\n");			break;		case ENXIO:		case ESRCH:			fprintf(stderr, "SA does not exist.  Cannot delete.\n");			break;		default:			fprintf(stderr, "Unknown socket write error %d.  Please report as much detail as possible to development team.\n", errno);		}/*		fprintf(stderr, "%s: socket write returned errno %d\n",		program_name, errno);*/		exit(1);	}	if(debug) {		fprintf(stdout, "%s: pfkey command written to socket.\n",			program_name);	}	#if 0 /* use write() rather than sendmsg() */	error = sendmsg(/* int */pfkey_sock,		/* const void* */msg,		/* int */len,		/* unsigned int flags MSG_OOB|MSG_DONTROUTE */ 0);	if( error == -1 ) {		fprintf(stderr, "%s: pfkey sendmsg failed.\n",			program_name);		switch(errno) {			case EINVAL:				fprintf(stderr, "bad data error, since this should not happen, advise the maintainer.\n");				exit(1);			case EBADF:			case ENOTSOCK:			case EFAULT:			case EMSGSIZE:			case EWOULDBLOCK:			case ENOBUFS:				fprintf(stderr, "system error:%d\n", error);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -