|
|
@@ -1,8 +1,10 @@
|
|
|
#include <net-snmp/net-snmp-config.h>
|
|
|
#include <net-snmp/net-snmp-includes.h>
|
|
|
-#include "snmp_nms.h"
|
|
|
+#include "netswitch.h"
|
|
|
#include "sys.h"
|
|
|
#include "elog.h"
|
|
|
+#include "thread.h"
|
|
|
+#include "sqlite_handle.h"
|
|
|
|
|
|
#if 0
|
|
|
#define LOGD log_d
|
|
|
@@ -15,24 +17,18 @@
|
|
|
#endif
|
|
|
|
|
|
|
|
|
+#define SW_HOST_IP "192.168.0.1"
|
|
|
#define NETSNMP_DS_APP_DONT_FIX_PDUS 0
|
|
|
|
|
|
-typedef struct {
|
|
|
- int flag;
|
|
|
-}snmp_handle_t;
|
|
|
-static snmp_handle_t snHandle;
|
|
|
|
|
|
-int snmp_nms_init(void)
|
|
|
-{
|
|
|
- snmp_handle_t *sh=&snHandle;
|
|
|
|
|
|
- SOCK_STARTUP;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
+typedef struct {
|
|
|
+ switch_data_t sw;
|
|
|
+}ns_handle_t;
|
|
|
+static ns_handle_t nsHandle;
|
|
|
|
|
|
+////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-//snmp_get("public","192.168.1.133","1.3.6.1.2.1.1.1.0");
|
|
|
static netsnmp_variable_list* snmp_getx(int version, char *community, char *ip, char *oid_str, int msgtype)
|
|
|
{
|
|
|
int count;
|
|
|
@@ -141,8 +137,90 @@ static netsnmp_variable_list* snmp_getbulk(int version, char *community, char *i
|
|
|
|
|
|
|
|
|
|
|
|
-#define SW_HOST_IP "192.168.0.1"
|
|
|
-#define SW_PORT_START 99329
|
|
|
+typedef struct {
|
|
|
+ char chr[2];
|
|
|
+}seg_t;
|
|
|
+typedef struct {
|
|
|
+ int cnt;
|
|
|
+ seg_t seg[20];
|
|
|
+}mac_data_t;
|
|
|
+
|
|
|
+static int parse_mac(char *ss, mac_data_t *mac)
|
|
|
+{
|
|
|
+ char sp=0;
|
|
|
+ int i=0,j=0,idx=0;
|
|
|
+
|
|
|
+ if(strstr(ss, "-")) {
|
|
|
+ sp = '-';
|
|
|
+ }
|
|
|
+ else if(strstr(ss, " ")) {
|
|
|
+ sp = ' ';
|
|
|
+ }
|
|
|
+ else if(strstr(ss, ":")) {
|
|
|
+ sp = ':';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ LOGE("___ wrong mac addr\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(mac, 0, sizeof(mac_data_t));
|
|
|
+ while(ss[i]) {
|
|
|
+ if(ss[i]==sp) {
|
|
|
+ idx++;
|
|
|
+ j=0;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ mac->seg[idx].chr[j++] = (char)toupper(ss[i]);
|
|
|
+ }
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ mac->cnt = idx+1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int get_mac(char *ss, char *mac)
|
|
|
+{
|
|
|
+ int i,j,r;
|
|
|
+ mac_data_t mdat;
|
|
|
+
|
|
|
+ r = parse_mac(ss, &mdat);
|
|
|
+ if(r) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ j = 0;
|
|
|
+ for(i=0; i<mdat.cnt; i++) {
|
|
|
+ if(mdat.seg[i].chr[1]==0) {
|
|
|
+ mac[j++] = '0';
|
|
|
+ mac[j++] = mdat.seg[i].chr[0];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ mac[j++] = mdat.seg[i].chr[0];
|
|
|
+ mac[j++] = mdat.seg[i].chr[1];
|
|
|
+ }
|
|
|
+ if(i!=mdat.cnt-1) {
|
|
|
+ mac[j++] = ':';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mac[j] = 0;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+static port_data_t* get_port(switch_data_t *sw, char *mac)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ port_data_t *pt=NULL;
|
|
|
+
|
|
|
+ for(i=0; i<SW_PORT_MAX; i++) {
|
|
|
+ pt = &sw->port[i];
|
|
|
+ if(strcmp(mac, pt->mac)==0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return pt;
|
|
|
+}
|
|
|
|
|
|
static char *get_string(netsnmp_variable_list *var)
|
|
|
{
|
|
|
@@ -155,7 +233,7 @@ static char *get_string(netsnmp_variable_list *var)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- if (sprint_realloc_value(&buf, &buflen, &outlen, 1, var->name, var->name_length, var)) {
|
|
|
+ if (sprint_realloc_variable(&buf, &buflen, &outlen, 1, var->name, var->name_length, var)) {
|
|
|
return (char*)buf;
|
|
|
} else {
|
|
|
free(buf);
|
|
|
@@ -163,46 +241,52 @@ static char *get_string(netsnmp_variable_list *var)
|
|
|
|
|
|
return NULL;
|
|
|
}
|
|
|
-static void sw_print(char *s, switch_data_t *sw)
|
|
|
+static void sw_init(switch_data_t *sw)
|
|
|
{
|
|
|
int i;
|
|
|
+
|
|
|
+ memset(sw, 0, sizeof(switch_data_t));
|
|
|
+ for(i=0; i<SW_PORT_MAX; i++) {
|
|
|
+ sw->port[i].id = -1;
|
|
|
+ }
|
|
|
+}
|
|
|
+static void sw_sync_mac_by_id(switch_data_t *dst, switch_data_t *src)
|
|
|
+{
|
|
|
+ int i,id;
|
|
|
for(i=0; i<SW_PORT_MAX; i++) {
|
|
|
- port_data_t *pt=&sw->port[i];
|
|
|
- int id=(pt->id>=SW_PORT_START)?(pt->id-SW_PORT_START):pt->id;
|
|
|
-
|
|
|
- if(pt->id>=SW_PORT_START) {
|
|
|
- LOGD("__%s__, port[%d].id: %d\n", s, i, id);
|
|
|
- LOGD("__%s__, port[%d].up: %d\n", s, i, pt->up);
|
|
|
- LOGD("__%s__, port[%d].mac: %s\n", s, i, pt->mac);
|
|
|
- LOGD("__%s__, port[%d].ip4: %s\n", s, i, pt->ip4);
|
|
|
- LOGD("__%s__, port[%d].ip6: %s\n", s, i, pt->ip6);
|
|
|
+ id = src->port[i].id;
|
|
|
+ if(id != -1) {
|
|
|
+ strcpy(dst->port[id].mac, src->port[i].mac);
|
|
|
}
|
|
|
}
|
|
|
- LOGD("\n");
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-int snmp_nms_test(void)
|
|
|
+static void sw_sync_ip_by_mac(switch_data_t *dst, switch_data_t *src)
|
|
|
{
|
|
|
int i,j;
|
|
|
- char *ipAddr="1.3.6.1.2.1.17.4.3.1.0";
|
|
|
- char *phyAddr="1.3.6.1.2.1.4.22.0";
|
|
|
- char *icmp="1.3.6.1.2.1.5";
|
|
|
- char temp[100];
|
|
|
- netsnmp_variable_list *var;
|
|
|
- switch_data_t sw={0};
|
|
|
+ for(i=0; i<SW_PORT_MAX; i++) {
|
|
|
+ for(j=0; j<SW_PORT_MAX; j++) {
|
|
|
+ if(strcmp(dst->port[j].mac, src->port[i].mac)==0) {
|
|
|
+ strcpy(dst->port[j].ip, src->port[i].ip);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- SOCK_STARTUP;
|
|
|
+static void sw_print(char *s, switch_data_t *sw)
|
|
|
+{
|
|
|
+ int i,id;
|
|
|
+ port_data_t *pt=NULL;
|
|
|
|
|
|
-#if 0
|
|
|
for(i=0; i<SW_PORT_MAX; i++) {
|
|
|
- sprintf(temp, "%s.%d", phyAddr, i+99329); //LOGD("getnext: %s\n", temp);
|
|
|
- snmp_get(SNMP_VERSION_1, "public", "192.168.0.1", temp);
|
|
|
+ pt = &sw->port[i];
|
|
|
+ LOGD("__%s__, port[%d].id: %d\n", s, i, pt->id);
|
|
|
+ LOGD("__%s__, port[%d].up: %d\n", s, i, pt->up);
|
|
|
+ LOGD("__%s__, port[%d].ip: %s\n", s, i, pt->ip);
|
|
|
+ LOGD("__%s__, port[%d].mac: %s\n", s, i, pt->mac);
|
|
|
+ LOGD("__%s__, port[%d].desc: %s\n", s, i, pt->desc);
|
|
|
}
|
|
|
-#endif
|
|
|
-
|
|
|
- //snmp_getnext(SNMP_VERSION_2c, "public", "192.168.0.1", ipAddr);
|
|
|
- //snmp_getnext(SNMP_VERSION_2c, "public", "192.168.0.1", phyAddr);
|
|
|
+ LOGD("\n");
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
public
|
|
|
@@ -234,43 +318,50 @@ int snmp_nms_test(void)
|
|
|
1: ifreIndex - INTEGER(2 - integer (32 bit))
|
|
|
6: ifPhysAddress - PhysAddress(4 - octets)
|
|
|
8: ifOperStatus - INTEGER(2 - integer (32 bit))
|
|
|
-*/
|
|
|
+
|
|
|
+ No Such Instance currently exists at this OID:
|
|
|
+ 1. MIB文件没有正确添加到MIB树里面,因此agent在收到查询以后真的找不到目标OID.
|
|
|
|
|
|
- //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.4.22.1");
|
|
|
- //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.4.20.1");
|
|
|
-
|
|
|
- //LOGD("++++++++++++++++\n");
|
|
|
- //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.17.4");
|
|
|
+ 2. MIB文件添加成功了,但是snmpd.conf里面的关于权限的配置不对。agent在收到client的查询以后也找到了该OID,
|
|
|
+ 但是因为没有权限因此返回“No Such Instance currently exists at this OID”。
|
|
|
+ 关于权限粗看会以为很复杂,尤其是在心浮气燥的时候,其实静下心来仔细看看就会发现也就那么回事
|
|
|
+ 3. 第三种情况比较特殊,对于net-snmp不熟的也可能会范理解上的错误。
|
|
|
+ 使用snmpget而忘记了添加OID结尾的实例标识符,net-snmp则会报出“No Such Instance currently exists at this OID”的错误。
|
|
|
+*/
|
|
|
+static int sw_get(switch_data_t *sw)
|
|
|
+{
|
|
|
+ int i,j,find=0;
|
|
|
+ char temp[100];
|
|
|
+ switch_data_t sw2;
|
|
|
+ netsnmp_variable_list *var,*pvar;
|
|
|
|
|
|
//snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.17.4");
|
|
|
|
|
|
char *dot1dTpFdbEntryOid="1.3.6.1.2.1.17.4.3.1";
|
|
|
var = snmp_getbulk(SNMP_VERSION_2c, "public", SW_HOST_IP, dot1dTpFdbEntryOid);
|
|
|
if(var) {
|
|
|
- netsnmp_variable_list *pvar=NULL;
|
|
|
- char *tok_mac="Hex-STRING: ";
|
|
|
- char *tok_id="INTEGER: ";
|
|
|
+ char *tok_mac="Hex-STRING: ", *tok_id="INTEGER: ";
|
|
|
+
|
|
|
+ sw_init(&sw2);
|
|
|
|
|
|
i = j = 0;
|
|
|
for (pvar=var; pvar; pvar=pvar->next_variable) {
|
|
|
char *pstr = get_string(pvar);
|
|
|
if(pstr) {
|
|
|
- LOGD("__1__%s\n", pstr);
|
|
|
+ //LOGD("__1__%s\n", pstr);
|
|
|
|
|
|
- sprintf(temp, "%s.%d", dot1dTpFdbEntryOid, 1);
|
|
|
- if(strstr(pstr, temp)) {
|
|
|
+ if(strstr(pstr, "2.17.4.3.1.1")) { //mac
|
|
|
char *p=strstr(pstr, tok_mac);
|
|
|
if(p) {
|
|
|
- strcpy(sw.port[i].mac, p+strlen(tok_mac));
|
|
|
+ get_mac(p+strlen(tok_mac), sw2.port[i].mac);
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- sprintf(temp, "%s.%d", dot1dTpFdbEntryOid, 2);
|
|
|
- if(strstr(pstr, temp)) {
|
|
|
- char *p=strstr(pstr, tok_mac);
|
|
|
+ if(strstr(pstr, "2.17.4.3.1.2")) { //port
|
|
|
+ char *p=strstr(pstr, tok_id);
|
|
|
if(p) {
|
|
|
- sw.port[j].id = atoi(p+strlen(tok_id));
|
|
|
+ sw2.port[j].id = atoi(p+strlen(tok_id)) - SW_PORT_START;
|
|
|
j++;
|
|
|
}
|
|
|
}
|
|
|
@@ -278,52 +369,135 @@ int snmp_nms_test(void)
|
|
|
}
|
|
|
}
|
|
|
snmp_free_varbind(var);
|
|
|
+
|
|
|
+ if(j>0) {
|
|
|
+ sw_sync_mac_by_id(sw, &sw2);
|
|
|
+ find = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(find==0) {
|
|
|
+ return -1;
|
|
|
}
|
|
|
- sw_print("111", &sw);
|
|
|
|
|
|
char *ipNetToMediaEntryOid="1.3.6.1.2.1.4.22.1";
|
|
|
var = snmp_getbulk(SNMP_VERSION_2c, "public", SW_HOST_IP, ipNetToMediaEntryOid);
|
|
|
if(var) {
|
|
|
- netsnmp_variable_list *pvar=NULL;
|
|
|
+ char *tok_mac="STRING: ", *tok_ip="IpAddress: ";
|
|
|
+
|
|
|
+ sw_init(&sw2);
|
|
|
+
|
|
|
+ i = j = 0;
|
|
|
for (pvar=var; pvar; pvar=pvar->next_variable) {
|
|
|
char *pstr = get_string(pvar);
|
|
|
if(pstr) {
|
|
|
- LOGD("__2__%s\n", pstr);
|
|
|
+ //LOGD("__2__%s\n", pstr);
|
|
|
+
|
|
|
+ if(strstr(pstr, "ipNetToMediaPhysAddress")) { //mac addr
|
|
|
+ char *p=strstr(pstr, tok_mac);
|
|
|
+ if(p) {
|
|
|
+ get_mac(p+strlen(tok_mac), sw->port[i].mac);
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strstr(pstr, "ipNetToMediaNetAddress")) { //ip addr
|
|
|
+ char *p=strstr(pstr, tok_ip);
|
|
|
+ if(p) {
|
|
|
+ strcpy(sw->port[j].ip, p+strlen(tok_ip));
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ }
|
|
|
free(pstr);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
snmp_free_varbind(var);
|
|
|
+
|
|
|
+ if(i>0) {
|
|
|
+ sw_sync_ip_by_mac(sw, &sw2);
|
|
|
+ //sw_print("111", sw);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ char *ifEntry="1.3.6.1.2.1.2.2";
|
|
|
+ var = snmp_getbulk(SNMP_VERSION_2c, "public", SW_HOST_IP, ifEntry);
|
|
|
+ if(var) {
|
|
|
+ for (pvar=var; pvar; pvar=pvar->next_variable) {
|
|
|
+ char *pstr = get_string(pvar);
|
|
|
+ if(pstr) {
|
|
|
+ LOGD("__3__%s\n", pstr);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- /*
|
|
|
- No Such Instance currently exists at this OID:
|
|
|
- 1. MIB文件没有正确添加到MIB树里面,因此agent在收到查询以后真的找不到目标OID.
|
|
|
+ snmp_free_varbind(var);
|
|
|
+ }
|
|
|
|
|
|
- 2. MIB文件添加成功了,但是snmpd.conf里面的关于权限的配置不对。agent在收到client的查询以后也找到了该OID,
|
|
|
- 但是因为没有权限因此返回“No Such Instance currently exists at this OID”。
|
|
|
- 关于权限粗看会以为很复杂,尤其是在心浮气燥的时候,其实静下心来仔细看看就会发现也就那么回事
|
|
|
- 3. 第三种情况比较特殊,对于net-snmp不熟的也可能会范理解上的错误。
|
|
|
- 使用snmpget而忘记了添加OID结尾的实例标识符,net-snmp则会报出“No Such Instance currently exists at this OID”的错误。
|
|
|
- */
|
|
|
|
|
|
|
|
|
|
|
|
- SOCK_CLEANUP;
|
|
|
- exit(0);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+static int sw_cmp(switch_data_t *sw1, switch_data_t *sw2)
|
|
|
+{
|
|
|
+ int i;
|
|
|
|
|
|
+ for(i=0; i<SW_PORT_MAX; i++) {
|
|
|
+ if(sw1->port[i].up != sw2->port[i].up) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int snmp_nms_deinit(void)
|
|
|
+
|
|
|
+static sqlite3* get_db(void)
|
|
|
{
|
|
|
+ return __globalDeviceManage.db;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void* switch_thread(void *arg)
|
|
|
+{
|
|
|
+ int r;
|
|
|
+ thread_handle_t *h=(thread_handle_t*)arg;
|
|
|
+ ns_handle_t *nh=(ns_handle_t*)h->arg;
|
|
|
+ switch_data_t sw_tmp;
|
|
|
+ switch_data_t *sw=&nh->sw;
|
|
|
+ switch_data_t *sw2=&sw_tmp;
|
|
|
+ sqlite3 *db=get_db();;
|
|
|
+
|
|
|
+ dev_switch_init(db, sw);
|
|
|
+ *sw2 = *sw;
|
|
|
+
|
|
|
+ SOCK_STARTUP;
|
|
|
+ //while(h->quit==0) {
|
|
|
+ r = sw_get(sw2);
|
|
|
+ if(r==0 && memcmp(sw, sw2, sizeof(switch_data_t))) {
|
|
|
+ LOGD("____ port plug detected!\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ //}
|
|
|
SOCK_CLEANUP;
|
|
|
+
|
|
|
+ pthread_exit(NULL);
|
|
|
+}
|
|
|
+
|
|
|
+int netswitch_init(void)
|
|
|
+{
|
|
|
+ ns_handle_t *h=&nsHandle;
|
|
|
+
|
|
|
+ thread_start(THREAD_ID_SWITCH, switch_thread, h, 4*MB, 0);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
+int netswitch_deinit(void)
|
|
|
+{
|
|
|
+ thread_stop(THREAD_ID_SWITCH);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
|