summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKozlov Dmitry <xeb@mail.ru>2012-05-31 15:07:03 +0400
committerKozlov Dmitry <xeb@mail.ru>2012-05-31 15:07:03 +0400
commit57ae63fe326122dda596a9957526fbc82fad49e8 (patch)
treedfe58897c31616f4e01b4cb0c670ab27c3fc38ea
parentd99e69fca1f6c442472eb596ef197c63879e5c97 (diff)
downloadaccel-ppp-57ae63fe326122dda596a9957526fbc82fad49e8.tar.gz
accel-ppp-57ae63fe326122dda596a9957526fbc82fad49e8.zip
ppp: if signle-session=replace down first session's interface before second comes up (should fix unexpected ospf routes deletion)
-rw-r--r--accel-pppd/ppp/ppp_auth.c49
1 files changed, 22 insertions, 27 deletions
diff --git a/accel-pppd/ppp/ppp_auth.c b/accel-pppd/ppp/ppp_auth.c
index 1fb3bcf..f78b652 100644
--- a/accel-pppd/ppp/ppp_auth.c
+++ b/accel-pppd/ppp/ppp_auth.c
@@ -337,44 +337,39 @@ static void __ppp_auth_started(struct ppp_t *ppp)
triton_event_fire(EV_PPP_AUTHORIZED, ppp);
}
-static void delete_route(struct ppp_t *ppp)
+static void ifdown(struct ppp_t *ppp)
{
- struct rtentry rt;
- struct sockaddr_in *addr;
-
- if (ppp->ipv4) {
- memset(&rt, 0, sizeof(rt));
- addr = (struct sockaddr_in *)&rt.rt_dst;
- addr->sin_family = AF_INET;
- addr->sin_addr.s_addr = ppp->ipv4->peer_addr;
- rt.rt_flags = RTF_HOST;
- rt.rt_metric = 1;
-
- ioctl(sock_fd, SIOCDELRT, &rt);
- }
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strcpy(ifr.ifr_name, ppp->ifname);
+
+ ioctl(sock_fd, SIOCSIFFLAGS, &ifr);
}
int __export ppp_auth_successed(struct ppp_t *ppp, char *username)
{
struct ppp_t *p;
struct auth_layer_data_t *ad = container_of(ppp_find_layer_data(ppp, &auth_layer), typeof(*ad), ld);
-
- pthread_rwlock_rdlock(&ppp_lock);
- list_for_each_entry(p, &ppp_list, entry) {
- if (p->username && !strcmp(p->username, username)) {
- if (conf_single_session == 0) {
- pthread_rwlock_unlock(&ppp_lock);
- log_ppp_info1("%s: second session denied\n", username);
- return -1;
- } else {
- if (conf_single_session == 1) {
- delete_route(p);
- triton_context_call(p->ctrl->ctx, (triton_event_func)ppp_terminate_sec, p);
+
+ if (conf_single_session >= 0) {
+ pthread_rwlock_rdlock(&ppp_lock);
+ list_for_each_entry(p, &ppp_list, entry) {
+ if (p->username && !strcmp(p->username, username)) {
+ if (conf_single_session == 0) {
+ pthread_rwlock_unlock(&ppp_lock);
+ log_ppp_info1("%s: second session denied\n", username);
+ return -1;
+ } else {
+ if (conf_single_session == 1) {
+ ifdown(p);
+ triton_context_call(p->ctrl->ctx, (triton_event_func)ppp_terminate_sec, p);
+ }
}
}
}
+ pthread_rwlock_unlock(&ppp_lock);
}
- pthread_rwlock_unlock(&ppp_lock);
pthread_rwlock_wrlock(&ppp_lock);
ppp->username = username;