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
|