tcp-ip : snmp

来源:互联网 发布:思途旅游cms 6.0 下载 编辑:程序博客网 时间:2024/06/08 16:13

linux内核没有实现SNMP(SimpleNetwork Management Protocol,简单网络管理协议),只是收集一些MIB(管理信息基)并把它们输出到/proc去。

[ include/uapi/linux/snmp.h ]

/* tcp mib definitions *//* * RFC 1213:  MIB-II TCP group * RFC 2012 (updates 1213):  SNMPv2-MIB-TCP */enum{TCP_MIB_NUM = 0,TCP_MIB_RTOALGORITHM,/* RtoAlgorithm */TCP_MIB_RTOMIN,/* RtoMin */TCP_MIB_RTOMAX,/* RtoMax */TCP_MIB_MAXCONN,/* MaxConn */TCP_MIB_ACTIVEOPENS,/* ActiveOpens */TCP_MIB_PASSIVEOPENS,/* PassiveOpens */TCP_MIB_ATTEMPTFAILS,/* AttemptFails */TCP_MIB_ESTABRESETS,/* EstabResets */TCP_MIB_CURRESTAB,/* CurrEstab */TCP_MIB_INSEGS,/* InSegs */TCP_MIB_OUTSEGS,/* OutSegs */TCP_MIB_RETRANSSEGS,/* RetransSegs */TCP_MIB_INERRS,/* InErrs */TCP_MIB_OUTRSTS,/* OutRsts */TCP_MIB_CSUMERRORS,/* InCsumErrors */__TCP_MIB_MAX};
这个结构是要收集的和TCP有关的信息类型。如:TCP_MIB_INSEGS表示接收到数据包。

[ include/net/snmp.h ]

/* TCP */#define TCP_MIB_MAX__TCP_MIB_MAXstruct tcp_mib {unsigned longmibs[TCP_MIB_MAX];};
定义了一个结构,内含一个数组,用来对上面提到的信息类型进行计数。

[ include/net/netns/mib.h ]

struct netns_mib {DEFINE_SNMP_STAT(struct tcp_mib, tcp_statistics);DEFINE_SNMP_STAT(struct ipstats_mib, ip_statistics);DEFINE_SNMP_STAT(struct linux_mib, net_statistics);DEFINE_SNMP_STAT(struct udp_mib, udp_statistics);DEFINE_SNMP_STAT(struct udp_mib, udplite_statistics);DEFINE_SNMP_STAT(struct icmp_mib, icmp_statistics);DEFINE_SNMP_STAT_ATOMIC(struct icmpmsg_mib, icmpmsg_statistics);#if IS_ENABLED(CONFIG_IPV6)struct proc_dir_entry *proc_net_devsnmp6;DEFINE_SNMP_STAT(struct udp_mib, udp_stats_in6);DEFINE_SNMP_STAT(struct udp_mib, udplite_stats_in6);DEFINE_SNMP_STAT(struct ipstats_mib, ipv6_statistics);DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics);DEFINE_SNMP_STAT_ATOMIC(struct icmpv6msg_mib, icmpv6msg_statistics);#endif#ifdef CONFIG_XFRM_STATISTICSDEFINE_SNMP_STAT(struct linux_xfrm_mib, xfrm_statistics);#endif};
这个结构定义了所有要统计的信息,对TCP:DEFINE_SNMP_STAT(struct tcp_mib, tcp_statistics);这个宏展开如下:

[ include/net/snmp.h ]

#define SNMP_ARRAY_SZ 1#define DEFINE_SNMP_STAT(type, name)\__typeof__(type) __percpu *name[SNMP_ARRAY_SZ]
即:
 __typeof__(struct tcp_mib) __percpu *tcp_statistics[ 1 ]

如果接收到了一个新的数据段,要增加计数:

[ net/ipv4/tcp_ipv4.c ]

int tcp_v4_rcv(struct sk_buff *skb){...struct net *net = dev_net(skb->dev);// 网络名字空间/* Count it even if it's bad */TCP_INC_STATS_BH(net, TCP_MIB_INSEGS);...}

[ include/net/tcp.h ]

#define TCP_INC_STATS_BH(net, field)SNMP_INC_STATS_BH((net)->mib.tcp_statistics, field)

[ include/net/snmp.h ]

#define SNMP_INC_STATS_BH(mib, field)\__this_cpu_inc(mib[0]->mibs[field])

[ include/net/net_namespace.h ]

struct net {...struct netns_mibmib;...}

最后的展开如下:

__this_cpu_inc( net->mib.tcp_statistics[ 0 ]->mibs[ TCP_MIB_INSEGS ] )

对新接收的数据包进行了计数。



0 0
原创粉丝点击