📄 pfkey_v2_parser.c
字号:
"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 + -