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
|
--- agent/mibgroup/mibII/tcpTable.c.orig Fri Jul 18 21:10:09 2003
+++ agent/mibgroup/mibII/tcpTable.c Fri Jul 18 21:10:12 2003
@@ -435,11 +435,42 @@
int TCP_Count_Connections (void)
{
int Established;
+#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
+ int mib[4], len;
+ char *p;
+ struct tcpcb *tpcb;
+ struct xtcpcb *tp;
+ struct xinpgen *next;
+
+ mib[0]=CTL_NET;
+ mib[1]=PF_INET;
+ mib[2]=IPPROTO_TCP;
+ mib[3]=TCPCTL_PCBLIST;
+
+ if (sysctl(mib, 4, NULL, &len, NULL, 0) != 0) {
+ snmp_log_perror("TCP_Count_Connections - sysctl");
+ return 0;
+ }
+ if ((p=(char *)malloc(len)) == NULL) {
+ snmp_log_perror("TCP_Count_Connections - malloc");
+ return 0;
+ }
+ if (sysctl(mib, 4, p, &len, NULL, 0) != 0) {
+ snmp_log_perror("TCP_Count_Connections - sysctl");
+ free(p);
+ return 0;
+ }
+ Established=0;
+ next=(struct xinpgen *)p;
+ for (next=(struct xinpgen *)((char *)next + next->xig_len); next->xig_len > sizeof(struct xinpgen); next=(struct xinpgen *)((char *)next + next->xig_len)) {
+ tp=(struct xtcpcb *)next;
+ if (tp->xt_tp.t_state == TCPS_ESTABLISHED || tp->xt_tp.t_state == TCPS_CLOSE_WAIT)
+ Established++;
+ }
+ free(p);
+#else
struct inpcb cb;
register struct inpcb *next;
-#if !(defined(freebsd2) || defined(netbsd2) || defined(openbsd2))
- register struct inpcb *prev;
-#endif
struct inpcb inpcb;
struct tcpcb tcpcb;
@@ -450,17 +481,10 @@
auto_nlist(TCP_SYMBOL, (char *)&cb, sizeof(struct inpcb));
inpcb = cb;
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
- prev = (struct inpcb *) auto_nlist_value(TCP_SYMBOL);
-#endif /* !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
/*
* Scan the control blocks
*/
-#if defined(freebsd2) || defined(netbsd1) || defined(openbsd2)
while ((inpcb.INP_NEXT_SYMBOL != NULL) && (inpcb.INP_NEXT_SYMBOL != (struct inpcb *) auto_nlist_value(TCP_SYMBOL)))
-#else /* defined(freebsd2) || defined(netbsd1) || defined(openbsd2) */
- while (inpcb.INP_NEXT_SYMBOL != (struct inpcb *) auto_nlist_value(TCP_SYMBOL))
-#endif /* defined(freebsd2) || defined(netbsd1) */
{
next = inpcb.INP_NEXT_SYMBOL;
@@ -468,16 +492,7 @@
snmp_log_perror("TCP_Count_Connections - inpcb");
break;
}
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
- if (inpcb.INP_PREV_SYMBOL != prev) { /* ??? */
- sleep(1);
- goto Again;
- }
-#endif /* !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
if (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY) {
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
- prev = next;
-#endif /* !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
continue;
}
if(klookup((unsigned long)inpcb.inp_ppcb, (char *)&tcpcb, sizeof (tcpcb)) == 0) {
@@ -488,10 +503,8 @@
if ((tcpcb.t_state == TCPS_ESTABLISHED) ||
(tcpcb.t_state == TCPS_CLOSE_WAIT))
Established++;
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
- prev = next;
-#endif /* !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
}
+#endif
return(Established);
}
#endif /* !linux && !hpux11 */
|