summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>2002-10-05 11:24:35 -0500
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>2002-10-05 11:24:35 -0500
commit05fb5a374886df9fa300a273cbb8a6cf1080e6bf (patch)
treeff8906529f2425a895a3b628686e8770a2e8f740
parenta8a5aeeafe5366a38de52744014db6c93228d1f5 (diff)
ISDN: Reuse the dial_timer for idle hangup
Since we use the dial timer only during setup and the idle timer only when the connection is active, we can simply (and cleanly) use the same timer.
-rw-r--r--drivers/isdn/i4l/isdn_net.c72
-rw-r--r--drivers/isdn/i4l/isdn_net_lib.c65
-rw-r--r--include/linux/isdn.h1
3 files changed, 69 insertions, 69 deletions
diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c
index 38fb4949c1b4..6a64a6237b76 100644
--- a/drivers/isdn/i4l/isdn_net.c
+++ b/drivers/isdn/i4l/isdn_net.c
@@ -51,6 +51,7 @@ enum {
EV_NET_TIMER_OUT_DCONN = 0x203,
EV_NET_TIMER_OUT_BCONN = 0x204,
EV_NET_TIMER_CB = 0x205,
+ EV_NET_TIMER_HUP = 0x206,
};
/*
@@ -259,8 +260,10 @@ static void isdn_net_connected(isdn_net_dev *idev)
isdn_net_local *mlp = idev->mlp;
idev->dialstate = ST_ACTIVE;
- idev->hup_timer.expires = jiffies + HZ;
- add_timer(&idev->hup_timer);
+
+ idev->dial_event = EV_NET_TIMER_HUP;
+ idev->dial_timer.expires = jiffies + HZ;
+ add_timer(&idev->dial_timer);
if (mlp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
isdn_net_add_to_bundle(mlp, idev);
@@ -400,6 +403,66 @@ do_dialout(isdn_net_dev *idev)
add_timer(&idev->dial_timer);
}
+/*
+ * Perform auto-hangup for net-interfaces.
+ *
+ * auto-hangup:
+ * Increment idle-counter (this counter is reset on any incoming or
+ * outgoing packet), if counter exceeds configured limit either do a
+ * hangup immediately or - if configured - wait until just before the next
+ * charge-info.
+ */
+
+static void
+isdn_net_check_hup(isdn_net_dev *idev)
+{
+ isdn_net_local *mlp = idev->mlp;
+
+ if (!isdn_net_online(idev)) {
+ isdn_BUG();
+ return;
+ }
+
+ dbg_net_dial("%s: huptimer %d, onhtime %d, chargetime %ld, chargeint %d\n",
+ idev->name, idev->huptimer, mlp->onhtime, idev->chargetime, idev->chargeint);
+
+ if (mlp->onhtime == 0)
+ return;
+
+ if (idev->huptimer++ <= mlp->onhtime)
+ goto mod_timer;
+
+ if ((mlp->hupflags & (ISDN_MANCHARGE | ISDN_CHARGEHUP)) == (ISDN_MANCHARGE | ISDN_CHARGEHUP)) {
+ while (time_after(jiffies, idev->chargetime + idev->chargeint))
+ idev->chargetime += idev->chargeint;
+
+ if (time_after(jiffies, idev->chargetime + idev->chargeint - 2 * HZ)) {
+ if (idev->outgoing || mlp->hupflags & ISDN_INHUP) {
+ isdn_net_hangup(idev);
+ return;
+ }
+ }
+ } else if (idev->outgoing) {
+ if (mlp->hupflags & ISDN_CHARGEHUP) {
+ if (idev->charge_state != ST_CHARGE_HAVE_CINT) {
+ dbg_net_dial("%s: did not get CINT\n", idev->name);
+ isdn_net_hangup(idev);
+ return;
+ } else if (time_after(jiffies, idev->chargetime + idev->chargeint)) {
+ dbg_net_dial("%s: chtime = %lu, chint = %d\n",
+ idev->name, idev->chargetime, idev->chargeint);
+ isdn_net_hangup(idev);
+ return;
+ }
+ }
+ } else if (mlp->hupflags & ISDN_INHUP) {
+ isdn_net_hangup(idev);
+ return;
+ }
+ mod_timer:
+ mod_timer(&idev->dial_timer, idev->dial_timer.expires + HZ);
+}
+
static int
isdn_net_event_out_wait_dconn(isdn_net_dev *idev, int pr, void *arg)
{
@@ -531,6 +594,9 @@ isdn_net_event_active(isdn_net_dev *idev, int pr, void *arg)
isdn_ctrl *c = arg;
switch (pr) {
+ case EV_NET_TIMER_HUP:
+ isdn_net_check_hup(idev);
+ return 1;
case ISDN_STAT_BSENT:
/* A packet has successfully been sent out */
isdn_net_dec_frame_cnt(idev);
@@ -610,7 +676,7 @@ isdn_net_hangup(isdn_net_dev *idev)
isdn_net_local *mlp = idev->mlp;
isdn_ctrl cmd;
- del_timer_sync(&idev->hup_timer);
+ del_timer_sync(&idev->dial_timer);
if (!isdn_net_bound(idev))
return;
diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c
index 026d4d3a6631..7727e1ab9656 100644
--- a/drivers/isdn/i4l/isdn_net_lib.c
+++ b/drivers/isdn/i4l/isdn_net_lib.c
@@ -31,7 +31,6 @@ int isdn_net_handle_event(isdn_net_dev *idev, int pr, void *arg); /* FIXME */
static void isdn_net_tasklet(unsigned long data);
static void isdn_net_dial_timer(unsigned long data);
-static void isdn_net_hup_timer(unsigned long data);
static int isdn_init_netif(struct net_device *ndev);
/* ====================================================================== */
@@ -251,9 +250,6 @@ isdn_net_addif(char *name, isdn_net_local *mlp)
init_timer(&idev->dial_timer);
idev->dial_timer.data = (unsigned long) idev;
idev->dial_timer.function = isdn_net_dial_timer;
- init_timer(&idev->hup_timer);
- idev->hup_timer.data = (unsigned long) idev;
- idev->hup_timer.function = isdn_net_hup_timer;
if (!mlp) {
/* Device shall be a master */
@@ -1032,64 +1028,3 @@ isdn_net_dial_timer(unsigned long data)
isdn_net_handle_event(idev, idev->dial_event, NULL);
}
-/*
- * Perform auto-hangup for net-interfaces.
- *
- * auto-hangup:
- * Increment idle-counter (this counter is reset on any incoming or
- * outgoing packet), if counter exceeds configured limit either do a
- * hangup immediately or - if configured - wait until just before the next
- * charge-info.
- */
-
-static void
-isdn_net_hup_timer(unsigned long data)
-{
- isdn_net_dev *idev = (isdn_net_dev *) data;
- isdn_net_local *mlp = idev->mlp;
-
- if (!isdn_net_online(idev)) {
- isdn_BUG();
- return;
- }
-
- dbg_net_dial("%s: huptimer %d, onhtime %d, chargetime %ld, chargeint %d\n",
- idev->name, idev->huptimer, mlp->onhtime, idev->chargetime, idev->chargeint);
-
- if (mlp->onhtime == 0)
- return;
-
- if (idev->huptimer++ <= mlp->onhtime)
- goto mod_timer;
-
- if ((mlp->hupflags & (ISDN_MANCHARGE | ISDN_CHARGEHUP)) == (ISDN_MANCHARGE | ISDN_CHARGEHUP)) {
- while (time_after(jiffies, idev->chargetime + idev->chargeint))
- idev->chargetime += idev->chargeint;
-
- if (time_after(jiffies, idev->chargetime + idev->chargeint - 2 * HZ)) {
- if (idev->outgoing || mlp->hupflags & ISDN_INHUP) {
- isdn_net_hangup(idev);
- return;
- }
- }
- } else if (idev->outgoing) {
- if (mlp->hupflags & ISDN_CHARGEHUP) {
- if (idev->charge_state != ST_CHARGE_HAVE_CINT) {
- dbg_net_dial("%s: did not get CINT\n", idev->name);
- isdn_net_hangup(idev);
- return;
- } else if (time_after(jiffies, idev->chargetime + idev->chargeint)) {
- dbg_net_dial("%s: chtime = %lu, chint = %d\n",
- idev->name, idev->chargetime, idev->chargeint);
- isdn_net_hangup(idev);
- return;
- }
- }
- } else if (mlp->hupflags & ISDN_INHUP) {
- isdn_net_hangup(idev);
- return;
- }
- mod_timer:
- mod_timer(&idev->hup_timer, idev->hup_timer.expires + HZ);
-}
-
diff --git a/include/linux/isdn.h b/include/linux/isdn.h
index 664f2d471fd6..cf88490d83c1 100644
--- a/include/linux/isdn.h
+++ b/include/linux/isdn.h
@@ -381,7 +381,6 @@ typedef struct isdn_net_dev_s {
int sqfull; /* Flag: netdev-queue overloaded */
ulong sqfull_stamp; /* Start-Time of overload */
- struct timer_list hup_timer; /* auto hangup timer */
int huptimer; /* Timeout-counter for auto-hangup */
int charge; /* Counter for charging units */
int charge_state; /* ChargeInfo state machine */