PPP notifier support is now a compile time option

However, as of now, the notify() function is empty, so it requires
some work if someone want to use it.

The notify feature allows someone to be able to follow the
state of the PPP stack (auth ok, ipcp up, initialise, ...), this
is like the callback feature set by pppOverEthernetOpen() and others,
but with more details.
This commit is contained in:
Sylvain Rochet 2012-06-02 14:48:04 +02:00
parent 55c1ec2925
commit 6727c43441
7 changed files with 69 additions and 5 deletions

View File

@ -203,12 +203,14 @@ int (*allowed_address_hook) __P((u_int32_t addr)) = NULL;
void (*multilink_join_hook) __P((void)) = NULL;
#endif
#if PPP_NOTIFY
/* A notifier for when the peer has authenticated itself,
and we are proceeding to the network phase. */
struct notifier *auth_up_notifier = NULL;
/* A notifier for when the link goes down. */
struct notifier *link_down_notifier = NULL;
#endif /* PPP_NOTIFY */
/*
* Option variables.
@ -567,7 +569,9 @@ void start_link(unit)
char *msg;
status = EXIT_NEGOTIATION_FAILED;
#if PPP_NOTIFY
new_phase(PHASE_SERIALCONN);
#endif /* PPP_NOTIFY */
hungup = 0;
devfd = the_channel->connect();
@ -603,18 +607,24 @@ void start_link(unit)
notice("Starting negotiation on %s", ppp_devnam);
add_fd(fd_ppp);
#if PPP_NOTIFY
new_phase(PHASE_ESTABLISH);
#endif /* PPP_NOTIFY */
lcp_lowerup(0);
return;
disconnect:
#if PPP_NOTIFY
new_phase(PHASE_DISCONNECT);
#endif /* PPP_NOTIFY */
if (the_channel->disconnect)
the_channel->disconnect();
fail:
#if PPP_NOTIFY
new_phase(PHASE_DEAD);
#endif /* PPP_NOTIFY */
if (the_channel->cleanup)
(*the_channel->cleanup)();
}
@ -630,7 +640,9 @@ link_terminated(unit)
{
if (phase == PHASE_DEAD || phase == PHASE_MASTER)
return;
#if PPP_NOTIFY
new_phase(PHASE_DISCONNECT);
#endif /* PPP_NOTIFY */
#if 0 /* UNUSED */
if (pap_logout_hook) {
@ -647,6 +659,10 @@ link_terminated(unit)
lcp_lowerdown(0);
#if PPP_NOTIFY
new_phase(PHASE_DEAD);
#endif /* PPP_NOTIFY */
#if 0
/*
* Delete pid files before disestablishing ppp. Otherwise it
@ -702,12 +718,16 @@ void
link_down(unit)
int unit;
{
#if PPP_NOTIFY
notify(link_down_notifier, 0);
#endif /* #if PPP_NOTIFY */
if (!doing_multilink) {
upper_layers_down(unit);
#if PPP_NOTIFY
if (phase != PHASE_DEAD && phase != PHASE_MASTER)
new_phase(PHASE_ESTABLISH);
#endif /* PPP_NOTIFY */
}
/* XXX if doing_multilink, should do something to stop
network-layer traffic on the link */
@ -796,7 +816,9 @@ link_established(unit)
}
#endif /* UNUSED */
#if PPP_NOTIFY
new_phase(PHASE_AUTHENTICATE);
#endif /* PPP_NOTIFY */
auth = 0;
#if EAP_SUPPORT
if (go->neg_eap) {
@ -860,6 +882,7 @@ network_phase(unit)
notice("peer from calling number %q authorized", remote_number);
#endif /* UNUSED */
#if PPP_NOTIFY
/*
* If the peer had to authenticate, notify it now.
*/
@ -876,13 +899,16 @@ network_phase(unit)
) {
notify(auth_up_notifier, 0);
}
#endif /* PPP_NOTIFY */
#if CBCP_SUPPORT
/*
* If we negotiated callback, do it now.
*/
if (go->neg_cbcp) {
#if PPP_NOTIFY
new_phase(PHASE_CALLBACK);
#endif /* PPP_NOTIFY */
(*cbcp_protent.open)(unit);
return;
}
@ -914,7 +940,9 @@ start_networks(unit)
int mppe_required;
#endif /* MPPE */
#if PPP_NOTIFY
new_phase(PHASE_NETWORK);
#endif /* PPP_NOTIFY */
#ifdef HAVE_MULTILINK
if (multilink) {
@ -1165,7 +1193,9 @@ np_up(unit, proto)
*/
status = EXIT_OK;
unsuccess = 0;
#if PPP_NOTIFY
new_phase(PHASE_RUNNING);
#endif /* PPP_NOTIFY */
#if 0 /* UNUSED */
if (idle_time_hook != 0)
@ -1211,8 +1241,10 @@ np_down(unit, proto)
UNTIMEOUT(connect_time_expired, NULL);
#ifdef MAXOCTETS
UNTIMEOUT(check_maxoctets, NULL);
#endif
#endif
#if PPP_NOTIFY
new_phase(PHASE_NETWORK);
#endif /* PPP_NOTIFY */
}
}

View File

