From b374395e85a8898d1303d7de0a3743cc3409f7d3 Mon Sep 17 00:00:00 2001 From: zhpeng Date: Mon, 3 Jun 2013 03:18:14 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B31.8=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E3=80=82=20=E9=87=8D=E6=96=B0=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84=E3=80=82=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B31.8=E7=89=88=E6=9C=AC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://172.17.0.253/svn/soft_pkgs/sys_nicmonitor@1398 09c3743a-b0dd-45d3-b506-aa74c7a2a6ef --- code/tags/sys_nicmonitor-1.8/bin/README | 18 + code/tags/sys_nicmonitor-1.8/bin/install.sh | 4 + ...onitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz | Bin 0 -> 19097 bytes .../doc/网卡监视程序动态库使用手册【新】.doc | Bin 0 -> 20480 bytes ...网卡监视程序安装说明以及使用手册【新】.doc | Bin 0 -> 30208 bytes .../sys_nicmonitor-1.8/src}/Pkgfile | 11 +- code/tags/sys_nicmonitor-1.8/src/README1.8 | 65 +++ code/tags/sys_nicmonitor-1.8/src/V1.8 | 0 code/tags/sys_nicmonitor-1.8/src/build.sh | 7 + code/tags/sys_nicmonitor-1.8/src/post_add.sh | 16 + .../sys_nicmonitor-1.8/src}/post_mk.sh | 0 .../src/sys_nicmonitor-1.8.tar.gz | Bin 0 -> 17573 bytes code/tags/sys_nicmonitor-1.8/test/Makefile | 8 + code/tags/sys_nicmonitor-1.8/test/dotconf.h | 264 +++++++++ code/tags/sys_nicmonitor-1.8/test/getmem | Bin 0 -> 14448 bytes code/tags/sys_nicmonitor-1.8/test/getmem.c | 82 +++ code/tags/sys_nicmonitor-1.8/test/mnic.h | 66 +++ .../sys_nicmonitor-1.8/test/nicinfo_shm.h | 18 + code/tags/sys_nicmonitor-1.8/test/read_shm | Bin 0 -> 13313 bytes code/tags/sys_nicmonitor-1.8/test/read_shm.c | 127 +++++ code/tags/sys_nicmonitor-1.8/test/recv_msg | Bin 0 -> 11484 bytes code/tags/sys_nicmonitor-1.8/test/recv_msg.c | 72 +++ .../sys_nicmonitor-1.8/test/sys_netcard.h | 87 +++ code/trunk/README | 39 ++ .../doc/网卡监视程序动态库使用手册【新】.doc | Bin 0 -> 20480 bytes ...网卡监视程序安装说明以及使用手册【新】.doc | Bin 0 -> 30208 bytes code/trunk/post_add.sh | 7 - code/trunk/src/Pkgfile | 20 + code/trunk/src/README1.8 | 65 +++ code/trunk/src/V1.8 | 0 code/trunk/src/build.sh | 7 + code/trunk/src/post_add.sh | 16 + code/trunk/src/post_mk.sh | 10 + code/trunk/src/sys_nicmonitor-1.8.tar.gz | Bin 0 -> 17573 bytes code/trunk/sys_nicmonitor/Makefile | 2 +- code/trunk/sys_nicmonitor/bin/sys_nicmonitor | Bin 0 -> 47677 bytes code/trunk/sys_nicmonitor/mnic.c | 499 ++++++++++++------ code/trunk/sys_nicmonitor/nicinfo_shm.c | 220 +++++++- code/trunk/test/Makefile | 2 +- 39 files changed, 1545 insertions(+), 187 deletions(-) create mode 100644 code/tags/sys_nicmonitor-1.8/bin/README create mode 100755 code/tags/sys_nicmonitor-1.8/bin/install.sh create mode 100644 code/tags/sys_nicmonitor-1.8/bin/sys_nicmonitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz create mode 100644 code/tags/sys_nicmonitor-1.8/doc/网卡监视程序动态库使用手册【新】.doc create mode 100644 code/tags/sys_nicmonitor-1.8/doc/网卡监视程序安装说明以及使用手册【新】.doc rename code/{trunk => tags/sys_nicmonitor-1.8/src}/Pkgfile (63%) create mode 100644 code/tags/sys_nicmonitor-1.8/src/README1.8 create mode 100644 code/tags/sys_nicmonitor-1.8/src/V1.8 create mode 100644 code/tags/sys_nicmonitor-1.8/src/build.sh create mode 100644 code/tags/sys_nicmonitor-1.8/src/post_add.sh rename code/{trunk => tags/sys_nicmonitor-1.8/src}/post_mk.sh (100%) create mode 100644 code/tags/sys_nicmonitor-1.8/src/sys_nicmonitor-1.8.tar.gz create mode 100644 code/tags/sys_nicmonitor-1.8/test/Makefile create mode 100644 code/tags/sys_nicmonitor-1.8/test/dotconf.h create mode 100755 code/tags/sys_nicmonitor-1.8/test/getmem create mode 100644 code/tags/sys_nicmonitor-1.8/test/getmem.c create mode 100644 code/tags/sys_nicmonitor-1.8/test/mnic.h create mode 100644 code/tags/sys_nicmonitor-1.8/test/nicinfo_shm.h create mode 100755 code/tags/sys_nicmonitor-1.8/test/read_shm create mode 100644 code/tags/sys_nicmonitor-1.8/test/read_shm.c create mode 100755 code/tags/sys_nicmonitor-1.8/test/recv_msg create mode 100644 code/tags/sys_nicmonitor-1.8/test/recv_msg.c create mode 100644 code/tags/sys_nicmonitor-1.8/test/sys_netcard.h create mode 100644 code/trunk/README create mode 100644 code/trunk/doc/网卡监视程序动态库使用手册【新】.doc create mode 100644 code/trunk/doc/网卡监视程序安装说明以及使用手册【新】.doc delete mode 100644 code/trunk/post_add.sh create mode 100644 code/trunk/src/Pkgfile create mode 100644 code/trunk/src/README1.8 create mode 100644 code/trunk/src/V1.8 create mode 100644 code/trunk/src/build.sh create mode 100644 code/trunk/src/post_add.sh create mode 100644 code/trunk/src/post_mk.sh create mode 100644 code/trunk/src/sys_nicmonitor-1.8.tar.gz create mode 100755 code/trunk/sys_nicmonitor/bin/sys_nicmonitor diff --git a/code/tags/sys_nicmonitor-1.8/bin/README b/code/tags/sys_nicmonitor-1.8/bin/README new file mode 100644 index 0000000..56665f3 --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/bin/README @@ -0,0 +1,18 @@ +======== +安装说明: +直接运行命令: +sh ./install.sh + +或者采用如下步骤: + + 1)安装,以root的用户执行安装命令: + pkgadd sys_nicmonitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz + 如果之前已经安装,则可先卸载旧的然后再安装,或者通过更新方式安装 + 卸载命令: pkgrm sys_nicmonitor + 更新方式安装命令: + pkgadd -u sys_nicmonitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz + + 2)查看安装是否成功 + pkginfo -i|grep sys_nicmonitor + 或者 + 查看d5000用户的目录下lib/libnic_shm.so和bin/sys_nicmonitor的日期是否 diff --git a/code/tags/sys_nicmonitor-1.8/bin/install.sh b/code/tags/sys_nicmonitor-1.8/bin/install.sh new file mode 100755 index 0000000..7d2c2ac --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/bin/install.sh @@ -0,0 +1,4 @@ +#!/bin/bash +pkgrm sys_nicmonitor +pkgadd sys_nicmonitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz + diff --git a/code/tags/sys_nicmonitor-1.8/bin/sys_nicmonitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz b/code/tags/sys_nicmonitor-1.8/bin/sys_nicmonitor#1.8-x86_64-Linx-Rocky4.2.pkg.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d956807527e85092649a5471c70dea6127c06d84 GIT binary patch literal 19097 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 M-+f`T|Np1|29Ct7CIA2c literal 0 HcmV?d00001 diff --git a/code/tags/sys_nicmonitor-1.8/doc/网卡监视程序安装说明以及使用手册【新】.doc b/code/tags/sys_nicmonitor-1.8/doc/网卡监视程序安装说明以及使用手册【新】.doc new file mode 100644 index 0000000000000000000000000000000000000000..181b6412b15e9adb7689f9cc75031d0931c6e4b7 GIT binary patch literal 30208 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 /* needed for FILE* */ +#endif + +#ifdef WIN32 +# ifndef R_OK +#define R_OK 0 +# endif +#endif + +/* some buffersize definitions */ +#define CFG_BUFSIZE 4096 /* max length of one line */ +#define CFG_MAX_OPTION 32 /* max length of any option name */ +#define CFG_MAX_VALUE 4064 /* max length of any options value */ +#define CFG_MAX_FILENAME 256 /* max length of a filename */ +#define CFG_VALUES 16 /* max # of arguments an option takes */ + +#define CFG_INCLUDEPATH_ENV "DC_INCLUDEPATH" +#define WILDCARDS "*?" /* list of supported wild-card characters */ + +/* constants for type of option */ +#define ARG_TOGGLE 0 /* TOGGLE on,off; yes,no; 1, 0; */ +#define ARG_INT 1 /* callback wants an integer */ +#define ARG_STR 2 /* callback expects a \0 terminated str */ +#define ARG_LIST 3 /* wants list of strings */ +#define ARG_NAME 4 /* wants option name plus ARG_LIST stuff */ +#define ARG_RAW 5 /* wants raw argument data */ +#define ARG_NONE 6 /* does not expect ANY args */ + +#define CTX_ALL 0 /* context: option can be used anywhere */ + +/* for convenience of terminating the dotconf_options list */ +#define LAST_OPTION { "", 0, NULL, NULL } +#define LAST_CONTEXT_OPTION { "", 0, NULL, NULL, 0 } + +#define DOTCONF_CB(__name) const char *__name(command_t *cmd, \ + context_t *ctx) +#define FUNC_ERRORHANDLER(_name) int _name(configfile_t * configfile, \ + int type, long dc_errno, const char *msg) + + +/* some flags that change the runtime behaviour of dotconf */ +#define NONE 0 +#define CASE_INSENSITIVE 1<<0 /* match option names case insensitive */ +#define DONT_SUBSTITUTE 1<<1 /* do not call substitute_env after read_arg */ +#define NO_INLINE_COMMENTS 1<<2 /* do not allow inline comments */ +#define DUPLICATE_OPTION_NAMES 1<<3 /* allow for duplicate option names */ + +/* syslog style errors as suggested by Sander Steffann */ +#ifdef HAVE_SYSLOG +#include + +#define DCLOG_EMERG LOG_EMERG /* system is unusable */ +#define DCLOG_ALERT LOG_ALERT /* action must be taken immediately */ +#define DCLOG_CRIT LOG_CRIT /* critical conditions */ +#define DCLOG_ERR LOG_ERR /* error conditions */ +#define DCLOG_WARNING LOG_WARNING /* warning conditions */ +#define DCLOG_NOTICE LOG_NOTICE /* normal but significant condition */ +#define DCLOG_INFO LOG_INFO /* informational */ +#define DCLOG_DEBUG LOG_DEBUG /* debug-level messages */ + +#define DCLOG_LEVELMASK LOG_PRIMASK /* mask off the level value */ + +#else /* HAVE_SYSLOG */ + +#define DCLOG_EMERG 0 /* system is unusable */ +#define DCLOG_ALERT 1 /* action must be taken immediately */ +#define DCLOG_CRIT 2 /* critical conditions */ +#define DCLOG_ERR 3 /* error conditions */ +#define DCLOG_WARNING 4 /* warning conditions */ +#define DCLOG_NOTICE 5 /* normal but significant condition */ +#define DCLOG_INFO 6 /* informational */ +#define DCLOG_DEBUG 7 /* debug-level messages */ + +#define DCLOG_LEVELMASK 7 /* mask off the level value */ + +#endif /* HAVE_SYSLOG */ + +/* callback types for dotconf_callback */ + +/* error constants */ +#define ERR_NOERROR 0x0000 +#define ERR_PARSE_ERROR 0x0001 +#define ERR_UNKNOWN_OPTION 0x0002 +#define ERR_WRONG_ARG_COUNT 0x0003 +#define ERR_INCLUDE_ERROR 0x0004 +#define ERR_NOACCESS 0x0005 +#define ERR_USER 0x1000 /* base for userdefined errno's */ + +/* i needed this to check an ARG_LIST entry if it's toggled in one of my apps; maybe you do too */ +#define CFG_TOGGLED(_val) ( (_val[0] == 'Y' \ + || _val[0] == 'y') \ + || (_val[0] == '1') \ + || ((_val[0] == 'o' \ + || _val[0] == 'O') \ + && (_val[1] == 'n' \ + || _val[1] == 'N'))) + +enum callback_types +{ + ERROR_HANDLER = 1, + CONTEXT_CHECKER +}; + +typedef enum callback_types callback_types; +typedef struct configfile_t configfile_t; +typedef struct configoption_t configoption_t; +typedef struct configoption_t ConfigOption; +typedef struct command_t command_t; +typedef void context_t; +typedef void info_t; + +typedef const char *(*dotconf_callback_t)(command_t *, context_t *); +typedef int (*dotconf_errorhandler_t)(configfile_t *, int, unsigned long, const char *); +typedef const char *(*dotconf_contextchecker_t)(command_t *, unsigned long); + +struct configfile_t +{ + /* ------ the fields in configfile_t are provided to the app via command_t's ; READ ONLY! --- */ + + FILE *stream; + char eof; /* end of file reached ? */ + size_t size; /* file size; cached on-demand for here-documents */ + + context_t *context; + + configoption_t const **config_options; + int config_option_count; + + /* ------ misc read-only fields ------------------------------------------------------------- */ + char *filename; /* name of file this option was found in */ + unsigned long line; /* line number we're currently at */ + unsigned long flags; /* runtime flags given to dotconf_open */ + + char *includepath; + + /* ------ some callbacks for interactivity -------------------------------------------------- */ + dotconf_errorhandler_t errorhandler; + dotconf_contextchecker_t contextchecker; + + int (*cmp_func)(const char *, const char *, size_t); +}; + +struct configoption_t +{ + const char *name; /* name of configuration option */ + int type; /* for possible values, see above */ + dotconf_callback_t callback; /* callback function */ + info_t *info; /* additional info for multi-option callbacks */ + unsigned long context; /* context sensitivity flags */ +}; + +struct command_t +{ + const char *name; /* name of the command */ + configoption_t *option; /* the option as given in the app; READ ONLY */ + + /* ------ argument data filled in for each line / command ----------------------------------- */ + struct { + long value; /* ARG_INT, ARG_TOGGLE */ + char *str; /* ARG_STR */ + char **list; /* ARG_LIST */ + } data; + int arg_count; /* number of arguments (in data.list) */ + + /* ------ misc context information ---------------------------------------------------------- */ + configfile_t *configfile; + context_t *context; +}; + +/* ------ dotconf_create() - create the configfile_t needed for further dot.conf fun ------------ */ +configfile_t *dotconf_create(char *, const configoption_t *, context_t *, unsigned long); + +/* ------ dotconf_cleanup() - tidy up behind dotconf_create and the parser dust ----------------- */ +void dotconf_cleanup(configfile_t *configfile); + +/* ------ dotconf_command_loop() - iterate through each line of file and handle the commands ---- */ +int dotconf_command_loop(configfile_t *configfile); + +/* ------ dotconf_command_loop_until_error() - like continue_line but return on the first error - */ +const char *dotconf_command_loop_until_error(configfile_t *configfile); + +/* ------ dotconf_continue_line() - check if line continuation is to be handled ----------------- */ +int dotconf_continue_line(char *buffer, size_t length); + +/* ------ dotconf_get_next_line() - read in the next line of the configfile_t ------------------- */ +int dotconf_get_next_line(char *buffer, size_t bufsize, configfile_t *configfile); + +/* ------ dotconf_get_here_document() - read the here document until delimit is found ----------- */ +char *dotconf_get_here_document(configfile_t *configfile, const char *delimit); + +/* ------ dotconf_invoke_command() - call the callback for command_t ---------------------------- */ +const char *dotconf_invoke_command(configfile_t *configfile, command_t *cmd); + +/* ------ dotconf_find_command() - iterate through all registered options trying to match ------- */ +configoption_t *dotconf_find_command(configfile_t *configfile, const char *command); + +/* ------ dotconf_read_arg() - read one argument from the line handling quoting and escaping ---- */ +/* + side effects: the char* returned by dotconf_read_arg is malloc() before, hence that pointer + will have to be free()ed later. +*/ +char *dotconf_read_arg(configfile_t *configfile, signed char **line); + +/* ------ dotconf_handle_command() - parse, substitute, find, invoke the command found in buffer */ +const char *dotconf_handle_command(configfile_t *configfile, char *buffer); + +/* ------ dotconf_register_option() - add a new option table to the list of commands ------------ */ +void dotconf_register_options(configfile_t *configfile, const configoption_t *options); + +/* ------ dotconf_warning() - handle the dispatch of error messages of various levels ----------- */ +int dotconf_warning(configfile_t *configfile, int level, unsigned long errnum, const char *, ...); + +/* ------ dotconf_callback() - register a special callback -------------------------------------- */ +void dotconf_callback(configfile_t *configfile, callback_types type, dotconf_callback_t); + +/* ------ dotconf_substitute_env() - handle the substitution on environment variables ----------- */ +char *dotconf_substitute_env(configfile_t *, char *); + +/* ------ internal utility function that verifies if a character is in the WILDCARDS list -- */ +int dotconf_is_wild_card(char value); + +/* ------ internal utility function that calls the appropriate routine for the wildcard passed in -- */ +int dotconf_handle_wild_card(command_t* cmd, char wild_card, char* path, char* pre, char* ext); + +/* ------ internal utility function that frees allocated memory from dotcont_find_wild_card -- */ +void dotconf_wild_card_cleanup(char* path, char* pre); + +/* ------ internal utility function to check for wild cards in file path -- */ +/* ------ path and pre must be freed by the developer ( dotconf_wild_card_cleanup) -- */ +int dotconf_find_wild_card(char* filename, char* wildcard, char** path, char** pre, char** ext); + +/* ------ internal utility function that compares two stings from back to front -- */ +int dotconf_strcmp_from_back(const char* s1, const char* s2); + +/* ------ internal utility function that determins if a string matches the '?' criteria -- */ +int dotconf_question_mark_match(char* dir_name, char* pre, char* ext); + +/* ------ internal utility function that determins if a string matches the '*' criteria -- */ +int dotconf_star_match(char* dir_name, char* pre, char* ext); + +/* ------ internal utility function that determins matches for filenames with -- */ +/* ------ a '?' in name and calls the Internal Include function on that filename -- */ +int dotconf_handle_question_mark(command_t* cmd, char* path, char* pre, char* ext); + +/* ------ internal utility function that determins matches for filenames with -- */ +/* ------ a '*' in name and calls the Internal Include function on that filename -- */ +int dotconf_handle_star(command_t* cmd, char* path, char* pre, char* ext); + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* DOTCONF_H */ diff --git a/code/tags/sys_nicmonitor-1.8/test/getmem b/code/tags/sys_nicmonitor-1.8/test/getmem new file mode 100755 index 0000000000000000000000000000000000000000..af039a9086dad408a287f644929a02601000b35c GIT binary patch literal 14448 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 hQ;wBBidpzUPB`rNGDd$^Q|_#ur{{@3PbGQHi literal 0 HcmV?d00001 diff --git a/code/tags/sys_nicmonitor-1.8/test/getmem.c b/code/tags/sys_nicmonitor-1.8/test/getmem.c new file mode 100644 index 0000000..e9c31b3 --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/test/getmem.c @@ -0,0 +1,82 @@ +#include +#include +#include + +#include "nicinfo_shm.h" + +typedef struct net_info{ + NETCARD_INFO info[MAXNICNUM]; +}SHM; + +int main(int argc, char **argv) +{ + int ret; + NETCARD_INFO net; +#if 0 + char shm_path[1024]; + char sem_path[1024]; + + memset(shm_path, 0, sizeof(shm_path)); + memset(sem_path, 0, sizeof(sem_path)); + + strcpy(shm_path, getenv("D5000_HOME")); + strcat(shm_path, "/conf/nic/shm_sys_netcard_info"); + strcpy(sem_path, getenv("D5000_HOME")); + strcat(sem_path, "/conf/nic/sem_sys_netcard_info"); + if((ret = init_nic_info(shm_path, sem_path)) == -1){ + fprintf(stderr, "shm or sem path error!\n"); + return -1; + } +#endif + memset(&net, 0, sizeof(NETCARD_INFO)); + if(argc != 2){ + fprintf(stderr, "Usage:%s netcard\n", argv[0]); + return -1; + } + while((ret = get_nic_info(argv[1], &net)) != -1){ + fprintf(stdout, "==========================网卡信息==============================\n"); + fprintf(stdout,"DEVICE NAME : %s\nIPADDR : %d.%d.%d.%d\nBROADCAST : %d.%d.%d.%d\nNETMASK : %d.%d.%d.%d\nHWADDR : %02x:%02x:%02x:%02x:%02x:%02x\nFLAGS = %d\nMTU = %d\nTx_queue_len = %d\nTime_stamp = %d\n\nReceive bytes:%llu\nReceive packets:%llu\nReceive errors:%lu\nReceive dropped:%lu\nReceive multicast:%lu\nReceive fifo:%lu\n\nTransmit bytes:%llu\nTransmit packets:%llu\nTransmit errors:%lu\nTransmit dropped:%lu\nTransmit fifo:%lu\nTransmit collisions:%lu\nTransmit carrier:%lu\n\nAverage flow:%d\n", + net.charname, + (unsigned char)net.addr.sa_data[2], + (unsigned char)net.addr.sa_data[3], + (unsigned char)net.addr.sa_data[4], + (unsigned char)net.addr.sa_data[5], + (unsigned char)net.broadaddr.sa_data[2], + (unsigned char)net.broadaddr.sa_data[3], + (unsigned char)net.broadaddr.sa_data[4], + (unsigned char)net.broadaddr.sa_data[5], + (unsigned char)net.netmask.sa_data[2], + (unsigned char)net.netmask.sa_data[3], + (unsigned char)net.netmask.sa_data[4], + (unsigned char)net.netmask.sa_data[5], + (unsigned char)net.hwaddr.sa_data[0], + (unsigned char)net.hwaddr.sa_data[1], + (unsigned char)net.hwaddr.sa_data[2], + (unsigned char)net.hwaddr.sa_data[3], + (unsigned char)net.hwaddr.sa_data[4], + (unsigned char)net.hwaddr.sa_data[5], + net.flags, + net.mtu, + net.tx_queue_len, + net.time_stamp, + net.rx_bytes, + net.rx_packets, + net.rx_errors, + net.rx_dropped, + net.rx_multicast, + net.rx_fifo_errors, + net.tx_bytes, + net.tx_packets, + net.tx_errors, + net.tx_dropped, + net.tx_fifo_errors, + net.collisions, + net.tx_carrier_errors, + net.average_flow); + getchar(); + } + fprintf(stderr, "No information of %s !\n", argv[1]); + +// rls_nic_info(); + return 0; +} diff --git a/code/tags/sys_nicmonitor-1.8/test/mnic.h b/code/tags/sys_nicmonitor-1.8/test/mnic.h new file mode 100644 index 0000000..d6255d5 --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/test/mnic.h @@ -0,0 +1,66 @@ +#ifndef __MNIC_H +#define __MNIC_H + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sys_netcard.h" +#include "dotconf.h" + +#define IPSIZE 16 +#define PATH_SIZE 256 + +DOTCONF_CB(cb_str); +DOTCONF_CB(cb_int); + +typedef struct __config_file_st{ + unsigned char domain; + short serv; + short event; + int udpport; + char sys_netcard_shm_path[PATH_SIZE]; + char sys_netcard_sem_path[PATH_SIZE]; + int monitor_interval; + int write_interval; + int flow_interval; + int flow_limit; + int flow_peak; + char udp[NIC_NAME_LEN]; + char nic[MAXNICNUM][NIC_NAME_LEN]; + char ip[IPSIZE] ; +}CONFIG_FILE_ST; + + +char *get_name(char *, char *); +int if_fetch(NETCARD_INFO *); +int ioc_get_name(NETCARD_INFO *); +int get_dev_fields(char *p, NETCARD_INFO *); +void send_alarm(D5000_NIC_ALARM *, int , char *, char *); +void record_log(void); + +#endif diff --git a/code/tags/sys_nicmonitor-1.8/test/nicinfo_shm.h b/code/tags/sys_nicmonitor-1.8/test/nicinfo_shm.h new file mode 100644 index 0000000..14c1aec --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/test/nicinfo_shm.h @@ -0,0 +1,18 @@ +#ifndef NIC_SHM_H +#define NIC_SHM_H + +#include "sys_netcard.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int init_nic_info(char *share_path, char *sem_path); +int get_nic_info(char *nic_name, NETCARD_INFO *net_info); +void rls_nic_info(void); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/code/tags/sys_nicmonitor-1.8/test/read_shm b/code/tags/sys_nicmonitor-1.8/test/read_shm new file mode 100755 index 0000000000000000000000000000000000000000..f7702fd697b9a8600363482407950c46c5d40222 GIT binary patch literal 13313 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 literal 0 HcmV?d00001 diff --git a/code/tags/sys_nicmonitor-1.8/test/read_shm.c b/code/tags/sys_nicmonitor-1.8/test/read_shm.c new file mode 100644 index 0000000..d2aec3b --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/test/read_shm.c @@ -0,0 +1,127 @@ +#include "mnic.h" + +typedef struct net_info{ + NETCARD_INFO info[MAXNICNUM]; +}SHM; + +void get_sem(int semid) +{ + struct sembuf lock; + + lock.sem_num = 0; + lock.sem_op = -1; + lock.sem_flg = SEM_UNDO; + + while(semop(semid, &lock, 1)){ + if (errno == EINTR) { + continue; + } + perror("semop()"); + } +} + +void release_sem(int semid) +{ + int ret; + struct sembuf unlock; + + unlock.sem_num = 0; + unlock.sem_op = 1; + unlock.sem_flg = SEM_UNDO; + + if((ret = semop(semid, &unlock, 1)) == -1){ + perror("semop()"); + } +} + + +int main(void) +{ + int fd = -1; + int i; + int semid; + key_t key; + SHM *p; + struct timespec s_time, os_time; + char shm_path[1024]; + char sem_path[1024]; + + memset(shm_path, 0, sizeof(shm_path)); + memset(sem_path, 0, sizeof(sem_path)); + + strcpy(shm_path, "/tmp/sys_netcard_shm_path"); + strcpy(sem_path, "/tmp/sys_netcard_sem_path"); + + s_time.tv_sec = 1; + s_time.tv_nsec = 0; + + if ((key=ftok(sem_path, SEM_PROJ_ID)) == -1) { + perror("ftok()"); + exit(1); + } + if((semid = semget(key, 1, IPC_CREAT)) == -1){ + fprintf(stderr, "Create semaphore error\n"); + exit(1); + } + + if((fd = open(shm_path, O_RDWR)) == -1){ + fprintf(stderr, "open():%s\n", strerror(errno)); + return -1; + } + p = mmap(NULL, sizeof(SHM), PROT_READ, MAP_SHARED, fd, 0); + if(p == MAP_FAILED){ + perror("mmap"); + return -1; + } + perror("mmap"); + while(1){ + get_sem(semid); + for(i = 0; p->info[i].charname[0] != 0; i++){ + fprintf(stdout, "==========================网卡信息 [%d]==============================\n", (i + 1)); + fprintf(stdout,"KEYID = %ld\nBONDING:%s\nDEVICE NAME : %s\nIPADDR : %d.%d.%d.%d\nBROADCAST : %d.%d.%d.%d\nNETMASK : %d.%d.%d.%d\nHWADDR : %02x:%02x:%02x:%02x:%02x:%02x\nFLAGS = %d\nMTU = %d\nTx_queue_len = %d\nTime_stamp = %d\n\nReceive bytes:%llu\nReceive packets:%llu\nReceive errors:%lu\nReceive dropped:%lu\nReceive multicast:%lu\nReceive fifo:%lu\n\nTransmit bytes:%llu\nTransmit packets:%llu\nTransmit errors:%lu\nTransmit dropped:%lu\nTransmit fifo:%lu\nTransmit collisions:%lu\nTransmit carrier:%lu\nAverage flow : %lld\n", + p->info[i].ID, + p->info[i].descr, + p->info[i].charname, + (unsigned char)p->info[i].addr.sa_data[2], + (unsigned char)p->info[i].addr.sa_data[3], + (unsigned char)p->info[i].addr.sa_data[4], + (unsigned char)p->info[i].addr.sa_data[5], + (unsigned char)p->info[i].broadaddr.sa_data[2], + (unsigned char)p->info[i].broadaddr.sa_data[3], + (unsigned char)p->info[i].broadaddr.sa_data[4], + (unsigned char)p->info[i].broadaddr.sa_data[5], + (unsigned char)p->info[i].netmask.sa_data[2], + (unsigned char)p->info[i].netmask.sa_data[3], + (unsigned char)p->info[i].netmask.sa_data[4], + (unsigned char)p->info[i].netmask.sa_data[5], + (unsigned char)p->info[i].hwaddr.sa_data[0], + (unsigned char)p->info[i].hwaddr.sa_data[1], + (unsigned char)p->info[i].hwaddr.sa_data[2], + (unsigned char)p->info[i].hwaddr.sa_data[3], + (unsigned char)p->info[i].hwaddr.sa_data[4], + (unsigned char)p->info[i].hwaddr.sa_data[5], + p->info[i].flags, + p->info[i].mtu, + p->info[i].tx_queue_len, + p->info[i].time_stamp, + p->info[i].rx_bytes, + p->info[i].rx_packets, + p->info[i].rx_errors, + p->info[i].rx_dropped, + p->info[i].rx_multicast, + p->info[i].rx_fifo_errors, + p->info[i].tx_bytes, + p->info[i].tx_packets, + p->info[i].tx_errors, + p->info[i].tx_dropped, + p->info[i].tx_fifo_errors, + p->info[i].collisions, + p->info[i].tx_carrier_errors, + p->info[i].average_flow); + } + nanosleep(&s_time, &os_time); + release_sem(semid); + } + close(fd); + return 0; +} diff --git a/code/tags/sys_nicmonitor-1.8/test/recv_msg b/code/tags/sys_nicmonitor-1.8/test/recv_msg new file mode 100755 index 0000000000000000000000000000000000000000..1814051dee82b35e4d779ab7d84fefe5661dad2b GIT binary patch literal 11484 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 literal 0 HcmV?d00001 diff --git a/code/tags/sys_nicmonitor-1.8/test/recv_msg.c b/code/tags/sys_nicmonitor-1.8/test/recv_msg.c new file mode 100644 index 0000000..a9326bf --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/test/recv_msg.c @@ -0,0 +1,72 @@ +#include "mnic.h" +#define IP4STRSIZE 16 + +int +main(int argc, char **argv) +{ + int ret, value; + int sock_sd, sock_port = 15000; + D5000_NIC_ALARM mesg; + struct sockaddr_in myend, hisend; + socklen_t hisend_len; + fd_set rset; + char ip4str[IP4STRSIZE]; + + if(argc > 1){ + sock_port = atoi(argv[1]); + if(sock_port <= 1024 || sock_port > 65535){ + fprintf(stderr, "Invalid socket port!\n"); + exit(1); + } + } + + sock_sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock_sd==-1) { + perror("socket()"); + exit(1); + } + + value=1; + ret = setsockopt(sock_sd, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value)); + if (ret==-1) { + perror("setsockopt()"); + exit(1); + } + + myend.sin_family = AF_INET; + myend.sin_port = htons(sock_port); + inet_pton(AF_INET, "0.0.0.0", &myend.sin_addr); + + ret = bind(sock_sd, (struct sockaddr*)&myend, sizeof(myend)); + if (ret==-1) { + perror("bind()"); + exit(1); + } + + hisend_len = sizeof(hisend); + while (1) { + FD_ZERO(&rset); + FD_SET(sock_sd, &rset); + ret = select(sock_sd+1, &rset, NULL, NULL, NULL); + if (ret==-1) { + perror("select()"); + continue; + } + ret = recvfrom(sock_sd, &mesg, sizeof(mesg), 0, (struct sockaddr*)&hisend, &hisend_len); + inet_ntop(AF_INET, &hisend.sin_addr, ip4str, IP4STRSIZE); + fprintf(stdout, "===========Recieved from %s============\n", ip4str); + fprintf(stdout, "message length : %d\nsend sequence : %d\nservices ID : %d\nenevt ID : %d\ndomain ID : %d\n", mesg.tMsgFrame.len, mesg.tMsgFrame.seqno, mesg.tMsgFrame.serv, mesg.tMsgFrame.event, mesg.tMsgFrame.domain); + if(mesg.tSysNetcardAlarm.flags == NETCARD_ALARM_SWITCH) + fprintf(stdout, "切换网卡名: %s\n", mesg.tSysNetcardAlarm.switch_devname); + else if(mesg.tSysNetcardAlarm.flags == NETCARD_ALARM_RESUME) + fprintf(stdout, "恢复网卡名: %s\n", mesg.tSysNetcardAlarm.fault_devname); + else + fprintf(stdout, "故障网卡名: %s\n", mesg.tSysNetcardAlarm.fault_devname); + fprintf(stdout, "状态标记: %d\n", mesg.tSysNetcardAlarm.flags); + fprintf(stdout, "重发次数: %d\n", mesg.tSysNetcardAlarm.retrytimes); + } + close(sock_sd); + + exit(0); +} + diff --git a/code/tags/sys_nicmonitor-1.8/test/sys_netcard.h b/code/tags/sys_nicmonitor-1.8/test/sys_netcard.h new file mode 100644 index 0000000..9d97950 --- /dev/null +++ b/code/tags/sys_nicmonitor-1.8/test/sys_netcard.h @@ -0,0 +1,87 @@ +#ifndef _SYS_NETCARD_H +#define _SYS_NETCARD_H + +#include + +#ifndef NIC_NAME_LEN +#define NIC_NAME_LEN 64 +#endif + +#define SEM_PROJ_ID 's' +#define MAXNICNUM 32 + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef long KEYID; + +typedef struct _msg_frame // message frame +{ + short len; // message length + short seqno; // send sequence + short serv; // services ID + short event; // event ID + unsigned char domain; // domain ID + unsigned char ctxt; // Context ID + short stid; // SOURCE task id + short dtid; // DESTINATION task ID + unsigned char ver_coding; // 版本号 + 编码 + unsigned char mes_type; // 帧类型 +}MSG_FRAME, *LPMSG_FRAME; + +typedef struct _net_info +{ + KEYID ID; + char charname[NIC_NAME_LEN]; + char descr[128]; + struct sockaddr addr; + struct sockaddr broadaddr; + struct sockaddr netmask; + struct sockaddr hwaddr; + int time_stamp; + short flags; + int mtu; + int tx_queue_len; + int average_flow; + unsigned long long rx_packets; + unsigned long long tx_packets; + unsigned long long rx_bytes; + unsigned long long tx_bytes; + unsigned long rx_errors; + unsigned long tx_errors; + unsigned long rx_dropped; + unsigned long tx_dropped; + unsigned long rx_multicast; + unsigned long collisions; + unsigned long rx_fifo_errors; + unsigned long tx_carrier_errors; + unsigned long tx_fifo_errors; +}NETCARD_INFO, *LPNETCARD_INFO; + +#define NETCARD_ALARM_FAULT 1 +#define NETCARD_ALARM_RESUME 2 +#define NETCARD_ALARM_SWITCH 3 +#define NETCARD_ALARM_ABNORMAL 4 +typedef struct _sys_netcard_alarm +{ + char fault_devname[NIC_NAME_LEN]; /*故障设备名称 */ + char switch_devname[NIC_NAME_LEN]; /*切换设备名称 */ + short flags; /* 状态标记 : 1:网卡故障。2:网卡恢复。3:网卡切换。4:流量异常。*/ + short retrytimes; //0,1,2 重发次数 +}SYS_NETCARD_ALARM, *LPSYS_NETCARD_ALARM; + + +typedef struct _d5000_nic_alarm +{ + MSG_FRAME tMsgFrame ; + SYS_NETCARD_ALARM tSysNetcardAlarm ; +}D5000_NIC_ALARM, *LPD5000_NIC_ALARM; + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/code/trunk/README b/code/trunk/README new file mode 100644 index 0000000..e3e33e3 --- /dev/null +++ b/code/trunk/README @@ -0,0 +1,39 @@ +--V1.8 -- + 2013-05-27 +对系统高磁盘IO情况下,应用如果进行IO将可能会被阻塞。本版本为此作出调整。 +cs-fes1上编译测试OK。 + +1) 去掉shm和sem的实体文件 +#define SHM_PATH "$D5000_HOME/share/sys_netcard_shm_path" +#define SEM_PATH "$D5000_HOME/share/sys_netcard_sem_path" + +用key=0x1d5200 代替 sem +用key=0x1d5010 代替 shm + + +2)去掉动态库中get_nic_info接口中,判断路径的opendir调用,采用实际路径 + 上层应用每秒可能调用3次这个接口,每判断一个网卡都调用一次,判断都个网卡的状态时就调用多次。 + + 可改进:一次调用get_nic_info接口,可输入多个网卡,一次返回所有网卡状态信息。 + +3) record_log函数为日志函数,每次写一次,都重新打开一次文件。 + 修改为线程模式,当记录日志时,不会被磁盘IO阻塞。 + +---- + + +V1.6与V1.7差异 +共享内存路径修改: +由/home/d5000/someone/tmp/sys_netcard_shm_path 改为 /home/d5000/someone/share/sys_netcard_shm_path +信号量路径修改: +由/home/d5000/someone/tmp/sys_netcard_sem_path 改为 /home/d5000/someone/share/sys_netcard_sem_path + +注意:在编译过程中,需要动态看libman.so,它存放在目录 tags/下面 ,在进行编译的时候需要将其拷贝到 +/lib64/目录下,编译的基础环境是 Rocky 4.2 系统。 + +pkgmk命令的使用: +将源代码打包成name-version.tar.gz样式,编写Pkgfile文件。 +使用命令: + pkgmk -um #更新软件包的md5值 + pkgmk -kw #制作pkg安装包 + diff --git a/code/trunk/doc/网卡监视程序动态库使用手册【新】.doc b/code/trunk/doc/网卡监视程序动态库使用手册【新】.doc new file mode 100644 index 0000000000000000000000000000000000000000..2faa0686fc329b2d0521b34cd6bd5b5c088e16f6 GIT binary patch literal 20480 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 M-+f`T|Np1|29Ct7CIA2c literal 0 HcmV?d00001 diff --git a/code/trunk/doc/网卡监视程序安装说明以及使用手册【新】.doc b/code/trunk/doc/网卡监视程序安装说明以及使用手册【新】.doc new file mode 100644 index 0000000000000000000000000000000000000000..181b6412b15e9adb7689f9cc75031d0931c6e4b7 GIT binary patch literal 30208 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 W #include +#include +#include +#include #include "proc_inv.h" #define THRNR 10 @@ -10,14 +13,14 @@ #define HOST_NAME_SIZE 40 #define BOND_PATH "/proc/net/bonding/*" #define LOG_PATH "/var/log/netcard/" -#define SHM_PATH "/tmp/sys_netcard_shm_path" -#define SEM_PATH "/tmp/sys_netcard_sem_path" +#define SHM_PATH "/share/sys_netcard_shm_path" +#define SEM_PATH "/share/sys_netcard_sem_path" #define MAX_GW 32 #define DEV_MAXLEN 32 #define IPLEN 16 #define CONF_FILE "/conf/nic/sys_netcard_conf.txt" -#define MNIC_VERSION "1.6" +#define MNIC_VERSION "1.8" #define NIC_UNKNOWN 0 #define NIC_DOWN 1 @@ -33,16 +36,16 @@ typedef struct __nic_dev{ }NIC_DEV; typedef struct __config_file_st{ - unsigned char domain; - short serv; - short event; - int udpport; - int monitor_interval; - int write_interval; - int flow_interval; - int flow_limit; - int flow_peak; - char udp[NIC_NAME_LEN]; + unsigned char domain; + short serv; + short event; + int udpport; + int monitor_interval; + int write_interval; + int flow_interval; + int flow_limit; + int flow_peak; + char udp[NIC_NAME_LEN]; NIC_DEV nic[MAXNICNUM]; //被监视网卡的列表 char ip[IPSIZE]; int pingnum; //OPTIONAL!! How many times for once ping check? Default is 2. @@ -112,49 +115,78 @@ int nicnum = 0; CONFIG_FILE_ST conf; char myconf[][64] = { - "domain", // 0 - "serv", // 1 - "event", // 2 - "udpport", // 3 - "sys_netcard_shm_path", // 4 - "sys_netcard_sem_path", // 5 - "monitor_interval", // 6 - "write_interval", // 7 - "flow_interval", // 8 - "flow_limit", // 9 - "flow_peak", // 10 - "udp", // 11 - "nic", // 12 - "ping", // 13 + "domain", // 0 + "serv", // 1 + "event", // 2 + "udpport", // 3 + "sys_netcard_shm_path", // 4 + "sys_netcard_sem_path", // 5 + "monitor_interval", // 6 + "write_interval", // 7 + "flow_interval", // 8 + "flow_limit", // 9 + "flow_peak", // 10 + "udp", // 11 + "nic", // 12 + "ping", // 13 "pingnum", // 14 "pinglap", // 15 - "" + "" }; static const configoption_t options[] = { - {myconf[0], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[1], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[2], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[3], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[4], ARG_STR, cb_str, NULL, CTX_ALL}, - {myconf[5], ARG_STR, cb_str, NULL, CTX_ALL}, - {myconf[6], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[7], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[8], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[9], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[10], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[11], ARG_STR, cb_str, NULL, CTX_ALL}, - {myconf[12], ARG_STR, cb_str, NULL, CTX_ALL}, - {myconf[13], ARG_STR, cb_str, NULL, CTX_ALL}, - {myconf[14], ARG_INT, cb_int, NULL, CTX_ALL}, - {myconf[15], ARG_INT, cb_int, NULL, CTX_ALL}, - LAST_OPTION + {myconf[0], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[1], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[2], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[3], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[4], ARG_STR, cb_str, NULL, CTX_ALL}, + {myconf[5], ARG_STR, cb_str, NULL, CTX_ALL}, + {myconf[6], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[7], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[8], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[9], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[10], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[11], ARG_STR, cb_str, NULL, CTX_ALL}, + {myconf[12], ARG_STR, cb_str, NULL, CTX_ALL}, + {myconf[13], ARG_STR, cb_str, NULL, CTX_ALL}, + {myconf[14], ARG_INT, cb_int, NULL, CTX_ALL}, + {myconf[15], ARG_INT, cb_int, NULL, CTX_ALL}, + LAST_OPTION }; /****dotconf****/ +void create_dir(char *create_path); + +static pthread_mutex_t lock_record_log = PTHREAD_MUTEX_INITIALIZER; +#define LOG_LOCK pthread_mutex_lock(&lock_record_log) +#define LOG_UNLOCK pthread_mutex_unlock(&lock_record_log) +//static int is_checkdir = 0; +static void *record_log_thread( void *arg ) +{ + char *log_str = (char *)arg; + FILE *log_fp = NULL; + + LOG_LOCK; +// if( !is_checkdir ) { + create_dir( log_path ); +// is_checkdir = 1; +// } + if((log_fp = fopen(log_path, "a")) != NULL){ + if(fwrite(log_str, 1, strlen(log_str), log_fp) < 1){ + } + fclose(log_fp); + } + + LOG_UNLOCK; + free(log_str); + + return NULL; +} + /* write error in logfile */ void record_log(char *str) { +#if 0 time_t tamp; char str_tm[4]; char log_str[512]; @@ -181,21 +213,62 @@ void record_log(char *str) if(fwrite(log_str, 1, strlen(log_str), log_fp) < 1){ } fclose(log_fp); - } + } +#else + time_t tamp; + char str_tm[4]; + char log_str[512]; +// FILE *log_fp = NULL; + struct tm tmptr; + struct timeval tv; + struct timezone tz; + +// if((log_fp = fopen(log_path, "a")) != NULL){ + tamp = time(NULL); + memset(str_tm, 0, sizeof(str_tm)); + memset(log_str, 0, sizeof(log_str)); + localtime_r(&tamp, &tmptr); + gettimeofday(&tv, &tz); + snprintf(str_tm, sizeof(str_tm), "%d", (int)tv.tv_usec/1000); + if(str_tm[1] == '\0')str_tm[1] = '0'; + if(str_tm[2] == '\0')str_tm[2] = '0'; + strftime(log_str, sizeof(log_str), "%F %T.", &tmptr); + strcat(log_str, str_tm); + strcat(log_str, " "); + strcat(log_str, process_name); + strcat(log_str, " "); + strcat(log_str, str); +// if(fwrite(log_str, 1, strlen(log_str), log_fp) < 1){ +// } +// fclose(log_fp); + +// } + +{ + pthread_t pid; + char *keepstr = strdup( log_str ); + pthread_create( &pid, NULL, record_log_thread, (void *)keepstr); +} +#endif } static void init_sem(int *semid, CONFIG_FILE_ST *ptr) { key_t key; char error_str[200]; - -/* write error in logfile */ + + /* write error in logfile */ memset(error_str, 0, sizeof(error_str)); +#if 0 if ((key = ftok(sem_path, SEM_PROJ_ID)) == -1) { snprintf(error_str, sizeof(error_str), "EMERG: ftok():%s\n", strerror(errno)); record_log(error_str); return; } +#else + key = 0x1d5200; +#endif + if((*semid = semget(key, 1, IPC_CREAT|0666)) == -1){ snprintf(error_str, sizeof(error_str), "EMERG: semget():%s\n", strerror(errno)); record_log(error_str); @@ -209,8 +282,12 @@ static void init_sem(int *semid, CONFIG_FILE_ST *ptr) } } +static int global_share_id = -1; +static void *global_shmptr = NULL; + static void init_shm(SHM **ptr, CONFIG_FILE_ST *p) { +#ifdef USE_OLD_MMSHARE int fd = -1; char error_str[200]; @@ -221,15 +298,66 @@ static void init_shm(SHM **ptr, CONFIG_FILE_ST *p) return; } umask(mask_tmp); - lseek(fd, sizeof(SHM), SEEK_SET); - write(fd, "\0", 1); - *ptr = (SHM *)mmap(NULL, sizeof(SHM), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + lseek(fd, sizeof(SHM), SEEK_SET); + write(fd, "\0", 1); + *ptr = (SHM *)mmap(NULL, sizeof(SHM), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if(*ptr == MAP_FAILED){ snprintf(error_str, sizeof(error_str), "EMERG: mmap():%s\n", strerror(errno)); record_log(error_str); - return; - } - close(fd); + return; + } + close(fd); +#else + void* shmptr = NULL; + int size = 0; + key_t share_key; +// char *ref_count = NULL; + char *flag_str = NULL; + char *path = shm_path; + char error_str[200]; + + size = sizeof(SHM); + size = size + 16; + +// share_key = ftok(path, 0x000d5000); + share_key = 0x1d5010; + +#if 0 + snprintf( error_str, sizeof( error_str ), + "MSG: sys_nic, shm, size:%d, key:0x%x(%d)\n", size, share_key, share_key); + record_log(error_str); +#endif + + global_share_id = shmget( share_key, size, IPC_CREAT|0666 ); + if( global_share_id == -1 ) { + snprintf( error_str, sizeof( error_str ), + "EMERG: fail shmget, %s, 0x%x\n", strerror(errno), share_key); + record_log(error_str); + return; + } + + shmptr = shmat( global_share_id, NULL, 0 ); + if( shmptr == (void *)-1 ) { + snprintf( error_str, sizeof( error_str ), + "EMERG: fail shmat, %s, %s\n", strerror(errno), path); + record_log(error_str); + return; + } + + flag_str = (char *)shmptr+size-16; + +// if( strcmp( flag_str, "D5001" ) != 0 ) { + //first, do init. + memset( shmptr, 0, size ); +// strcpy( flag_str, "D5001" ); +// } + + global_shmptr = shmptr; + +// ref_count = (char *)shmptr+size-1; +// (*ref_count)++; + *ptr = (SHM *)shmptr; +#endif } @@ -245,7 +373,7 @@ static void get_sem(int semid) lock[1].sem_num = 0; lock[1].sem_op = 1; lock[1].sem_flg = SEM_UNDO; - + while(semop(semid, lock, 2)){ if(errno == EINTR)continue; snprintf(error_str, sizeof(error_str), "EMERG: get_sem semop():%s\n", strerror(errno)); @@ -448,13 +576,13 @@ static void *send_inc_info(void *p) return NULL; } s_time.tv_sec = ptr->conf->write_interval; - s_time.tv_nsec = 0; - + s_time.tv_nsec = 0; + /* copy all net_info*/ while(1){ i = 0; get_sem(ptr->semid); - memset(ptr->shm_ptr, 0, sizeof(SHM)); + //memset(ptr->shm_ptr, 0, sizeof(SHM)); curr = ptr->listp->next; while(curr != NULL){ get_inc_info(&curr->info); @@ -489,7 +617,7 @@ static int get_netcard_count(char *name) strncat(path, name, strlen(name)); if((fp = fopen(path, "r")) == NULL)return 1; - + memset(buf, 0, sizeof(buf)); fseek(fp, 65, SEEK_SET); while((retp = fgets(buf, sizeof(buf), fp)) != NULL){ @@ -521,10 +649,10 @@ static void *cacu_flow(void *p) snprintf(error_str, sizeof(error_str), "EMERG: Empty Netcard list!\n"); record_log(error_str); pthread_mutex_unlock(&mut); - return NULL; - } - s_time.tv_sec = ptr->mem.conf->flow_interval; - s_time.tv_nsec = 0; + return NULL; + } + s_time.tv_sec = ptr->mem.conf->flow_interval; + s_time.tv_nsec = 0; for(i = 0; i < MAXNICNUM ; i++){ count_ok[i] = 0; @@ -533,9 +661,9 @@ static void *cacu_flow(void *p) while(1){ i = 0; curr = ptr->mem.listp->next; - while(curr != NULL){ - get_inc_info(&curr->info); - get_inc_stats(&curr->info); + while(curr != NULL){ + get_inc_info(&curr->info); + get_inc_stats(&curr->info); if(flags){ bytes[i] = curr->info.rx_bytes + curr->info.tx_bytes; } @@ -622,8 +750,8 @@ static char *parse_str(char **s) int ping_gw(char *devname) { - FILE *fp; - int i, ret = -1, j, k; + FILE *fp; + int i, j, k; char buf[128]; char getbuf[64]; @@ -636,31 +764,29 @@ int ping_gw(char *devname) for(k=0; k /dev/null 2>&1", conf.pinglap,conf.nic[i].ping_ip[j]); - - snprintf(buf,sizeof(buf),"ping -c 1 -w %d %s|grep received|awk -F, '{print $2}'|awk '{print $1}'", conf.pinglap,conf.nic[i].ping_ip[j]); - if((fp = popen(buf,"r")) == NULL) - { - perror("popen"); - return 0; - }else{ - fgets(getbuf,sizeof(getbuf),fp); - if(strncmp(getbuf,"1",1) == 0) - { - pclose(fp); - return 0; - }else{ - pclose(fp); - return -1; - } - } - pclose(fp); - return 0; + snprintf(buf,sizeof(buf),"ping -c 1 -w %d %s|grep received|awk -F, '{print $2}'|awk '{print $1}'", conf.pinglap,conf.nic[i].ping_ip[j]); + if((fp = popen(buf,"r")) == NULL) + { + perror("popen"); + return 0; + }else{ + fgets(getbuf,sizeof(getbuf),fp); + if(strncmp(getbuf,"0",1) != 0) + { + pclose(fp); + return 0; + }else{ + pclose(fp); + return -1; + } + } + pclose(fp); + return 0; } } - return 0; + return -1; } static void *check_inc_switch(void *ptr) @@ -669,11 +795,11 @@ static void *check_inc_switch(void *ptr) FILE *fp = NULL; char name[NIC_NAME_LEN]; struct timespec s_time, os_time; - int count = 0; + int count = 0; char linebuf[LINE_SIZE]; char error_str[200]; - char *str = NULL; - char *retp = NULL; + char *str = NULL; + char *retp = NULL; if((fp = fopen(arg->bond_file_path, "r")) == NULL){ snprintf(error_str, sizeof(error_str), "EMERG: fopen():%s\n", strerror(errno)); @@ -691,9 +817,9 @@ static void *check_inc_switch(void *ptr) return NULL; } } - + s_time.tv_sec = 0; - s_time.tv_nsec = 100000000; + s_time.tv_nsec = 100000000; while(1){ while((str = fgets(linebuf, sizeof(linebuf), fp)) != NULL){ @@ -739,7 +865,7 @@ static void *check_inc_switch(void *ptr) } free(ptr); fclose(fp); - return NULL; + return NULL; } static void *create_logfile(void *ptr) @@ -801,7 +927,7 @@ void write_time(int semid, SHM *ptr) { int i = 0; int flag_time_stamp; - + flag_time_stamp = time(NULL); while(ptr->info[i].charname[0] != 0){ @@ -827,7 +953,7 @@ char *parse(char *line) void release_name_list(NET_NAME_ST *head) { NET_NAME_ST *curr, *save; - + curr = head->next; while(curr != NULL){ save = curr->next; @@ -838,7 +964,7 @@ void release_name_list(NET_NAME_ST *head) int get_netcard(char *line, char *nic) { char *begin, *retp; - + while(isspace(*line))line++; begin = line; while(!isspace(*line))line++; @@ -854,7 +980,7 @@ int get_netcard(char *line, char *nic) void sig_handler(int sig) { -// char err_str[200]; + // char err_str[200]; #if 0 if(unlink(SHM_PATH) == -1){ @@ -866,10 +992,10 @@ void sig_handler(int sig) record_log(err_str); } #endif -// semctl(sem_id, 0, IPC_RMID); + // semctl(sem_id, 0, IPC_RMID); -// snprintf(err_str, sizeof(err_str), "NOTICE: process exit by signal %d\n", sig); -// record_log(err_str); + // snprintf(err_str, sizeof(err_str), "NOTICE: process exit by signal %d\n", sig); + // record_log(err_str); exit(0); } @@ -885,7 +1011,7 @@ int find_nic_config(char *dev_name){ for(i=0; iname, myconf[13]) == 0) && (nicnum <= MAXNICNUM)){ + if((strcmp(cmd ->name, myconf[13]) == 0) && (nicnum <= MAXNICNUM)){ i = 1; if(cmd->data.list[0] && cmd->data.list[1]){ //查找设备列表中是否已有该网卡 @@ -907,43 +1033,43 @@ DOTCONF_CB(cb_str) //如果没找到,则表明先定义了"ping",未定义"nic"或后定义"nic",而未定义"nic"应该是错误的 index = find_nic_config(cmd->data.list[0]); if(index == -1){ - strncpy(conf.nic[nicnum].dev_name, cmd->data.list[0], strlen(cmd->data.list[0]) >= IPLEN ? IPLEN-1 : strlen(cmd->data.list[0])); + strncpy(conf.nic[nicnum].dev_name, cmd->data.list[0], strlen(cmd->data.list[0]) >= IPLEN ? IPLEN-1 : strlen(cmd->data.list[0])); card_info_index = nicnum; - nicnum++; + nicnum++; } else card_info_index = index; - + while(cmd->data.list[i]){ if((int)(inet_addr(cmd->data.list[i])) == -1){ sprintf(wrong_ip,"The wrong IP address:'%s'",cmd->data.list[i]); strcat(wrong_ip,"\n"); record_log(wrong_ip); } else{ - strncpy(conf.nic[card_info_index].ping_ip[conf.nic[card_info_index].gw_num++], cmd->data.list[i], strlen(cmd->data.list[i]) >= IPLEN ? IPLEN-1 : strlen(cmd->data.list[i])); + strncpy(conf.nic[card_info_index].ping_ip[conf.nic[card_info_index].gw_num++], cmd->data.list[i], strlen(cmd->data.list[i]) >= IPLEN ? IPLEN-1 : strlen(cmd->data.list[i])); } i++; } } - } + } //"nic"选项的处理 - if((strcmp(cmd ->name, myconf[12]) == 0) && (nicnum <= MAXNICNUM)){ + if((strcmp(cmd ->name, myconf[12]) == 0) && (nicnum <= MAXNICNUM)){ //设备列表中没有给定的网卡设备,则添加一项 //否则不必添加 //对应配置文件中先指定"ping"后指定"nic"的情况 index = find_nic_config(cmd->data.str); if(index == -1){ - strncpy(conf.nic[nicnum].dev_name, cmd->data.str, strlen(cmd->data.str) >= NIC_NAME_LEN ? NIC_NAME_LEN-1 : strlen(cmd->data.str)); - nicnum++; + strncpy(conf.nic[nicnum].dev_name, cmd->data.str, strlen(cmd->data.str) >= NIC_NAME_LEN ? NIC_NAME_LEN-1 : strlen(cmd->data.str)); + nicnum++; } - } - - if((strcmp(cmd ->name, myconf[11]) == 0)){ - strncpy(conf.udp, cmd->data.str, strlen(cmd->data.str)); } - return NULL; + if((strcmp(cmd ->name, myconf[11]) == 0)){ + strncpy(conf.udp, cmd->data.str, strlen(cmd->data.str)); + } + + return NULL; } DOTCONF_CB(cb_int) @@ -981,43 +1107,43 @@ DOTCONF_CB(cb_int) if(strcmp(cmd ->name, myconf[15]) == 0){ conf.pinglap = cmd->data.value; } - + return NULL; } DOTCONF_CB(cb_list) { - return NULL; + return NULL; } int get_conf() { -// int uid; -// char buf[1024]; -// int i; -// struct passwd *user; - configfile_t *configfile; - -// memset(buf, 0, sizeof(buf)); -// uid=getuid(); -// user = getpwnam("d5000"); -// user = getpwuid(uid); - -// sprintf(buf,"%s", user->pw_dir); -// strcat(buf,conf_path); + // int uid; + // char buf[1024]; + // int i; + // struct passwd *user; + configfile_t *configfile; - configfile = dotconf_create(conf_path, options, NULL, CASE_INSENSITIVE); - if (!configfile) - { - record_log("Warning can't reading config file\n"); - return -1; - } + // memset(buf, 0, sizeof(buf)); + // uid=getuid(); + // user = getpwnam("d5000"); + // user = getpwuid(uid); - if (dotconf_command_loop(configfile) == 0){ + // sprintf(buf,"%s", user->pw_dir); + // strcat(buf,conf_path); + + configfile = dotconf_create(conf_path, options, NULL, CASE_INSENSITIVE); + if (!configfile) + { record_log("Warning can't reading config file\n"); return -1; } - dotconf_cleanup(configfile); + + if (dotconf_command_loop(configfile) == 0){ + record_log("Warning can't reading config file\n"); + return -1; + } + dotconf_cleanup(configfile); if(conf.domain == 0) conf.domain = 10; @@ -1051,21 +1177,21 @@ int get_conf() int isrun(char *p) { - char buf[16]; - char cmdbuf[1024]; - FILE *fp; + char buf[16]; + char cmdbuf[1024]; + FILE *fp; - memset(buf, 0, sizeof(buf)); - memset(cmdbuf, 0, sizeof(cmdbuf)); + memset(buf, 0, sizeof(buf)); + memset(cmdbuf, 0, sizeof(cmdbuf)); - snprintf(cmdbuf, sizeof(cmdbuf), "pidof %s", p); - fp=popen(cmdbuf, "r"); - fread(buf, sizeof(char), sizeof(buf), fp); + snprintf(cmdbuf, sizeof(cmdbuf), "pidof %s", p); + fp=popen(cmdbuf, "r"); + fread(buf, sizeof(char), sizeof(buf), fp); pclose(fp); - if(strchr(buf, ' ') != NULL) - return 1; - else - return 0; + if(strchr(buf, ' ') != NULL) + return 1; + else + return 0; } int get_broad_ip(void) @@ -1074,17 +1200,17 @@ int get_broad_ip(void) char error_str[200]; int skfd; struct ifreq ifr; - + memset(&ifr, 0, sizeof(ifr)); memset(ip_p, 0, sizeof(ip_p)); - + if((skfd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)return -1; strcpy(ifr.ifr_name, conf.udp); if (!ioctl(skfd, SIOCGIFBRDADDR, &ifr)){ - sprintf(ip_p[0], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[2]); - sprintf(ip_p[1], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[3]); - sprintf(ip_p[2], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[4]); - sprintf(ip_p[3], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[5]); + sprintf(ip_p[0], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[2]); + sprintf(ip_p[1], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[3]); + sprintf(ip_p[2], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[4]); + sprintf(ip_p[3], "%d", (unsigned char)ifr.ifr_broadaddr.sa_data[5]); }else{ snprintf(error_str, sizeof(error_str), "EMERG: Invalid broadcast device -- %s\n", conf.udp); record_log(error_str); @@ -1128,6 +1254,7 @@ void create_dir(char *create_path) } void create_semdir() { +#if 0 int ret = 0; mode_t mask_tmp; @@ -1137,9 +1264,11 @@ void create_semdir() close(ret); } umask(mask_tmp); +#endif } void create_shmdir() { +#if 0 int ret = 0; mode_t mask_tmp; @@ -1149,6 +1278,7 @@ void create_shmdir() close(ret); } umask(mask_tmp); +#endif } void create_confdir() { @@ -1178,13 +1308,13 @@ void create_logdir() umask(mask_tmp); } - /* create netcard name list */ +/* create netcard name list */ int create_name_list(NET_NAME_ST *all_name_list, NET_NAME_ST *opt_name_list) { int i, count_t, err_val = 0; NET_NAME_ST *curr, *node; char error_str[200]; - + for(i = 0, count_t = 0; conf.nic[i].dev_name[0] != 0 && (i < MAXNICNUM); i++){ curr = all_name_list->next; while(curr != NULL){ @@ -1232,7 +1362,7 @@ int get_netcard_status(NETCARD_INFO_ST *listp) if(listp->status == NIC_UNLINKABLE) return NIC_UNLINKABLE; } - + return NIC_NORMAL; } @@ -1309,8 +1439,8 @@ int main(int argc, char ** argv) D5000_NIC_ALARM Malarm; struct sigaction sig; struct passwd *user; -// proc_invocation prcm; - + proc_invocation prcm; + char log_record[125]={0}; memset(&conf, 0, sizeof(CONFIG_FILE_ST)); @@ -1318,8 +1448,8 @@ int main(int argc, char ** argv) printf("the program is already started!\n"); exit(0); } -//process register -#if 0 + //process register +#if 1 if((proc_stat=prcm.proc_init("sys","base_srv","sys_nicmonitor"))==-1){ perror("proc_init()"); exit(-1); @@ -1347,7 +1477,7 @@ int main(int argc, char ** argv) strcat(shm_path,SHM_PATH); strcat(sem_path,SEM_PATH); strcat(conf_path,CONF_FILE); - + create_semdir(); create_shmdir(); create_logdir(); @@ -1549,6 +1679,43 @@ int main(int argc, char ** argv) pthread_join(tid_time, NULL); pthread_mutex_destroy(&mut); globfree(&res); +#ifdef USE_OLD_MMSHARE munmap(shm_ptr, sizeof(SHM)); +#else + { + + void *shmptr = shm_ptr; +#if 0 + snprintf(error_str, sizeof(error_str), "NOTICE: free shm %p, glo:%p\n", shmptr, global_shmptr); + record_log(error_str); +#endif + + if( shmptr == global_shmptr ) { + char *ref_count = NULL; + int is_last = 0; + int size = sizeof(SHM); + + ref_count = (char *)shmptr + size + 16 - 1; + + is_last = *ref_count == 1?1:0; +#if 0 + snprintf(error_str, sizeof(error_str), "NOTICE: sys_nic, size:%d, ref_count: %d, last:%d\n", + size, *ref_count, is_last); + record_log(error_str); +#endif + +// if( is_last ) { + memset( shmptr, 0, size + 16 ); +// } + + shmdt( shmptr ); +// shmctl( global_share_id, IPC_RMID, NULL ); +// if( is_last ) { +// global_shmptr = NULL; +// global_share_id = -1; +// } + } + } +#endif return 0; } diff --git a/code/trunk/sys_nicmonitor/nicinfo_shm.c b/code/trunk/sys_nicmonitor/nicinfo_shm.c index c8a8bf2..051c22e 100644 --- a/code/trunk/sys_nicmonitor/nicinfo_shm.c +++ b/code/trunk/sys_nicmonitor/nicinfo_shm.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -12,11 +13,12 @@ #include #include #include +#include #include "nicinfo_shm.h" -#define SHM_PATH "/tmp/sys_netcard_shm_path" -#define SEM_PATH "/tmp/sys_netcard_sem_path" +#define SHM_PATH "/share/sys_netcard_shm_path" +#define SEM_PATH "/share/sys_netcard_sem_path" #define LOG_PATH "/var/log/netcard/" typedef struct net_info{ @@ -29,9 +31,64 @@ static char shm_path[1024]; static char sem_path[1024]; SHM *ptr = NULL; + +static void create_dir(char *create_path) +{ + int i,len = strlen(create_path); + + len = strlen(create_path); + + for(i=1; iinfo[i], sizeof(NETCARD_INFO)); release_sem(semid); +#ifdef USE_OLD_MMSHARE munmap(ptr, sizeof(SHM)); +#else + linx_free_shm( ptr, sizeof(SHM) ); +#endif return 0; } } release_sem(semid); snprintf(err_str, sizeof(err_str), "NOTICE: No information of %s !\n", nic_name); record_log(err_str); +#ifdef USE_OLD_MMSHARE munmap(ptr, sizeof(SHM)); +#else + linx_free_shm( ptr, sizeof(SHM) ); +#endif return -1; } + +static void linx_free_shm( void *addr, int size ) +{ + + void *shmptr = addr; + char err_str[200]; + +#if 0 + snprintf(err_str, sizeof(err_str), "NOTICE: free shm 0x%x, size:%d, glo:0x%x\n", addr, size, global_shmptr); + record_log(err_str); +#endif + + if( shmptr == global_shmptr ) { + char *ref_count = NULL; + int is_last = 0; +// int size = sizeof(SHM); + + ref_count = (char *)shmptr + size + 16 - 1; + + is_last = *ref_count == 1?1:0; + +#if 0 + snprintf(err_str, sizeof(err_str), "NOTICE: lib, sref_count: %d, last:%d\n", *ref_count, is_last); + record_log(err_str); +#endif + +#if 0 + if( is_last ) { + memset( shmptr, 0, size + 16 ); + } +#endif + shmdt( shmptr ); +// shmctl( global_share_id, IPC_RMID, NULL ); +// if( is_last ) { +// global_shmptr = NULL; +// global_share_id = -1; +// } + } + +} + + diff --git a/code/trunk/test/Makefile b/code/trunk/test/Makefile index 0cd95f9..e60b92f 100644 --- a/code/trunk/test/Makefile +++ b/code/trunk/test/Makefile @@ -3,6 +3,6 @@ all:read_shm recv_msg getmem getmem:getmem.c # g++ -g -L ../dynamic_lib -lnic_shm -o $@ $^ - g++ -g -lnic_shm -o $@ $^ + g++ -g -L ${HOME}/lib -lpthread -lnic_shm -o $@ $^ clean: rm getmem read_shm recv_msg