VOS_VOID link_Init(struct link *l) { l->phase = PHASE_DEAD; l->type = PHYSICAL_LINK; l->name = VOS_NULL; l->len = sizeof(*l); /* The sample period is fixed - see physical2iov() & iov2physical() */ throughput_init(&l->stats.total, SAMPLE_PERIOD); #if 0/*fanzhibin f49086 delete it*/ p->link.stats.parent = dl->bundle->ncp.mp.active ? &dl->bundle->ncp.mp.link.stats.total : VOS_NULL_PTR; #endif l->stats.gather = 1; l->DropedPacketFromGgsn = 0; PS_MEM_SET(l->Queue, '\0', sizeof l->Queue); PS_MEM_SET(l->proto_in, '\0', sizeof l->proto_in); PS_MEM_SET(l->proto_out, '\0', sizeof l->proto_out); link_EmptyStack(l); /*依次压入PPP协议的各个处理层*/ #if (PPP_FEATURE == PPP_FEATURE_PPP) link_Stack(l, &asynclayer); link_Stack(l, &hdlclayer); link_Stack(l, &acflayer); #endif link_Stack(l, &protolayer); async_Init(&(l->async)); hdlc_Init(&(l->hdlc),&(l->lcp)); /*参数const struct fsm_parent * parent不能为空*/ lcp_Init(&(l->lcp), l, &parent); ipcp_Init(&(l->ipcp), l, &parent); pap_Init(&(l->pap)); chap_Init(&(l->chap)); }
struct datalink * datalink_Create(const char *name, struct bundle *bundle, int type) { struct datalink *dl; dl = (struct datalink *)malloc(sizeof(struct datalink)); if (dl == NULL) return dl; dl->desc.type = DATALINK_DESCRIPTOR; dl->desc.UpdateSet = datalink_UpdateSet; dl->desc.IsSet = datalink_IsSet; dl->desc.Read = datalink_Read; dl->desc.Write = datalink_Write; dl->state = DATALINK_CLOSED; *dl->cfg.script.dial = '\0'; *dl->cfg.script.login = '******'; *dl->cfg.script.logout = '\0'; *dl->cfg.script.hangup = '\0'; *dl->cfg.phone.list = '\0'; *dl->phone.list = '\0'; dl->phone.next = NULL; dl->phone.alt = NULL; dl->phone.chosen = "N/A"; dl->stayonline = 0; dl->script.run = 1; dl->script.packetmode = 1; mp_linkInit(&dl->mp); dl->bundle = bundle; dl->next = NULL; memset(&dl->dial.timer, '\0', sizeof dl->dial.timer); dl->dial.tries = 0; dl->cfg.dial.max = 1; dl->cfg.dial.next_timeout = DIAL_NEXT_TIMEOUT; dl->cfg.dial.timeout = DIAL_TIMEOUT; dl->cfg.dial.inc = 0; dl->cfg.dial.maxinc = 10; dl->reconnect_tries = 0; dl->cfg.reconnect.max = 0; dl->cfg.reconnect.timeout = RECONNECT_TIMEOUT; dl->cfg.callback.opmask = 0; dl->cfg.cbcp.delay = 0; *dl->cfg.cbcp.phone = '\0'; dl->cfg.cbcp.fsmretry = DEF_FSMRETRY; dl->name = strdup(name); peerid_Init(&dl->peer); dl->parent = &bundle->fsm; dl->fsmp.LayerStart = datalink_LayerStart; dl->fsmp.LayerUp = datalink_LayerUp; dl->fsmp.LayerDown = datalink_LayerDown; dl->fsmp.LayerFinish = datalink_LayerFinish; dl->fsmp.object = dl; if ((dl->physical = physical_Create(dl, type)) == NULL) { free(dl->name); free(dl); return NULL; } pap_Init(&dl->pap, dl->physical); chap_Init(&dl->chap, dl->physical); cbcp_Init(&dl->cbcp, dl->physical); memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */ chat_Init(&dl->chat, dl->physical); log_Printf(LogPHASE, "%s: Created in %s state\n", dl->name, datalink_State(dl)); return dl; }
struct datalink * datalink_Clone(struct datalink *odl, const char *name) { struct datalink *dl; dl = (struct datalink *)malloc(sizeof(struct datalink)); if (dl == NULL) return dl; dl->desc.type = DATALINK_DESCRIPTOR; dl->desc.UpdateSet = datalink_UpdateSet; dl->desc.IsSet = datalink_IsSet; dl->desc.Read = datalink_Read; dl->desc.Write = datalink_Write; dl->state = DATALINK_CLOSED; memcpy(&dl->cfg, &odl->cfg, sizeof dl->cfg); mp_linkInit(&dl->mp); *dl->phone.list = '\0'; dl->phone.next = NULL; dl->phone.alt = NULL; dl->phone.chosen = "N/A"; dl->bundle = odl->bundle; dl->next = NULL; memset(&dl->dial.timer, '\0', sizeof dl->dial.timer); dl->dial.tries = 0; dl->reconnect_tries = 0; dl->name = strdup(name); peerid_Init(&dl->peer); dl->parent = odl->parent; memcpy(&dl->fsmp, &odl->fsmp, sizeof dl->fsmp); dl->fsmp.object = dl; if ((dl->physical = physical_Create(dl, PHYS_INTERACTIVE)) == NULL) { free(dl->name); free(dl); return NULL; } pap_Init(&dl->pap, dl->physical); dl->pap.cfg = odl->pap.cfg; chap_Init(&dl->chap, dl->physical); dl->chap.auth.cfg = odl->chap.auth.cfg; memcpy(&dl->physical->cfg, &odl->physical->cfg, sizeof dl->physical->cfg); memcpy(&dl->physical->link.lcp.cfg, &odl->physical->link.lcp.cfg, sizeof dl->physical->link.lcp.cfg); memcpy(&dl->physical->link.ccp.cfg, &odl->physical->link.ccp.cfg, sizeof dl->physical->link.ccp.cfg); memcpy(&dl->physical->async.cfg, &odl->physical->async.cfg, sizeof dl->physical->async.cfg); cbcp_Init(&dl->cbcp, dl->physical); memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */ chat_Init(&dl->chat, dl->physical); log_Printf(LogPHASE, "%s: Cloned in %s state\n", dl->name, datalink_State(dl)); return dl; }
struct datalink * iov2datalink(struct bundle *bundle, struct iovec *iov, int *niov, int maxiov, int fd, int *auxfd, int *nauxfd) { struct datalink *dl, *cdl; struct fsm_retry copy; char *oname; dl = (struct datalink *)iov[(*niov)++].iov_base; dl->name = iov[*niov].iov_base; if (dl->name[DATALINK_MAXNAME-1]) { dl->name[DATALINK_MAXNAME-1] = '\0'; if (strlen(dl->name) == DATALINK_MAXNAME - 1) log_Printf(LogWARN, "Datalink name truncated to \"%s\"\n", dl->name); } /* Make sure the name is unique ! */ oname = NULL; do { for (cdl = bundle->links; cdl; cdl = cdl->next) if (!strcasecmp(dl->name, cdl->name)) { if (oname) free(datalink_NextName(dl)); else oname = datalink_NextName(dl); break; /* Keep renaming 'till we have no conflicts */ } } while (cdl); if (oname) { log_Printf(LogPHASE, "Rename link %s to %s\n", oname, dl->name); free(oname); } else { dl->name = strdup(dl->name); free(iov[*niov].iov_base); } (*niov)++; dl->desc.type = DATALINK_DESCRIPTOR; dl->desc.UpdateSet = datalink_UpdateSet; dl->desc.IsSet = datalink_IsSet; dl->desc.Read = datalink_Read; dl->desc.Write = datalink_Write; mp_linkInit(&dl->mp); *dl->phone.list = '\0'; dl->phone.next = NULL; dl->phone.alt = NULL; dl->phone.chosen = "N/A"; dl->bundle = bundle; dl->next = NULL; memset(&dl->dial.timer, '\0', sizeof dl->dial.timer); dl->dial.tries = 0; dl->reconnect_tries = 0; dl->parent = &bundle->fsm; dl->fsmp.LayerStart = datalink_LayerStart; dl->fsmp.LayerUp = datalink_LayerUp; dl->fsmp.LayerDown = datalink_LayerDown; dl->fsmp.LayerFinish = datalink_LayerFinish; dl->fsmp.object = dl; dl->physical = iov2physical(dl, iov, niov, maxiov, fd, auxfd, nauxfd); if (!dl->physical) { free(dl->name); free(dl); dl = NULL; } else { copy = dl->pap.cfg.fsm; pap_Init(&dl->pap, dl->physical); dl->pap.cfg.fsm = copy; copy = dl->chap.auth.cfg.fsm; chap_Init(&dl->chap, dl->physical); dl->chap.auth.cfg.fsm = copy; cbcp_Init(&dl->cbcp, dl->physical); memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */ chat_Init(&dl->chat, dl->physical); log_Printf(LogPHASE, "%s: Transferred in %s state\n", dl->name, datalink_State(dl)); } return dl; }