summaryrefslogtreecommitdiffstats
path: root/main/squark/0001-auth-snmp-use-ifIndex-as-ifName-if-that-MIB-entry-is.patch
blob: 1b11d516dc9d084048447fc2975ab88c5ee00af0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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