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

📄 spi.c

📁 网上下到的一个很详细介绍VPN基础知识的资料
💻 C
📖 第 1 页 / 共 4 页
字号:
			fprintf(stderr, "Signal handler registration error.\n", sig_act_err);			exit(1);		}	}#endif /* SIGS_FROM_BELOW */	#ifdef MANUAL_IS_NOT_ABLE_TO_NEGOTIATE	/* for registering SA types that can be negociated */	/* Register the fact that I can negociate AH SA's */	pfkey_extensions_init(extensions);	if((error = pfkey_msg_hdr_build(&extensions[0],					SADB_REGISTER,					SADB_SATYPE_AH,					0,					++pfkey_seq,					getpid()))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		exit(1);	}	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(write(pfkey_sock, pfkey_msg,		 pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) !=	   pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) {		/* cleanup code here */		fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		exit(1);	}	pfkey_extensions_free(extensions);	pfkey_msg_free(&pfkey_msg);	/* Register the fact that I can negociate ESP SA's */	pfkey_extensions_init(extensions);	if((error = pfkey_msg_hdr_build(&extensions[0],					SADB_REGISTER,					SADB_SATYPE_ESP,					0,					++pfkey_seq,					getpid()))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		exit(1);	}	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(write(pfkey_sock, pfkey_msg,		 pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) !=	   pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) {		fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name);		/* cleanup code here */		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		exit(1);	}	pfkey_extensions_free(extensions);	pfkey_msg_free(&pfkey_msg);	/* Register the fact that I can negociate IPIP SA's */	pfkey_extensions_init(extensions);	if((error = pfkey_msg_hdr_build(&extensions[0],					SADB_REGISTER,					SADB_X_SATYPE_IPIP,					0,					++pfkey_seq,					getpid()))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		exit(1);	}	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(write(pfkey_sock, pfkey_msg,		 pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) !=	   pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) {		/* cleanup code here */		fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		exit(1);	}	pfkey_extensions_free(extensions);	pfkey_msg_free(&pfkey_msg);	/* Register the fact that I can negociate COMP SA's */	pfkey_extensions_init(extensions);	if((error = pfkey_msg_hdr_build(&extensions[0],					SADB_REGISTER,					SADB_X_SATYPE_COMP,					0,					++pfkey_seq,					getpid()))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		exit(1);	}	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(write(pfkey_sock, pfkey_msg,		 pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) !=	   pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) {		/* cleanup code here */		fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		exit(1);	}	pfkey_extensions_free(extensions);	pfkey_msg_free(&pfkey_msg);#endif /* MANUAL_IS_NOT_ABLE_TO_NEGOTIATE */	/* Build an SADB_ADD message to send down. */	/* It needs <base, SA, address(SD), key(AE)> minimum. */	/*   Lifetime(HS) could be added before addresses. */	pfkey_extensions_init(extensions);	if(debug) {		fprintf(stdout, "%s: extensions=%p &extensions=%p extensions[0]=%p &extensions[0]=%p cleared.\n",			program_name,			extensions,			&extensions,			extensions[0],			&extensions[0]);	}	if((error = pfkey_msg_hdr_build(&extensions[0],					(alg == XF_DEL ? SADB_DELETE : alg == XF_CLR ? SADB_FLUSH : SADB_ADD),					proto2satype(proto),					0,			    ++pfkey_seq,			    getpid()))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		exit(1);	}	if(debug) {		fprintf(stdout, "%s: extensions=%p &extensions=%p extensions[0]=%p &extensions[0]=%p set w/msghdr.\n",			program_name,			extensions,			&extensions,			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;	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;	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);		}		#ifdef PFKEY_LIFETIME		if((error = pfkey_lifetime_build(&extension[SADB_EXT_LIFETIME_SOFT],						 SADB_EXT_LIFETIME_SOFT,						 -1,						 -1,						 -1,						 -1))) {			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((error = pfkey_lifetime_build(&extensions[SADB_EXT_LIFETIME_HARD],						 SADB_EXT_LIFETIME_HARD,						 -1,						 -1,						 -1,						 -1))) {			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) {		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:			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 wired, not touched */		if((pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_SRC],				      SADB_EXT_IDENTITY_SRC,				      SADB_IDENTTYPE_PREFIX,				      0,				      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) ) {		}				if((error = pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_DST],					      SADB_EXT_IDENTITY_DST,					      SADB_IDENTTYPE_PREFIX,					      0,					      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) ) {		}		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);

⌨️ 快捷键说明

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