📄 pfkey_v2_parser.c
字号:
tdbq = ipsec_sa_getbyid(&(extr->tdb->tdb_said)); if (!tdbq) { spin_unlock_bh(&tdb_lock); KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: " "reserved Tunnel Descriptor Block for SA: %s not found. Call SADB_GETSPI first or call SADB_ADD instead.\n", sa_len ? sa : " (error)"); SENDERR(ENOENT); } 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_update_parse: " "existing Tunnel Descriptor Block found (this is good) for SA: %s, %s-bound, updating.\n", sa_len ? sa : " (error)", extr->tdb->tdb_flags & EMT_INBOUND ? "in" : "out");#ifdef CONFIG_IPSEC_NAT_TRAVERSAL if (extr->tdb->ips_natt_sport || extr->tdb->ips_natt_dport) { KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: only updating NAT-T ports " "(%u:%u -> %u:%u)\n", tdbq->ips_natt_sport, tdbq->ips_natt_dport, extr->tdb->ips_natt_sport, extr->tdb->ips_natt_dport); if (extr->tdb->ips_natt_sport) { tdbq->ips_natt_sport = extr->tdb->ips_natt_sport; if (tdbq->ips_addr_s->sa_family == AF_INET) { ((struct sockaddr_in *)(tdbq->ips_addr_s))->sin_port = htons(extr->tdb->ips_natt_sport); } } if (extr->tdb->ips_natt_dport) { tdbq->ips_natt_dport = extr->tdb->ips_natt_dport; if (tdbq->ips_addr_d->sa_family == AF_INET) { ((struct sockaddr_in *)(tdbq->ips_addr_d))->sin_port = htons(extr->tdb->ips_natt_dport); } } nat_t_tdb_saved = extr->tdb; extr->tdb = tdbq; } else {#endif /* XXX extr->tdb->tdb_rcvif = &(enc_softc[em->em_if].enc_if);*/ extr->tdb->tdb_rcvif = NULL; if ((error = pfkey_ipsec_sa_init(extr->tdb, extensions))) { spin_unlock_bh(&tdb_lock); KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: " "not successful for SA: %s, deleting.\n", sa_len ? sa : " (error)"); SENDERR(-error); } extr->tdb->ips_life.ipl_addtime.ipl_count = tdbq->ips_life.ipl_addtime.ipl_count; if((error = ipsec_sa_delchain(tdbq))) { spin_unlock_bh(&tdb_lock); KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse: " "error=%d, trouble deleting intermediate tdb for SA=%s.\n", error, sa_len ? sa : " (error)"); SENDERR(-error); }#ifdef CONFIG_IPSEC_NAT_TRAVERSAL }#endif spin_unlock_bh(&tdb_lock); if(!(pfkey_safe_build(error = pfkey_msg_hdr_build(&extensions_reply[0], SADB_UPDATE, 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->ips_life.ipl_allocations.ipl_hard, extr->tdb->ips_life.ipl_bytes.ipl_hard, extr->tdb->ips_life.ipl_addtime.ipl_hard, extr->tdb->ips_life.ipl_usetime.ipl_hard, extr->tdb->ips_life.ipl_packets.ipl_hard), 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->ips_life.ipl_allocations.ipl_count, extr->tdb->ips_life.ipl_bytes.ipl_count, extr->tdb->ips_life.ipl_addtime.ipl_count, extr->tdb->ips_life.ipl_usetime.ipl_count, extr->tdb->ips_life.ipl_packets.ipl_count), extensions_reply) : 1) && (extr->tdb->ips_life.ipl_allocations.ipl_count || extr->tdb->ips_life.ipl_bytes.ipl_count || extr->tdb->ips_life.ipl_addtime.ipl_count || extr->tdb->ips_life.ipl_usetime.ipl_count || extr->tdb->ips_life.ipl_packets.ipl_count ? pfkey_safe_build(error = pfkey_lifetime_build(&extensions_reply[SADB_EXT_LIFETIME_CURRENT], SADB_EXT_LIFETIME_CURRENT, extr->tdb->ips_life.ipl_allocations.ipl_count, extr->tdb->ips_life.ipl_bytes.ipl_count, extr->tdb->ips_life.ipl_addtime.ipl_count, extr->tdb->ips_life.ipl_usetime.ipl_count, extr->tdb->ips_life.ipl_packets.ipl_count), 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) && (extr->tdb->tdb_ident_s.data ? pfkey_safe_build(error = pfkey_ident_build(&extensions_reply[SADB_EXT_IDENTITY_SRC], SADB_EXT_IDENTITY_SRC, extr->tdb->tdb_ident_s.type, extr->tdb->tdb_ident_s.id, extr->tdb->tdb_ident_s.len, extr->tdb->tdb_ident_s.data), extensions_reply) : 1) && (extr->tdb->tdb_ident_d.data ? pfkey_safe_build(error = pfkey_ident_build(&extensions_reply[SADB_EXT_IDENTITY_DST], SADB_EXT_IDENTITY_DST, extr->tdb->tdb_ident_d.type, extr->tdb->tdb_ident_d.id, extr->tdb->tdb_ident_d.len, extr->tdb->tdb_ident_d.data), extensions_reply) : 1)#if 0 /* 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_update_parse: " "failed to build the update 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_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); }#ifdef CONFIG_IPSEC_NAT_TRAVERSAL if (nat_t_tdb_saved) { /** * As we _really_ update existing SA, we keep tdbq and need to delete * parsed tdb (nat_t_tdb_saved, was extr->tdb). * * goto errlab with extr->tdb = nat_t_tdb_saved will free it. */ extr->tdb = nat_t_tdb_saved; error = 0; KLIPS_PRINT(debug_pfkey, "klips_debug:pfkey_update_parse (NAT-T ports): " "successful for SA: %s\n", sa_len ? sa : " (error)"); goto errlab; }#endif if((error = ipsec_sa_put(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)"); 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 ipsec_sa* 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 = ipsec_sa_getbyid(&(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_ipsec_sa_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->ips_life.ipl_addtime.ipl_count = jiffies / HZ; if(!extr->tdb->ips_life.ipl_allocations.ipl_count) { extr->tdb->ips_life.ipl_allocations.ipl_count += 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->ips_life.ipl_allocations.ipl_hard, extr->tdb->ips_life.ipl_bytes.ipl_hard, extr->tdb->ips_life.ipl_addtime.ipl_hard, extr->tdb->ips_life.ipl_usetime.ipl_hard, extr->tdb->ips_life.ipl_packets.ipl_hard), 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->ips_life.ipl_allocations.ipl_soft, extr->tdb->ips_life.ipl_bytes.ipl_soft, extr->tdb->ips_life.ipl_addtime.ipl_soft, extr->tdb->ips_life.ipl_usetime.ipl_soft, extr->tdb->ips_life.ipl_packets.ipl_soft), 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) && (extr->tdb->tdb_ident_s.data ? pfkey_safe_build(error = pfkey_ident_build(&extensions_reply[SADB_EXT_IDENTITY_SRC], SADB_EXT_IDENTITY_SRC, extr->tdb->tdb_ident_s.type, extr->tdb->tdb_ident_s.id, extr->tdb->tdb_ident_s.len, extr->tdb->tdb_ident_s.data), extensions_reply) : 1) && (extr->tdb->tdb_ident_d.data ? pfkey_safe_build(error = pfkey_ident_build(&extensions_reply[SADB_EXT_IDENTITY_DST], SADB_EXT_IDENTITY_DST, extr->tdb->tdb_ident_d.type, extr->tdb->tdb_ident_d.id, extr->tdb->tdb_ident_d.len, extr->tdb->tdb_ident_d.data), extensions_reply) : 1)#if 0 /* 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 = 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); } if((error = ipsec_sa_put(extr->tdb))) { KLIPS_PR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -