diff options
Diffstat (limited to 'main/squark/0001-auth-snmp-use-ifIndex-as-ifName-if-that-MIB-entry-is.patch')
-rw-r--r-- | main/squark/0001-auth-snmp-use-ifIndex-as-ifName-if-that-MIB-entry-is.patch | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/main/squark/0001-auth-snmp-use-ifIndex-as-ifName-if-that-MIB-entry-is.patch b/main/squark/0001-auth-snmp-use-ifIndex-as-ifName-if-that-MIB-entry-is.patch new file mode 100644 index 0000000000..1b11d516dc --- /dev/null +++ b/main/squark/0001-auth-snmp-use-ifIndex-as-ifName-if-that-MIB-entry-is.patch @@ -0,0 +1,129 @@ +From c43e15006ee6f36f74de12928687f16c8338eadf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> +Date: Tue, 26 Feb 2013 09:00:20 +0200 +Subject: [PATCH 1/2] auth-snmp: use ifIndex as ifName if that MIB entry is not + support + +E.g. HP ProCurve 1800 does not seem to support ifName. +--- + src/squark-auth-snmp.c | 56 ++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 43 insertions(+), 13 deletions(-) + +diff --git a/src/squark-auth-snmp.c b/src/squark-auth-snmp.c +index 2ac1a7f..9a35d33 100644 +--- a/src/squark-auth-snmp.c ++++ b/src/squark-auth-snmp.c +@@ -64,6 +64,7 @@ + #define SWITCHF_NO_LLDP_MIB 0x01 + #define SWITCHF_QBRIDGE_MIB_HAS_VLAN_NUMBER 0x02 + #define SWITCHF_BRIDGE_MIB_HAS_VLAN 0x04 ++#define SWITCHF_NO_IF_MIB_IFNAME 0x08 + + /* IANA-AddressFamilyNumbers */ + #define IANA_AFN_OTHER 0 +@@ -291,6 +292,17 @@ struct auth_context { + struct auth_context * next_sleeper; + }; + ++void switchinfo_create_ifname(struct auth_context *auth) ++{ ++ char name[64]; ++ ++ if (auth->info_available & FORMAT_PORT_INDEX) { ++ sprintf(name, "%d", auth->local_port); ++ auth->port_name = strdup(name); ++ auth->info_available |= FORMAT_PORT_NAME; ++ } ++} ++ + static void cache_update_time(void) + { + current_time = time(NULL); +@@ -695,6 +707,13 @@ static void auth_force_reauthentication(struct auth_context *auth) + snmp_free_pdu(pdu); + } + ++static int auth_need_info(struct auth_context *auth, int needed_flags) ++{ ++ if ((auth->info_available & needed_flags) == needed_flags) ++ return 0; ++ return username_format_flags & needed_flags; ++} ++ + static int auth_handle_portinfo_reply(int oper, netsnmp_session *s, int reqid, netsnmp_pdu *resp, void *data) + { + struct auth_context *auth = data; +@@ -704,18 +723,25 @@ static int auth_handle_portinfo_reply(int oper, netsnmp_session *s, int reqid, n + goto done; + + var = resp->variables; +- if (username_format_flags & FORMAT_PORT_NAME) ++ if (auth_need_info(auth, FORMAT_PORT_NAME)) { + auth->port_name = blob_cstr_dup(var_parse_type(&var, ASN_OCTET_STR)); +- if (auth->port_name) +- auth->info_available |= FORMAT_PORT_NAME; +- if (username_format_flags & FORMAT_PORT_DESCR) ++ if (auth->port_name) { ++ auth->info_available |= FORMAT_PORT_NAME; ++ } else { ++ auth->current_switch->flags |= SWITCHF_NO_IF_MIB_IFNAME; ++ switchinfo_create_ifname(auth); ++ } ++ } ++ if (auth_need_info(auth, FORMAT_PORT_DESCR)) { + auth->port_descr = blob_cstr_dup(var_parse_type(&var, ASN_OCTET_STR)); +- if (auth->port_descr) +- auth->info_available |= FORMAT_PORT_DESCR; +- if (username_format_flags & FORMAT_PORT_WEBAUTH) ++ if (auth->port_descr) ++ auth->info_available |= FORMAT_PORT_DESCR; ++ } ++ if (auth_need_info(auth, FORMAT_PORT_WEBAUTH)) { + auth->webauth_name = blob_cstr_dup(var_parse_type(&var, ASN_OCTET_STR)); +- if (auth->webauth_name) +- auth->info_available |= FORMAT_PORT_WEBAUTH; ++ if (auth->webauth_name) ++ auth->info_available |= FORMAT_PORT_WEBAUTH; ++ } + + snprintf(auth->status_msg, sizeof(auth->status_msg)-1, + "required info missing: info_available=%08x", +@@ -737,27 +763,31 @@ static void auth_query_port_info(struct auth_context *auth) + oid query_oids[MAX_OID_LEN]; + blob_t query; + +- if (auth_ok(auth)) { ++ if (si->flags & SWITCHF_NO_IF_MIB_IFNAME) ++ switchinfo_create_ifname(auth); ++ ++ if (auth_ok(auth) || ++ !auth_need_info(auth, FORMAT_PORT_NAME | FORMAT_PORT_DESCR | FORMAT_PORT_WEBAUTH)) { + auth_completed(auth); + return; + } + + pdu = snmp_pdu_create(SNMP_MSG_GET); +- if (username_format_flags & FORMAT_PORT_NAME) { ++ if (auth_need_info(auth, FORMAT_PORT_NAME)) { + query = BLOB_OID(query_oids); + blob_push(&query, BLOB_OID(IF_MIB_ifName)); + blob_push_oid(&query, auth->local_port); + query = blob_pushed(BLOB_OID(query_oids), query); + snmp_add_null_var(pdu, oid_blob(query)); + } +- if (username_format_flags & FORMAT_PORT_DESCR) { ++ if (auth_need_info(auth, FORMAT_PORT_DESCR)) { + query = BLOB_OID(query_oids); + blob_push(&query, BLOB_OID(IF_MIB_ifDescr)); + blob_push_oid(&query, auth->local_port); + query = blob_pushed(BLOB_OID(query_oids), query); + snmp_add_null_var(pdu, oid_blob(query)); + } +- if (username_format_flags & FORMAT_PORT_WEBAUTH) { ++ if (auth_need_info(auth, FORMAT_PORT_WEBAUTH)) { + query = BLOB_OID(query_oids); + blob_push(&query, BLOB_OID(HP_hpicfUsrAuthWebAuthSessionName)); + blob_push_oid(&query, auth->local_port); +-- +1.8.5.1 + |