diff --git a/src/gtp_ppp.c b/src/gtp_ppp.c index cbf276b..dadeb0b 100644 --- a/src/gtp_ppp.c +++ b/src/gtp_ppp.c @@ -293,12 +293,14 @@ void sppp_increasing_timeout(const struct cp *cp, sppp_t *sp) { gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; + timer_thread_t *ppp_timer; int timo; timo = sp->lcp.max_configure - sp->rst_counter[cp->protoidx]; if (timo < 1) timo = 1; - timer_node_add(&pppoe->ppp_timer, &sp->ch[cp->protoidx], timo * sp->lcp.timeout); + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); + timer_node_add(ppp_timer, &sp->ch[cp->protoidx], timo * sp->lcp.timeout); } /* @@ -309,6 +311,7 @@ void sppp_cp_change_state(const struct cp *cp, sppp_t *sp, int newstate) { gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; + timer_thread_t *ppp_timer; if (debug & 8 && sp->state[cp->protoidx] != newstate) printf("%s: %s %s->%s\n", @@ -316,6 +319,7 @@ sppp_cp_change_state(const struct cp *cp, sppp_t *sp, int newstate) sppp_state_name(sp->state[cp->protoidx]), sppp_state_name(newstate)); sp->state[cp->protoidx] = newstate; + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); switch (newstate) { case STATE_INITIAL: @@ -323,7 +327,7 @@ sppp_cp_change_state(const struct cp *cp, sppp_t *sp, int newstate) case STATE_CLOSED: case STATE_STOPPED: case STATE_OPENED: - timer_node_del(&pppoe->ppp_timer, &sp->ch[cp->protoidx]); + timer_node_del(ppp_timer, &sp->ch[cp->protoidx]); break; case STATE_CLOSING: case STATE_STOPPING: @@ -2378,6 +2382,7 @@ sppp_pap_input(sppp_t *sp, pkt_t *pkt) gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; pkt_buffer_t *pbuff = pkt->pbuff; int len = pbuff->end - pbuff->data; + timer_thread_t *ppp_timer; lcp_hdr_t *h; uint8_t *name, *passwd, mlen; int name_len, passwd_len; @@ -2388,6 +2393,7 @@ sppp_pap_input(sppp_t *sp, pkt_t *pkt) return; } + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); h = (lcp_hdr_t *) pbuff->data; if (len > ntohs(h->len)) len = ntohs(h->len); @@ -2451,7 +2457,7 @@ sppp_pap_input(sppp_t *sp, pkt_t *pkt) /* ack and nak are his authproto */ case PAP_ACK: - timer_node_del(&pppoe->ppp_timer, &sp->pap_my_to_ch); + timer_node_del(ppp_timer, &sp->pap_my_to_ch); if (debug & 8) { PPPDEBUG(("%s: pap success", pppoe->ifname)); name_len = *((char *)h); @@ -2477,7 +2483,7 @@ sppp_pap_input(sppp_t *sp, pkt_t *pkt) break; case PAP_NAK: - timer_node_del(&pppoe->ppp_timer, &sp->pap_my_to_ch); + timer_node_del(ppp_timer, &sp->pap_my_to_ch); if (debug & 8) { PPPDEBUG(("%s: pap failure", pppoe->ifname)); name_len = *((char *)h); @@ -2519,6 +2525,7 @@ void sppp_pap_open(sppp_t *sp) { gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; + timer_thread_t *ppp_timer; if (sp->hisauth.proto == PPP_PAP && (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) != 0) { @@ -2529,7 +2536,8 @@ sppp_pap_open(sppp_t *sp) if (sp->myauth.proto == PPP_PAP) { /* we are peer, send a request, and start a timer */ pap.scr(sp); - timer_node_add(&pppoe->ppp_timer, &sp->pap_my_to_ch, sp->lcp.timeout); + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); + timer_node_add(ppp_timer, &sp->pap_my_to_ch, sp->lcp.timeout); } } @@ -2619,10 +2627,12 @@ void sppp_pap_tld(sppp_t *sp) { gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; + timer_thread_t *ppp_timer; PPPDEBUG(("%s: pap tld\n", pppoe->ifname)); - timer_node_del(&pppoe->ppp_timer, &sp->ch[IDX_PAP]); - timer_node_del(&pppoe->ppp_timer, &sp->pap_my_to_ch); + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); + timer_node_del(ppp_timer, &sp->ch[IDX_PAP]); + timer_node_del(ppp_timer, &sp->pap_my_to_ch); sp->lcp.protos &= ~(1 << IDX_PAP); lcp.Close(sp); @@ -2654,6 +2664,7 @@ sppp_keepalive(void *arg) { sppp_t *sp = arg; gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; + timer_thread_t *ppp_timer; timeval_t tv; /* Keepalive mode disabled */ @@ -2703,7 +2714,8 @@ sppp_keepalive(void *arg) } next_timer: - timer_node_add(&pppoe->ppp_timer, &sp->keepalive, pppoe->keepalive); + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); + timer_node_add(ppp_timer, &sp->keepalive, pppoe->keepalive); return 0; } @@ -2716,6 +2728,7 @@ sppp_up(spppoe_t *s) { gtp_pppoe_t *pppoe = s->pppoe; sppp_t *sp = s->s_ppp; + timer_thread_t *ppp_timer; /* LCP layer */ (sp->pp_up)(sp); @@ -2723,7 +2736,8 @@ sppp_up(spppoe_t *s) /* Register keepalive timer */ if (__test_bit(PPPOE_FL_KEEPALIVE_BIT, &pppoe->flags)) { sp->pp_flags |= PP_KEEPALIVE; - timer_node_add(&pppoe->ppp_timer, &sp->keepalive, pppoe->keepalive); + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); + timer_node_add(ppp_timer, &sp->keepalive, pppoe->keepalive); } return 0; } @@ -2733,19 +2747,22 @@ sppp_down(spppoe_t *s) { gtp_pppoe_t *pppoe = s->pppoe; sppp_t *sp = s->s_ppp; + timer_thread_t *ppp_timer; int i; + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); + /* LCP layer */ (sp->pp_down)(sp); for (i = 0; i < IDX_COUNT; i++) - timer_node_del(&pppoe->ppp_timer, &sp->ch[i]); - timer_node_del(&pppoe->ppp_timer, &sp->pap_my_to_ch); + timer_node_del(ppp_timer, &sp->ch[i]); + timer_node_del(ppp_timer, &sp->pap_my_to_ch); /* Release keepalive timer */ if (__test_bit(PPPOE_FL_KEEPALIVE_BIT, &pppoe->flags)) { sp->pp_flags &= ~PP_KEEPALIVE; - timer_node_del(&pppoe->ppp_timer, &sp->keepalive); + timer_node_del(ppp_timer, &sp->keepalive); } return 0; } @@ -2811,17 +2828,19 @@ void sppp_destroy(sppp_t *sp) { gtp_pppoe_t *pppoe = sp->s_pppoe->pppoe; + timer_thread_t *ppp_timer; int i; + ppp_timer = gtp_pppoe_get_ppp_timer(pppoe); sppp_ipcp_destroy(sp); sppp_ipv6cp_destroy(sp); /* Stop keepalive handler. */ - timer_node_del(&pppoe->ppp_timer, &sp->keepalive); + timer_node_del(ppp_timer, &sp->keepalive); for (i = 0; i < IDX_COUNT; i++) - timer_node_del(&pppoe->ppp_timer, &sp->ch[i]); - timer_node_del(&pppoe->ppp_timer, &sp->pap_my_to_ch); + timer_node_del(ppp_timer, &sp->ch[i]); + timer_node_del(ppp_timer, &sp->pap_my_to_ch); /* release authentication data */ if (sp->hisauth.name != NULL) @@ -2869,7 +2888,5 @@ int gtp_ppp_destroy(gtp_pppoe_t *pppoe) { gtp_ppp_timer_destroy(pppoe); - - return 0; } diff --git a/src/gtp_pppoe.c b/src/gtp_pppoe.c index c080e45..6951eff 100644 --- a/src/gtp_pppoe.c +++ b/src/gtp_pppoe.c @@ -46,6 +46,46 @@ pthread_mutex_t gtp_pppoe_mutex = PTHREAD_MUTEX_INITIALIZER; /* * PPPoE utilities */ +gtp_htab_t * +gtp_pppoe_get_session_tab(gtp_pppoe_t *pppoe) +{ + if (!pppoe->bundle || __test_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags)) + return &pppoe->session_tab; + + /* Secondary instance in bundle to primary tracking */ + return &pppoe->bundle->pppoe[0]->session_tab; +} + +gtp_htab_t * +gtp_pppoe_get_unique_tab(gtp_pppoe_t *pppoe) +{ + if (!pppoe->bundle || __test_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags)) + return &pppoe->unique_tab; + + /* Secondary instance in bundle to primary tracking */ + return &pppoe->bundle->pppoe[0]->unique_tab; +} + +timer_thread_t * +gtp_pppoe_get_session_timer(gtp_pppoe_t *pppoe) +{ + if (!pppoe->bundle || __test_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags)) + return &pppoe->session_timer; + + /* Secondary instance in bundle to primary tracking */ + return &pppoe->bundle->pppoe[0]->session_timer; +} + +timer_thread_t * +gtp_pppoe_get_ppp_timer(gtp_pppoe_t *pppoe) +{ + if (!pppoe->bundle || __test_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags)) + return &pppoe->ppp_timer; + + /* Secondary instance in bundle refer to primary tracking */ + return &pppoe->bundle->pppoe[0]->ppp_timer; +} + gtp_pppoe_t * gtp_pppoe_get_by_name(const char *name) { @@ -347,11 +387,6 @@ gtp_pppoe_worker_task(void *arg) goto shoot_again; } - if (!__test_bit(PPPOE_FL_SERVICE_BIT, &pppoe->flags)) { - mpkt_reset(&w->mpkt); - goto shoot_again; - } - /* mpkt processing */ mpkt_process(&w->mpkt, ret, gtp_pppoe_ingress, w); mpkt_reset(&w->mpkt); @@ -575,8 +610,6 @@ gtp_pppoe_bundle_init(const char *name) } strlcpy(bundle->name, name, GTP_NAME_MAX_LEN); INIT_LIST_HEAD(&bundle->next); - gtp_htab_init(&bundle->session_tab, CONN_HASHTAB_SIZE); - gtp_htab_init(&bundle->unique_tab, CONN_HASHTAB_SIZE); bundle->pppoe = MALLOC(sizeof(gtp_pppoe_t) * PPPOE_BUNDLE_MAXSIZE); gtp_pppoe_bundle_add(bundle); @@ -590,24 +623,20 @@ gtp_pppoe_bundle_get_active_instance(gtp_pppoe_bundle_t *bundle) gtp_pppoe_t *pppoe; int i; - /* try match active !fault instance */ + /* try match primary !fault instance */ for (i = 0; i < PPPOE_BUNDLE_MAXSIZE && bundle->pppoe[i]; i++) { pppoe = bundle->pppoe[i]; - if (__test_bit(PPPOE_FL_MASTER_BIT, &pppoe->flags) && + if (__test_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags) && !__test_bit(PPPOE_FL_FAULT_BIT, &pppoe->flags)) { - if (!__test_and_set_bit(PPPOE_FL_SERVICE_BIT, &pppoe->flags)) - log_message(LOG_INFO, "PPPoE:%s now serving", pppoe->name); return pppoe; } } - /* No match, fallback to the first standby !fault instance */ + /* No match, fallback to the first secondary !fault instance */ for (i = 0; i < PPPOE_BUNDLE_MAXSIZE && bundle->pppoe[i]; i++) { pppoe = bundle->pppoe[i]; - if (__test_bit(PPPOE_FL_BACKUP_BIT, &pppoe->flags) && + if (__test_bit(PPPOE_FL_SECONDARY_BIT, &pppoe->flags) && !__test_bit(PPPOE_FL_FAULT_BIT, &pppoe->flags)) { - if (!__test_and_set_bit(PPPOE_FL_SERVICE_BIT, &pppoe->flags)) - log_message(LOG_INFO, "PPPoE:%s now serving", pppoe->name); return pppoe; } } @@ -619,9 +648,6 @@ int __gtp_pppoe_bundle_release(gtp_pppoe_bundle_t *bundle) { list_head_del(&bundle->next); - spppoe_sessions_destroy(&bundle->session_tab); - gtp_htab_destroy(&bundle->session_tab); - gtp_htab_destroy(&bundle->unique_tab); FREE(bundle->pppoe); return 0; } diff --git a/src/gtp_pppoe_proto.c b/src/gtp_pppoe_proto.c index 9e57fb8..2538955 100644 --- a/src/gtp_pppoe_proto.c +++ b/src/gtp_pppoe_proto.c @@ -303,6 +303,7 @@ int pppoe_connect(spppoe_t *s) { gtp_pppoe_t *pppoe = s->pppoe; + timer_thread_t *session_timer; int err, retry_wait = 2; if (s->state != PPPOE_STATE_INITIAL) @@ -320,7 +321,8 @@ pppoe_connect(spppoe_t *s) /* register timer */ if (!__test_bit(PPPOE_FL_PADI_FAST_RETRY_BIT, &pppoe->flags)) retry_wait = PPPOE_DISC_TIMEOUT; - timer_node_add(&pppoe->session_timer, &s->t_node, retry_wait); + session_timer = gtp_pppoe_get_session_timer(pppoe); + timer_node_add(session_timer, &s->t_node, retry_wait); return 0; } @@ -361,10 +363,13 @@ pppoe_timeout(void *arg) { spppoe_t *s = (spppoe_t *) arg; gtp_pppoe_t *pppoe = s->pppoe; + timer_thread_t *session_timer; int retry_wait = 2; PPPDEBUG(("%s: pppoe hunique:0x%.8x\n", pppoe->ifname, s->unique)); + session_timer = gtp_pppoe_get_session_timer(pppoe); + switch (s->state) { case PPPOE_STATE_PADI_SENT: if (++s->padi_retried >= PPPOE_DISC_MAXPADI) { @@ -379,7 +384,7 @@ pppoe_timeout(void *arg) } if (!__test_bit(PPPOE_FL_PADI_FAST_RETRY_BIT, &pppoe->flags)) retry_wait = PPPOE_DISC_TIMEOUT * (1 + s->padi_retried); - timer_node_add(&pppoe->session_timer , &s->t_node, retry_wait); + timer_node_add(session_timer , &s->t_node, retry_wait); break; case PPPOE_STATE_PADR_SENT: @@ -392,7 +397,7 @@ pppoe_timeout(void *arg) } if (!__test_bit(PPPOE_FL_PADI_FAST_RETRY_BIT, &pppoe->flags)) retry_wait = PPPOE_DISC_TIMEOUT * (1 + s->padi_retried); - timer_node_add(&pppoe->session_timer , &s->t_node, retry_wait); + timer_node_add(session_timer , &s->t_node, retry_wait); break; } @@ -403,7 +408,7 @@ pppoe_timeout(void *arg) } if (!__test_bit(PPPOE_FL_PADI_FAST_RETRY_BIT, &pppoe->flags)) retry_wait = PPPOE_DISC_TIMEOUT * (1 + s->padi_retried); - timer_node_add(&pppoe->session_timer , &s->t_node, retry_wait); + timer_node_add(session_timer , &s->t_node, retry_wait); break; case PPPOE_STATE_CLOSING: @@ -474,12 +479,17 @@ pppoe_dispatch_disc_pkt(gtp_pppoe_t *pppoe, pkt_t *pkt) uint32_t *hunique; uint8_t code = 0; uint8_t tmp[PPPOE_BUFSIZE]; + gtp_htab_t *session_tab, *unique_tab; + timer_thread_t *session_timer; int retry_wait = 2; ret = pppoe_sanitize_pkt(pppoe, pkt, &off, &session, &plen, &code); if (ret < 0) return; eh = (struct ether_header *) pkt->pbuff->head; + session_tab = gtp_pppoe_get_session_tab(pppoe); + unique_tab = gtp_pppoe_get_unique_tab(pppoe); + session_timer = gtp_pppoe_get_session_timer(pppoe); while (off + sizeof(*pt) <= pkt_buffer_len(pkt->pbuff)) { pt = (pppoe_tag_t *) (pkt->pbuff->head + off); @@ -513,9 +523,7 @@ pppoe_dispatch_disc_pkt(gtp_pppoe_t *pppoe, pkt_t *pkt) } hunique = (uint32_t *) (pkt->pbuff->head + off); - s = spppoe_get_by_unique((pppoe->bundle) ? &pppoe->bundle->unique_tab : - &pppoe->unique_tab, - ntohl(*hunique)); + s = spppoe_get_by_unique(unique_tab, ntohl(*hunique)); break; case PPPOE_TAG_ACCOOKIE: if (ac_cookie == NULL) { @@ -619,17 +627,15 @@ pppoe_dispatch_disc_pkt(gtp_pppoe_t *pppoe, pkt_t *pkt) } if (!__test_bit(PPPOE_FL_PADI_FAST_RETRY_BIT, &pppoe->flags)) retry_wait = PPPOE_DISC_TIMEOUT * (1 + s->padr_retried); - timer_node_add(&pppoe->session_timer, &s->t_node, retry_wait); + timer_node_add(session_timer, &s->t_node, retry_wait); break; case PPPOE_CODE_PADS: if (s == NULL) return; s->session_id = session; - spppoe_session_hash((pppoe->bundle) ? &pppoe->bundle->session_tab : - &pppoe->session_tab, - s, &s->hw_src, s->session_id); - timer_node_del(&pppoe->session_timer, &s->t_node); + spppoe_session_hash(session_tab, s, &s->hw_src, s->session_id); + timer_node_del(session_timer, &s->t_node); PPPDEBUG(("%s: pppoe hunique:0x%.8x session:0x%.4x connected\n", pppoe->ifname, s->unique, session)); s->state = PPPOE_STATE_SESSION; @@ -643,15 +649,14 @@ pppoe_dispatch_disc_pkt(gtp_pppoe_t *pppoe, pkt_t *pkt) /* Some AC implementation doesnt tag PADT with Host-Uniq... * At least that's the way it is with Cisco implementation. * So try to find PPPoE session by session-id */ - s = spppoe_get_by_session((pppoe->bundle) ? &pppoe->bundle->session_tab : - &pppoe->session_tab, + s = spppoe_get_by_session(session_tab, (struct ether_addr *) eh->ether_dhost, session); if (s == NULL) return; } /* stop timer (we might be about to transmit a PADT ourself) */ - timer_node_del(&pppoe->session_timer, &s->t_node); + timer_node_del(session_timer, &s->t_node); PPPDEBUG(("%s: pppoe hunique:0x%.8x session:0x%.4x terminated, received PADT\n", pppoe->ifname, s->unique, session)); sppp_down(s); @@ -672,15 +677,15 @@ pppoe_dispatch_session_pkt(gtp_pppoe_t *pppoe, pkt_t *pkt) int off = 0, ret; uint16_t session = 0, plen = 0; uint8_t code = 0; + gtp_htab_t *session_tab; ret = pppoe_sanitize_pkt(pppoe, pkt, &off, &session, &plen, &code); if (ret < 0) return; eh = (struct ether_header *) pkt->pbuff->head; - sp = spppoe_get_by_session((pppoe->bundle) ? &pppoe->bundle->session_tab : - &pppoe->session_tab, - (struct ether_addr *) eh->ether_dhost, session); + session_tab = gtp_pppoe_get_session_tab(pppoe); + sp = spppoe_get_by_session(session_tab, (struct ether_addr *) eh->ether_dhost, session); if (!sp) { log_message(LOG_INFO, "%s(): %s: unknown pppoe session for " "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x session = 0x%.4x" diff --git a/src/gtp_pppoe_session.c b/src/gtp_pppoe_session.c index bd4fd52..e0c5790 100644 --- a/src/gtp_pppoe_session.c +++ b/src/gtp_pppoe_session.c @@ -315,11 +315,14 @@ static int spppoe_release(spppoe_t *s) { gtp_pppoe_t *pppoe = s->pppoe; + gtp_htab_t *session_tab, *unique_tab; + + session_tab = gtp_pppoe_get_session_tab(pppoe); + spppoe_session_unhash(session_tab, s); + + unique_tab = gtp_pppoe_get_unique_tab(pppoe); + spppoe_unique_unhash(unique_tab, s); - spppoe_unique_unhash((pppoe->bundle) ? &pppoe->bundle->unique_tab : - &pppoe->unique_tab, s); - spppoe_session_unhash((pppoe->bundle) ? &pppoe->bundle->session_tab : - &pppoe->session_tab, s); spppoe_free(s); return 0; } @@ -354,6 +357,7 @@ spppoe_init(gtp_pppoe_t *pppoe, gtp_conn_t *c, gtp_id_ecgi_t *ecgi, gtp_ie_ambr_t *ambr) { spppoe_t *s; + gtp_htab_t *unique_tab; int err, id; if (!pppoe) @@ -397,9 +401,8 @@ spppoe_init(gtp_pppoe_t *pppoe, gtp_conn_t *c, s->s_ppp = sppp_init(s, pp_tls, pp_tlf, pp_con, pp_chg); timer_node_init(&s->t_node, NULL, s); - spppoe_unique_hash((pppoe->bundle) ? &pppoe->bundle->unique_tab : - &pppoe->unique_tab, - s, imsi, &pppoe->seed); + unique_tab = gtp_pppoe_get_unique_tab(pppoe); + spppoe_unique_hash(unique_tab, s, imsi, &pppoe->seed); spppoe_add(c, s); err = pppoe_connect(s); diff --git a/src/gtp_pppoe_vty.c b/src/gtp_pppoe_vty.c index feaa50d..93335e4 100644 --- a/src/gtp_pppoe_vty.c +++ b/src/gtp_pppoe_vty.c @@ -151,8 +151,6 @@ DEFUN(pppoe_interface, return CMD_WARNING; } - __set_bit(PPPOE_FL_MASTER_BIT, &pppoe->flags); - __set_bit(PPPOE_FL_SERVICE_BIT, &pppoe->flags); return CMD_SUCCESS; } @@ -520,15 +518,20 @@ gtp_pppoe_bundle_instance_prepare(vty_t *vty, gtp_pppoe_bundle_t *bundle, int ar return NULL; } - __clear_bit(PPPOE_FL_SERVICE_BIT, &pppoe->flags); + /* First PPPoE instance in bundle is primary, followings are secondary */ + if (!bundle->instance_idx) + __set_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags); + else + __set_bit(PPPOE_FL_SECONDARY_BIT, &pppoe->flags); + bundle->pppoe[bundle->instance_idx++] = pppoe; pppoe->bundle = bundle; return pppoe; } -DEFUN(pppoe_bundle_instance_master, - pppoe_bundle_instance_master_cmd, - "instance STRING master", +DEFUN(pppoe_bundle_instance, + pppoe_bundle_instance_cmd, + "instance STRING", "PPPoE Instance\n" "Name\n") { @@ -539,29 +542,12 @@ DEFUN(pppoe_bundle_instance_master, if (!pppoe) return CMD_WARNING; - log_message(LOG_INFO, "PPPoE:%s is master", pppoe->name); - __set_bit(PPPOE_FL_MASTER_BIT, &pppoe->flags); + log_message(LOG_INFO, "PPPoE:%s is %s" + , pppoe->name + , __test_bit(PPPOE_FL_PRIMARY_BIT, &pppoe->flags) ? "primary" : "secondary"); return CMD_SUCCESS; } -DEFUN(pppoe_bundle_instance_basckup, - pppoe_bundle_instance_backup_cmd, - "instance STRING backup", - "PPPoE Instance\n" - "Name\n") -{ - gtp_pppoe_bundle_t *bundle = vty->index; - gtp_pppoe_t *pppoe; - - pppoe = gtp_pppoe_bundle_instance_prepare(vty, bundle, argc, argv); - if (!pppoe) - return CMD_WARNING; - - log_message(LOG_INFO, "PPPoE:%s is backup", pppoe->name); - __clear_bit(PPPOE_FL_MASTER_BIT, &pppoe->flags); - __set_bit(PPPOE_FL_BACKUP_BIT, &pppoe->flags); - return CMD_SUCCESS; -} /* * Show commands @@ -713,9 +699,8 @@ gtp_config_pppoe_bundle_write(vty_t *vty) vty_out(vty, "pppoe-bundle %s%s", bundle->name, VTY_NEWLINE); for (i = 0; i < PPPOE_BUNDLE_MAXSIZE && bundle->pppoe[i]; i++) { pppoe = bundle->pppoe[i]; - vty_out(vty, " instance %s %s%s" + vty_out(vty, " instance %s%s" , pppoe->name - , __test_bit(PPPOE_FL_MASTER_BIT, &pppoe->flags) ? "master" : "backup" , VTY_NEWLINE); } vty_out(vty, "!%s", VTY_NEWLINE); @@ -760,8 +745,7 @@ gtp_pppoe_vty_init(void) install_element(CONFIG_NODE, &pppoe_bundle_cmd); install_element(CONFIG_NODE, &no_pppoe_bundle_cmd); - install_element(PPPOE_BUNDLE_NODE, &pppoe_bundle_instance_master_cmd); - install_element(PPPOE_BUNDLE_NODE, &pppoe_bundle_instance_backup_cmd); + install_element(PPPOE_BUNDLE_NODE, &pppoe_bundle_instance_cmd); /* Install show commands. */ install_element(VIEW_NODE, &show_pppoe_cmd); diff --git a/src/gtp_router_hdl.c b/src/gtp_router_hdl.c index cb4de16..a765bd8 100644 --- a/src/gtp_router_hdl.c +++ b/src/gtp_router_hdl.c @@ -1054,7 +1054,7 @@ gtpc_create_session_request_hdl(gtp_server_worker_t *w, struct sockaddr_storage else pppoe = gtp_pppoe_bundle_get_active_instance(apn->vrf->pppoe_bundle); - if (!pppoe || (pppoe && !__test_bit(PPPOE_FL_MASTER_BIT, &pppoe->flags))) { + if (!pppoe) { log_message(LOG_INFO, "No active PPPoE Instance available to handle request"); rc = gtpc_build_errmsg(w->pbuff, teid , GTP_CREATE_SESSION_RESPONSE_TYPE diff --git a/src/include/gtp_pppoe.h b/src/include/gtp_pppoe.h index 689266b..59032ad 100644 --- a/src/include/gtp_pppoe.h +++ b/src/include/gtp_pppoe.h @@ -115,10 +115,9 @@ typedef struct _pppoe_vendor_tag { enum pppoe_flags { PPPOE_FL_STOPPING_BIT, PPPOE_FL_RUNNING_BIT, - PPPOE_FL_MASTER_BIT, - PPPOE_FL_BACKUP_BIT, + PPPOE_FL_PRIMARY_BIT, + PPPOE_FL_SECONDARY_BIT, PPPOE_FL_FAULT_BIT, - PPPOE_FL_SERVICE_BIT, PPPOE_FL_GTP_USERNAME_TEMPLATE_0_BIT, PPPOE_FL_GTP_USERNAME_TEMPLATE_1_BIT, PPPOE_FL_VENDOR_SPECIFIC_BBF_BIT, @@ -162,14 +161,9 @@ typedef struct _gtp_pppoe_worker { typedef struct _gtp_pppoe_bundle { char name[GTP_NAME_MAX_LEN]; - gtp_htab_t session_tab; /* Session Tracking by sesion-id */ - gtp_htab_t unique_tab; /* Session Tracking by unique */ - struct _gtp_pppoe **pppoe; int instance_idx; list_head_t next; - - unsigned long flags; } gtp_pppoe_bundle_t; typedef struct _gtp_pppoe { @@ -209,6 +203,10 @@ typedef struct _gtp_pppoe { } gtp_pppoe_t; /* Prototypes */ +extern gtp_htab_t *gtp_pppoe_get_session_tab(gtp_pppoe_t *); +extern gtp_htab_t *gtp_pppoe_get_unique_tab(gtp_pppoe_t *); +extern timer_thread_t *gtp_pppoe_get_session_timer(gtp_pppoe_t *); +extern timer_thread_t *gtp_pppoe_get_ppp_timer(gtp_pppoe_t *); extern gtp_pppoe_t *gtp_pppoe_get_by_name(const char *); extern int gtp_pppoe_disc_send(gtp_pppoe_t *, pkt_t *); extern int gtp_pppoe_ses_send(gtp_pppoe_t *, pkt_t *);