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

📄 pfkey_v2_parser.c

📁 网上下到的一个很详细介绍VPN基础知识的资料
💻 C
📖 第 1 页 / 共 5 页
字号:
			    "failed to build the update reply message extensions\n");		SENDERR(-error);	}			if((error = puttdb(extr->tdb))) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: "			    "failed to update the mature SA=%s with error=%d.\n",			    sa_len ? sa : " (error)",			    error);		SENDERR(-error);	}	extr->tdb = NULL;		KLIPS_PRINT(debug_pfkey,		    "klips_debug:pfkey_update_parse: "		    "successful for SA: %s\n",		    sa_len ? sa : " (error)");		if((error = pfkey_msg_build(&pfkey_reply, extensions_reply, EXT_BITS_OUT))) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: "			    "failed to build the update reply message\n");		SENDERR(-error);	}	for(pfkey_socketsp = pfkey_open_sockets;	    pfkey_socketsp;	    pfkey_socketsp = pfkey_socketsp->next) {		if((error = pfkey_upmsg(pfkey_socketsp->socketp, pfkey_reply))) {			KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: "				    "sending up update reply message for satype=%d(%s) to socket=%p failed with error=%d.\n",				    satype,				    satype2name(satype),				    pfkey_socketsp->socketp,				    error);			SENDERR(-error);		}		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: "			    "sending up update reply message for satype=%d(%s) to socket=%p succeeded.\n",			    satype,			    satype2name(satype),			    pfkey_socketsp->socketp);	}	 errlab:	if (pfkey_reply) {		pfkey_msg_free(&pfkey_reply);	}	pfkey_extensions_free(extensions_reply);	return error;}DEBUG_NO_STATIC intpfkey_add_parse(struct sock *sk, struct sadb_ext **extensions, struct pfkey_extracted_data* extr){	int error = 0;	struct tdb* tdbq;	char sa[SATOA_BUF];	size_t sa_len;	struct sadb_ext *extensions_reply[SADB_EXT_MAX+1];	struct sadb_msg *pfkey_reply = NULL;	struct socket_list *pfkey_socketsp;	uint8_t satype = ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_satype;	KLIPS_PRINT(debug_pfkey,		    "klips_debug:pfkey_add_parse: .\n");	pfkey_extensions_init(extensions_reply);	if(((struct sadb_sa*)extensions[SADB_EXT_SA])->sadb_sa_state != SADB_SASTATE_MATURE) {		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_add_parse: "			    "error, sa_state=%d must be MATURE=%d\n",			    ((struct sadb_sa*)extensions[SADB_EXT_SA])->sadb_sa_state,			    SADB_SASTATE_MATURE);		SENDERR(EINVAL);	}	if(!extr || !extr->tdb) {		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_add_parse: "			    "extr or extr->tdb pointer NULL\n");		SENDERR(EINVAL);	}	sa_len = satoa(extr->tdb->tdb_said, 0, sa, SATOA_BUF);	tdbq = gettdb(&(extr->tdb->tdb_said));	if (tdbq) {		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_add_parse: "			    "found an old Tunnel Descriptor Block for SA%s, delete it first.\n",			    sa_len ? sa : " (error)");		SENDERR(EEXIST);	}	if(ip_chk_addr((unsigned long)extr->tdb->tdb_said.dst.s_addr) == IS_MYADDR) {		extr->tdb->tdb_flags |= EMT_INBOUND;	}	KLIPS_PRINT(debug_pfkey,		    "klips_debug:pfkey_add_parse: "		    "existing Tunnel Descriptor Block not found (this is good) for SA%s, %s-bound, allocating.\n",		    sa_len ? sa : " (error)",		    extr->tdb->tdb_flags & EMT_INBOUND ? "in" : "out");		/* XXX extr->tdb->tdb_rcvif = &(enc_softc[em->em_if].enc_if);*/	extr->tdb->tdb_rcvif = NULL;		if ((error = pfkey_tdb_init(extr->tdb, extensions))) {		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_add_parse: "			    "not successful for SA: %s, deleting.\n",			    sa_len ? sa : " (error)");		SENDERR(-error);	}	extr->tdb->tdb_lifetime_addtime_c = jiffies / HZ;	if(!extr->tdb->tdb_lifetime_allocations_c) {		extr->tdb->tdb_lifetime_allocations_c += 1;	}	if(!(pfkey_safe_build(error = pfkey_msg_hdr_build(&extensions_reply[0],							  SADB_ADD,							  satype,							  0,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_seq,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_pid),			      extensions_reply)	     && pfkey_safe_build(error = pfkey_sa_build(&extensions_reply[SADB_EXT_SA],							SADB_EXT_SA,							extr->tdb->tdb_said.spi,							extr->tdb->tdb_replaywin,							extr->tdb->tdb_state,							extr->tdb->tdb_authalg,							extr->tdb->tdb_encalg,							extr->tdb->tdb_flags),				 extensions_reply)	     /* The 3 lifetime extentions should only be sent if non-zero. */	     && (extensions[SADB_EXT_LIFETIME_HARD]		 ? pfkey_safe_build(error = pfkey_lifetime_build(&extensions_reply[SADB_EXT_LIFETIME_HARD],								 SADB_EXT_LIFETIME_HARD,								 extr->tdb->tdb_lifetime_allocations_h,								 extr->tdb->tdb_lifetime_bytes_h,								 extr->tdb->tdb_lifetime_addtime_h,								 extr->tdb->tdb_lifetime_usetime_h),				    extensions_reply) : 1)	     && (extensions[SADB_EXT_LIFETIME_SOFT]		 ? pfkey_safe_build(error = pfkey_lifetime_build(&extensions_reply[SADB_EXT_LIFETIME_SOFT],								 SADB_EXT_LIFETIME_SOFT,								 extr->tdb->tdb_lifetime_allocations_s,								 extr->tdb->tdb_lifetime_bytes_s,								 extr->tdb->tdb_lifetime_addtime_s,								 extr->tdb->tdb_lifetime_usetime_s),				    extensions_reply) : 1)	     && pfkey_safe_build(error = pfkey_address_build(&extensions_reply[SADB_EXT_ADDRESS_SRC],							     SADB_EXT_ADDRESS_SRC,							     0, /*extr->tdb->tdb_said.proto,*/							     0,							     extr->tdb->tdb_addr_s),				 extensions_reply)	     && pfkey_safe_build(error = pfkey_address_build(&extensions_reply[SADB_EXT_ADDRESS_DST],							     SADB_EXT_ADDRESS_DST,							     0, /*extr->tdb->tdb_said.proto,*/							     0,							     extr->tdb->tdb_addr_d),				 extensions_reply)#if 0	     /* FIXME: This won't work yet because I have not finished		it. */	     && (extr->tdb->tdb_ident_data_s		 ? pfkey_safe_build(error = pfkey_ident_build(&extensions_reply[SADB_EXT_IDENTITY_SRC],							      SADB_EXT_IDENTITY_SRC,							      SADB_IDENTTYPE_PREFIX,							      0,							      extr->tdb->tdb_ident_data_s),				    extensions_reply) : 1)	     /* FIXME: This won't work yet because I have not finished		it. */	     && (extr->tdb->tdb_ident_data_d		 ? pfkey_safe_build(error = pfkey_ident_build(&extensions_reply[SADB_EXT_IDENTITY_DST],							      SADB_EXT_IDENTITY_DST,							      SADB_IDENTTYPE_PREFIX,							      0,							      extr->tdb->tdb_ident_data_d),				    extensions_reply) : 1)	     /* FIXME: This won't work yet because I have not finished		it. */	     && (extr->tdb->tdb_sens_		 ? pfkey_safe_build(error = pfkey_sens_build(&extensions_reply[SADB_EXT_SENSITIVITY],							     extr->tdb->tdb_sens_dpd,							     extr->tdb->tdb_sens_sens_level,							     extr->tdb->tdb_sens_sens_len,							     extr->tdb->tdb_sens_sens_bitmap,							     extr->tdb->tdb_sens_integ_level,							     extr->tdb->tdb_sens_integ_len,							     extr->tdb->tdb_sens_integ_bitmap),				    extensions_reply) : 1)#endif		)) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_add_parse: "			    "failed to build the add reply message extensions\n");		SENDERR(-error);	}			if((error = puttdb(extr->tdb))) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_add_parse: "			    "failed to add the mature SA with error=%d.\n",			    error);		SENDERR(-error);	}	extr->tdb = NULL;		KLIPS_PRINT(debug_pfkey,		    "klips_debug:pfkey_add_parse: "		    "successful for SA: %s\n",		    sa_len ? sa : " (error)");		if((error = pfkey_msg_build(&pfkey_reply, extensions_reply, EXT_BITS_OUT))) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_add_parse: "			    "failed to build the add reply message\n");		SENDERR(-error);	}	for(pfkey_socketsp = pfkey_open_sockets;	    pfkey_socketsp;	    pfkey_socketsp = pfkey_socketsp->next) {		if((error = pfkey_upmsg(pfkey_socketsp->socketp, pfkey_reply))) {			KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_add_parse: "				    "sending up add reply message for satype=%d(%s) to socket=%p failed with error=%d.\n",				    satype,				    satype2name(satype),				    pfkey_socketsp->socketp,				    error);			SENDERR(-error);		}		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_add_parse: "			    "sending up add reply message for satype=%d(%s) to socket=%p succeeded.\n",			    satype,			    satype2name(satype),			    pfkey_socketsp->socketp);	}	 errlab:	if (pfkey_reply) {		pfkey_msg_free(&pfkey_reply);	}	pfkey_extensions_free(extensions_reply);	return error;}DEBUG_NO_STATIC intpfkey_delete_parse(struct sock *sk, struct sadb_ext **extensions, struct pfkey_extracted_data* extr){	struct tdb *tdbp;	char sa[SATOA_BUF];	size_t sa_len;	int error = 0;	struct sadb_ext *extensions_reply[SADB_EXT_MAX+1];	struct sadb_msg *pfkey_reply = NULL;	struct socket_list *pfkey_socketsp;	uint8_t satype = ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_satype;	KLIPS_PRINT(debug_pfkey,		    "klips_debug:pfkey_delete_parse: .\n");	pfkey_extensions_init(extensions_reply);	if(!extr || !extr->tdb) {		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_delete_parse: "			    "extr or extr->tdb pointer NULL, fatal\n");		SENDERR(EINVAL);	}	sa_len = satoa(extr->tdb->tdb_said, 0, sa, SATOA_BUF);	spin_lock_bh(&tdb_lock);	tdbp = gettdb(&(extr->tdb->tdb_said));	if (tdbp == NULL) {		spin_unlock_bh(&tdb_lock);		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_delete_parse: "			    "Tunnel Descriptor Block not found for SA:%s, could not delete.\n",			    sa_len ? sa : " (error)");		SENDERR(ESRCH);	}	if((error = deltdbchain(tdbp))) {		spin_unlock_bh(&tdb_lock);		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_delete_parse: "			    "error=%d returned trying to delete Tunnel Descriptor Block for SA:%s.\n",			    error,			    sa_len ? sa : " (error)");		SENDERR(-error);	}	spin_unlock_bh(&tdb_lock);	if(!(pfkey_safe_build(error = pfkey_msg_hdr_build(&extensions_reply[0],							  SADB_DELETE,							  satype,							  0,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_seq,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_pid),			      extensions_reply)	     && pfkey_safe_build(error = pfkey_sa_build(&extensions_reply[SADB_EXT_SA],							SADB_EXT_SA,							extr->tdb->tdb_said.spi,							0,							0,							0,							0,							0),				 extensions_reply)	     && pfkey_safe_build(error = pfkey_address_build(&extensions_reply[SADB_EXT_ADDRESS_SRC],							     SADB_EXT_ADDRESS_SRC,							     0, /*extr->tdb->tdb_said.proto,*/							     0,							     extr->tdb->tdb_addr_s),				 extensions_reply)	     && pfkey_safe_build(error = pfkey_address_build(&extensions_reply[SADB_EXT_ADDRESS_DST],							     SADB_EXT_ADDRESS_DST,							     0, /*extr->tdb->tdb_said.proto,*/							     0,							     extr->tdb->tdb_addr_d),				 extensions_reply)		)) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_delete_parse: "			    "failed to build the delete reply message extensions\n");		SENDERR(-error);	}		if((error = pfkey_msg_build(&pfkey_reply, extensions_reply, EXT_BITS_OUT))) {		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_delete_parse: "			    "failed to build the delete reply message\n");		SENDERR(-error);	}	for(pfkey_socketsp = pfkey_open_sockets;	    pfkey_socketsp;	    pfkey_socketsp = pfkey_socketsp->next) {		if((error = pfkey_upmsg(pfkey_socketsp->socketp, pfkey_reply))) {			KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_delete_parse: "				    "sending up delete reply message for satype=%d(%s) to socket=%p failed with error=%d.\n",				    satype,				    satype2name(satype),				    pfkey_socketsp->socketp,				    error);			SENDERR(-error);		}		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_delete_parse: "			    "sending up delete reply message for satype=%d(%s) to socket=%p succeeded.\n",			    satype,			    satype2name(satype),			    pfkey_socketsp->socketp);	}	 errlab:	if (pfkey_reply) {		pfkey_msg_free(&pfkey_reply);	}	pfkey_extensions_free(extensions_reply);	return error;}DEBUG_NO_STATIC intpfkey_get_parse(struct sock *sk, struct sadb_ext **extensions, struct pfkey_extracted_data* extr){	int error = 0;	struct tdb *tdbp;	char sa[SATOA_BUF];	size_t sa_len;	struct sadb_ext *extensions_reply[SADB_EXT_MAX+1];	struct sadb_msg *pfkey_reply = NULL;	KLIPS_PRINT(debug_pfkey,		    "klips_debug:pfkey_get_parse: .\n");	pfkey_extensions_init(extensions_reply);	if(!extr || !extr->tdb) {		KLIPS_PRINT(debug_pfkey,			    "klips_debug:pfkey_get_parse: "			    "extr or extr->tdb pointer NULL, fatal\n");		SENDERR(EINVAL);	}	sa_len = satoa(extr->tdb->tdb_said, 0, sa, SATOA_BUF);	spin_lock_bh(&tdb_lock);	tdbp = gettdb(&(extr->tdb->tdb_said));	if (tdbp == NULL) {		spin_unlock_bh(&tdb_lock);		KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_get_parse: "			    "Tunnel Descriptor Block not found for SA=%s, could not get.\n",			    sa_len ? sa : " (error)");		SENDERR(ESRCH);	}		if(!(pfkey_safe_build(error = pfkey_msg_hdr_build(&extensions_reply[0],							  SADB_GET,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_satype,							  0,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_seq,							  ((struct sadb_msg*)extensions[SADB_EXT_RESERVED])->sadb_msg_pid),			      extensions_reply)	     && pfkey_safe_build(error = pfkey_sa_build(&extensions_reply[SADB_EXT_SA],							SADB_EXT_SA,							extr->tdb->tdb_said.spi,							extr->tdb->tdb_replaywin,							extr->tdb->tdb_state,							extr->tdb->tdb_authalg,							extr->tdb->tdb_encalg,							extr->tdb->tdb_flags),				 extensions_reply)	     /* The 3 lifetime extentions should only be sent if non-zero. */	     && (tdbp->tdb_lifetime_allocations_c		 || tdbp->tdb_lifetime_bytes_c		 || tdbp->tdb_lifetime_addtime_c		 || tdbp->tdb_lifetime_usetime_c		 ? pfkey_safe_build(error = 

⌨️ 快捷键说明

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