diff options
-rw-r--r-- | isisd/ChangeLog | 5 | ||||
-rw-r--r-- | isisd/isis_common.h | 4 | ||||
-rw-r--r-- | isisd/isis_pdu.c | 49 | ||||
-rw-r--r-- | isisd/isisd.c | 74 |
4 files changed, 102 insertions, 30 deletions
diff --git a/isisd/ChangeLog b/isisd/ChangeLog index 21453077..0893e6f5 100644 --- a/isisd/ChangeLog +++ b/isisd/ChangeLog @@ -1,3 +1,8 @@ +2005-01-01 Hasso Tepper <hasso at quagga.net> + + * isis_common.h, isisd.c, isis_pdu.c: Implement authentication in + SNPs correctly - ie. make it conditional like it is in IOS. + 2004-12-29 Hasso Tepper <hasso at quagga.net> * isis_circuit.c, isis_csm.c, isis_zebra.c: Don't crash during diff --git a/isisd/isis_common.h b/isisd/isis_common.h index 7a0768a8..26338556 100644 --- a/isisd/isis_common.h +++ b/isisd/isis_common.h @@ -37,6 +37,10 @@ struct isis_passwd #define ISIS_PASSWD_TYPE_CLEARTXT 1 #define ISIS_PASSWD_TYPE_PRIVATE 255 u_char type; + /* Authenticate SNPs? */ +#define SNP_AUTH_SEND 0x01 +#define SNP_AUTH_RECV 0x02 + u_char snp_auth; u_char passwd[255]; }; diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index bac903a7..0e0a8322 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -1270,10 +1270,7 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit, struct listnode *node, *node2; struct tlvs tlvs; struct list *lsp_list = NULL; - /* TODO: Implement SNP authentication. */ -#if 0 struct isis_passwd *passwd; -#endif if (snp_type == ISIS_SNP_CSNP_FLAG) { @@ -1398,27 +1395,25 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit, return retval; } - /* FIXME: Authentication in LSPs does not mean authentication in SNPs... - * In fact by default IOS only deals with LSPs authentication!! - * To force authentication in SNPs, one must specify the 'authenticate - * snp' command after 'area-password WORD' or 'domain-password WORD'. - * This command is not supported for the moment. - */ -#if 0 - (level == 1) ? (passwd = &circuit->area->area_passwd) : - (passwd = &circuit->area->domain_passwd); - if (passwd->type) + if (level == 1) + passwd = &circuit->area->area_passwd; + else + passwd = &circuit->area->domain_passwd; + + if (CHECK_FLAG(passwd->snp_auth, SNP_AUTH_RECV)) { - if (!(found & TLVFLAG_AUTH_INFO) || - authentication_check (passwd, &tlvs.auth_info)) + if (passwd->type) { - isis_event_auth_failure (circuit->area->area_tag, - "SNP authentication" " failure", - phdr ? phdr->source_id : chdr->source_id); - return ISIS_OK; + if (!(found & TLVFLAG_AUTH_INFO) || + authentication_check (passwd, &tlvs.auth_info)) + { + isis_event_auth_failure (circuit->area->area_tag, + "SNP authentication" " failure", + phdr ? phdr->source_id : chdr->source_id); + return ISIS_OK; + } } } -#endif /* 0 */ /* debug isis snp-packets */ if (isis->debugs & DEBUG_SNP_PACKETS) @@ -2155,9 +2150,10 @@ build_csnp (int level, u_char * start, u_char * stop, struct list *lsps, else passwd = &circuit->area->domain_passwd; - if (passwd->type) - retval = tlv_add_authinfo (passwd->type, passwd->len, - passwd->passwd, circuit->snd_stream); + if (CHECK_FLAG(passwd->snp_auth, SNP_AUTH_SEND)) + if (passwd->type) + retval = tlv_add_authinfo (passwd->type, passwd->len, + passwd->passwd, circuit->snd_stream); if (!retval && lsps) { @@ -2305,9 +2301,10 @@ build_psnp (int level, struct isis_circuit *circuit, struct list *lsps) else passwd = &circuit->area->domain_passwd; - if (passwd->type) - retval = tlv_add_authinfo (passwd->type, passwd->len, - passwd->passwd, circuit->snd_stream); + if (CHECK_FLAG(passwd->snp_auth, SNP_AUTH_SEND)) + if (passwd->type) + retval = tlv_add_authinfo (passwd->type, passwd->len, + passwd->passwd, circuit->snd_stream); if (!retval && lsps) { diff --git a/isisd/isisd.c b/isisd/isisd.c index f920453d..e4d73c30 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -1049,9 +1049,33 @@ DEFUN (area_passwd, area->area_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT; strncpy ((char *)area->area_passwd.passwd, argv[0], 255); + if (argc > 1) + { + SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND); + if (strncmp(argv[1], "v", 1) == 0) + SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV); + else + UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV); + } + else + { + UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND); + UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV); + } + return CMD_SUCCESS; } +ALIAS (area_passwd, + area_passwd_snpauth_cmd, + "area-password WORD authenticate snp (send-only|validate)", + "Configure the authentication password for an area\n" + "Area password\n" + "Authentication\n" + "SNP PDUs\n" + "Send but do not check PDUs on receiving\n" + "Send and check PDUs on receiving\n"); + DEFUN (no_area_passwd, no_area_passwd_cmd, "no area-password", @@ -1100,9 +1124,33 @@ DEFUN (domain_passwd, area->domain_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT; strncpy ((char *)area->domain_passwd.passwd, argv[0], 255); + if (argc > 1) + { + SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND); + if (strncmp(argv[1], "v", 1) == 0) + SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV); + else + UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV); + } + else + { + UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND); + UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV); + } + return CMD_SUCCESS; } +ALIAS (domain_passwd, + domain_passwd_snpauth_cmd, + "domain-password WORD authenticate snp (send-only|validate)", + "Set the authentication password for a routing domain\n" + "Routing domain password\n" + "Authentication\n" + "SNP PDUs\n" + "Send but do not check PDUs on receiving\n" + "Send and check PDUs on receiving\n"); + DEFUN (no_domain_passwd, no_domain_passwd_cmd, "no domain-password WORD", @@ -1904,14 +1952,30 @@ isis_config_write (struct vty *vty) /* Authentication passwords. */ if (area->area_passwd.len > 0) { - vty_out(vty, " area-password %s%s", - area->area_passwd.passwd, VTY_NEWLINE); + vty_out(vty, " area-password %s", area->area_passwd.passwd); + if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND)) + { + vty_out(vty, " authenticate snp "); + if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV)) + vty_out(vty, "validate"); + else + vty_out(vty, "send-only"); + } + vty_out(vty, "%s", VTY_NEWLINE); write++; } if (area->domain_passwd.len > 0) { - vty_out(vty, " domain-password %s%s", - area->domain_passwd.passwd, VTY_NEWLINE); + vty_out(vty, " domain-password %s", area->domain_passwd.passwd); + if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND)) + { + vty_out(vty, " authenticate snp "); + if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV)) + vty_out(vty, "validate"); + else + vty_out(vty, "send-only"); + } + vty_out(vty, "%s", VTY_NEWLINE); write++; } #ifdef TOPOLOGY_GENERATE @@ -2028,9 +2092,11 @@ isis_init () install_element (ISIS_NODE, &no_is_type_cmd); install_element (ISIS_NODE, &area_passwd_cmd); + install_element (ISIS_NODE, &area_passwd_snpauth_cmd); install_element (ISIS_NODE, &no_area_passwd_cmd); install_element (ISIS_NODE, &domain_passwd_cmd); + install_element (ISIS_NODE, &domain_passwd_snpauth_cmd); install_element (ISIS_NODE, &no_domain_passwd_cmd); install_element (ISIS_NODE, &lsp_gen_interval_cmd); |