summaryrefslogtreecommitdiff
path: root/net/pppload/files/patch-ae
blob: ff57f7afc721b54b04b4b09ba7f0df9e2248969c (plain) (blame)
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
diff -u --new-file pppload-1.0/PPPStats.C.ppp ./PPPStats.C.ppp
--- pppload-1.0/PPPStats.C.ppp	Wed Dec 31 16:00:00 1969
+++ ./PPPStats.C.ppp	Wed Jan 28 18:27:30 1998
@@ -0,0 +1,120 @@
+// pppload - A PPP Load Monitor
+// Copyright (C) 1996  Sean Vyain
+// svyain@mail.tds.net
+// smvyain@softart.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+extern "C" {
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <net/if.h> 
+#include <net/if_ppp.h> 
+#include <net/if_var.h>
+#include <net/if_tun.h>
+}
+
+#include "PPPStats.H"
+#include "Options.H"
+#include <iostream.h>
+
+
+typedef struct
+{
+  struct ppp_stats  stats;
+} DclPPPInfo;
+
+PPPStats::PPPStats()
+: _rxTotal( 0 ), _txTotal( 0 ), _isUp( true ), _retryId( -1 )
+{
+	if ((_s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+        perror("couldn't create IP socket");
+        exit(1);
+    }
+
+	startTimer( options->interval() * 1000 );
+}
+
+void PPPStats::timerEvent( QTimerEvent* e )
+{
+	if ( e->timerId() == _retryId )
+	{
+		system( (const char*)options->cmd() );
+	}
+	
+	DclPPPInfo        PPPInfo[1];           // what is this var for?
+	struct ifpppstatsreq ifreq;             // ifreq      ifreq; 
+	struct ppp_stats* PPPStat;
+	struct ppp_stats  LastPPPStat[1];       // what is this var for?
+	
+	memset (&ifreq, 0, sizeof (ifreq));
+//	sprintf (ifreq.ifr_ifrn.ifrn_name, "ppp%d", options->link());
+	sprintf (ifreq.ifr_name, "tun%d", options->link());
+
+//	ifreq.ifr_ifru.ifru_data = (caddr_t) PPPInfo;
+
+	PPPStat = & PPPInfo->stats;
+	memset (LastPPPStat, 0, sizeof (LastPPPStat));
+
+
+
+//	if ( (ioctl (_s, SIOCDEVPRIVATE, (caddr_t) & ifreq) < 0) ||
+//	     ( _isUp && ( PPPStat->p.ppp_ibytes < _rxTotal ) ) ||
+//	     ( !_isUp && ( PPPStat->p.ppp_ibytes == 0 ) )
+	if ( (ioctl (_s, SIOCGPPPSTATS ,  &ifreq) < 0) ||
+	     ( _isUp && ( ifreq.stats.p.ppp_ibytes < _rxTotal ) ) ||
+	     ( !_isUp && ( ifreq.stats.p.ppp_ibytes == 0 ))
+	     ) {
+	  if ( _isUp ) {
+			_isUp = false;
+			emit linkDown();
+			if ( options->cmd().length() ) {
+			  _retryId = startTimer( options->retry() * 1000 );
+			  system( (const char*)options->cmd() );
+			}
+	  }
+	  PPPStat->p.ppp_ibytes = 0;
+          PPPStat->p.ppp_obytes = 0;
+	} else if ( !_isUp ) {
+	  _isUp = true;
+	  killTimer( _retryId );
+	  _retryId = -1;
+	}
+
+ PPPStat->p.ppp_ibytes=ifreq.stats.p.ppp_ibytes;	
+ PPPStat->p.ppp_obytes=ifreq.stats.p.ppp_obytes;
+	
+
+cout<<ifreq.stats.p.ppp_ibytes<<" "<<ifreq.stats.p.ppp_ipackets<<" "
+    <<ifreq.stats.p.ppp_ierrors<<" "<<ifreq.stats.p.ppp_obytes <<" "
+    <<ifreq.stats.p.ppp_opackets<<" "<<ifreq.stats.p.ppp_oerrors<<endl
+    <<PPPStat->p.ppp_ibytes<<" "<<PPPStat->p.ppp_ipackets<<" "
+    <<PPPStat->p.ppp_ierrors<<" "<<PPPStat->p.ppp_obytes <<" "
+    <<PPPStat->p.ppp_opackets<<" "<<PPPStat->p.ppp_oerrors<<endl;
+	unsigned int rxDelta = PPPStat->p.ppp_ibytes - _rxTotal;
+	unsigned int txDelta = PPPStat->p.ppp_obytes - _txTotal;
+	_rxTotal = PPPStat->p.ppp_ibytes;
+	_txTotal = PPPStat->p.ppp_obytes;
+	if ( rxDelta == _rxTotal ) rxDelta = 0;
+	if ( txDelta == _txTotal ) txDelta = 0;
+	emit changeStats( rxDelta, txDelta, _rxTotal, _txTotal );
+
+}
+