@ -84,9 +84,11 @@ void (*ip_down_hook) __P((void)) = NULL;
/* Hook for a plugin to choose the remote IP address */
void (*ip_choose_hook) __P((u_int32_t *)) = NULL;
#if PPP_NOTIFY
/* Notifiers for when IPCP goes up and down */
struct notifier *ip_up_notifier = NULL;
struct notifier *ip_down_notifier = NULL;
#endif /* PPP_NOTIFY */
/* local vars */
static int default_route_set[NUM_PPP]; /* Have set up a default route */
@ -1961,7 +1963,9 @@ ipcp_up(f)
np_up(f->unit, PPP_IP);
ipcp_is_up = 1;
#if PPP_NOTIFY
notify(ip_up_notifier, 0);
#endif /* PPP_NOTIFY */
if (ip_up_hook)
ip_up_hook();
}
@ -1983,7 +1987,9 @@ ipcp_down(f)
/* XXX more correct: we must get the stats before running the notifiers,
* at least for the radius plugin */
update_link_stats(f->unit);
#if PPP_NOTIFY
notify(ip_down_notifier, 0);
#endif /* PPP_NOTIFY */
if (ip_down_hook)
ip_down_hook();
if (ipcp_is_up) {

View File

@ -427,8 +427,10 @@ lcp_close(unit, reason)
fsm *f = &lcp_fsm[unit];
int oldstate;
#if PPP_NOTIFY
if (phase != PHASE_DEAD && phase != PHASE_MASTER)
new_phase(PHASE_TERMINATE);
#endif /* PPP_NOTIFY */
if (f->flags & DELAYED_UP) {
UNTIMEOUT(lcp_delayed_up, f);

View File

@ -1016,6 +1016,7 @@ old_ppp_recv_config(unit, mru, accm, pcomp, accomp)
}
#endif
#if 0
/*
* new_phase - signal the start of a new phase of pppd's operation.
*/
@ -1028,6 +1029,7 @@ new_phase(p)
(*new_phase_hook)(p);
notify(phasechange, p);
}
#endif
#if 0
/*
@ -1658,6 +1660,7 @@ reap_kids()
}
#endif /* UNUSED */
#if 0 /* UNUSED */
/*
* add_notifier - add a new function to be called when something happens.
*/
@ -1699,7 +1702,9 @@ remove_notifier(notif, func, arg)
}
}
}
#endif /* UNUSED */
#if 0
/*
* notify - call a set of functions registered with add_notifier.
*/
@ -1715,6 +1720,7 @@ notify(notif, val)
(*np->func)(np->arg, val);
}
}
#endif
#if 0 /* UNUSED */
/*

View File

@ -201,6 +201,7 @@ struct epdisc {
#define EPD_MAGIC 4
#define EPD_PHONENUM 5
#if 0 /* UNUSED */
typedef void (*notify_func) __P((void *, int));
struct notifier {
@ -208,6 +209,7 @@ struct notifier {
notify_func func;
void *arg;
};
#endif /* UNUSED */
/*
* Global variables.
@ -262,12 +264,14 @@ extern struct notifier *pidchange; /* for notifications of pid changing */
extern struct notifier *phasechange; /* for notifications of phase changes */
extern struct notifier *exitnotify; /* for notification that we're exiting */
extern struct notifier *sigreceived; /* notification of received signal */
#if PPP_NOTIFY
extern struct notifier *ip_up_notifier; /* IPCP has come up */
extern struct notifier *ip_down_notifier; /* IPCP has gone down */
#if 0 /* UNUSED */
extern struct notifier *auth_up_notifier; /* peer has authenticated */
#endif /* UNUSED */
extern struct notifier *link_down_notifier; /* link has gone down */
#endif /* PPP_NOTIFY */
extern struct notifier *fork_notifier; /* we are a new child process */
/* Values for do_callback and doing_callback */
@ -526,10 +530,12 @@ void update_link_stats __P((int)); /* Get stats at link termination */
void script_setenv __P((char *, char *, int)); /* set script env var */
void script_unsetenv __P((char *)); /* unset script env var */
#endif /* UNUSED */
void new_phase __P((int)); /* signal start of new phase */
//void new_phase __P((int)); /* signal start of new phase */
#if 0 /* UNUSED */
void add_notifier __P((struct notifier **, notify_func, void *));
void remove_notifier __P((struct notifier **, notify_func, void *));
void notify __P((struct notifier *, int));
#endif /* UNUSED */
int ppp_send_config __P((int, int, u_int32_t, int, int));
int ppp_recv_config __P((int, int, u_int32_t, int, int));
//void remove_pidfiles __P((void));

View File

@ -1437,3 +1437,12 @@ const char * protocol_name(int proto) {
return NULL;
}
#endif /* PPP_PROTOCOLNAME */
#if PPP_NOTIFY
/*
* new_phase - signal the start of a new phase of pppd's operation.
*/
void new_phase(int p) {
}
#endif /* PPP_NOTIFY */

View File

@ -135,9 +135,12 @@ int pppOverEthernetOpen(struct netif *ethif, const char *service_name, const cha
void pppInProcOverEthernet(int pd, struct pbuf *pb);
#if PPP_PROTOCOLNAME
const char * protocol_name(int proto);
#endif /* PPP_PROTOCOLNAME */
#if PPP_NOTIFY
void new_phase(int p);
#endif /* PPP_NOTIFY */
#endif /* PPPMY_H_ */