Diff for /embedaddon/mpd/src/pptp_ctrl.c between versions 1.1 and 1.1.1.3

version 1.1, 2012/02/21 23:32:47 version 1.1.1.3, 2021/03/17 00:39:23
Line 63 Line 63
   #define PPTP_FIND_CHAN_PNS_CID        3       /* match field vs. PNS cid */    #define PPTP_FIND_CHAN_PNS_CID        3       /* match field vs. PNS cid */
   #define PPTP_FIND_CHAN_PAC_CID        4       /* match field vs. PAC cid */    #define PPTP_FIND_CHAN_PAC_CID        4       /* match field vs. PAC cid */
   
   /* Total info about a message type (except field layout) */  
   struct pptpmsginfo {  
     const char          *name;          /* name for this message type */  
     void                (*handler)();   /* message handler function */  
     u_char              isReply;        /* this is always a reply message */  
     u_char              length;         /* length of message (sans header) */  
     u_short             states;         /* states which admit this message */  
     struct pptpchanid   match;          /* how to find corresponding channel */  
     struct pptpreqrep   reqrep;         /* what kind of reply we expect */  
   };  
   typedef const struct pptpmsginfo      *PptpMsgInfo;  
   
   /* Receive window size XXX */    /* Receive window size XXX */
   #define PPTP_RECV_WIN                 16    #define PPTP_RECV_WIN                 16
Line 135 Line 124
     char                peer_name[MAXHOSTNAMELEN]; /* remote hostname */      char                peer_name[MAXHOSTNAMELEN]; /* remote hostname */
   };    };
   typedef struct pptpctrl       *PptpCtrl;    typedef struct pptpctrl       *PptpCtrl;
     typedef void (*PptpHandler)(PptpCtrl, void *);
   
     /* Total info about a message type (except field layout) */
     struct pptpmsginfo {
       const char          *name;          /* name for this message type */
       PptpHandler         handler;        /* message handler function */
       u_char              isReply;        /* this is always a reply message */
       u_char              length;         /* length of message (sans header) */
       u_short             states;         /* states which admit this message */
       struct pptpchanid   match;          /* how to find corresponding channel */
       struct pptpreqrep   reqrep;         /* what kind of reply we expect */
     };
     typedef const struct pptpmsginfo      *PptpMsgInfo;
   
   struct pptplis {    struct pptplis {
     struct u_addr       self_addr;      /* local IP address */      struct u_addr       self_addr;      /* local IP address */
     in_port_t           self_port;      in_port_t           self_port;
Line 149 Line 151
   /* Our physical channel ID */    /* Our physical channel ID */
   #define PHYS_CHAN(ch)         (((ch)->ctrl->id << 16) | (ch)->id)    #define PHYS_CHAN(ch)         (((ch)->ctrl->id << 16) | (ch)->id)
   
  int   PptpsStat(Context ctx, int ac, char *av[], void *arg);  int   PptpsStat(Context ctx, int ac, const char *const av[], const void *arg);
   
 /*  /*
  * INTERNAL FUNCTIONS   * INTERNAL FUNCTIONS
Line 303 Line 305
   static const struct pptpmsginfo       gPptpMsgInfo[PPTP_MAX_CTRL_TYPE] = {    static const struct pptpmsginfo       gPptpMsgInfo[PPTP_MAX_CTRL_TYPE] = {
     { "PptpMsgHead", NULL,                      /* placeholder */      { "PptpMsgHead", NULL,                      /* placeholder */
       FALSE, sizeof(struct pptpMsgHead),        FALSE, sizeof(struct pptpMsgHead),
         0, { 0, 0, NULL, NULL }, { 0, 0, 0 },
     },      },
    { "StartCtrlConnRequest", PptpStartCtrlConnRequest,    { "StartCtrlConnRequest", (PptpHandler) PptpStartCtrlConnRequest,
       FALSE, sizeof(struct pptpStartCtrlConnRequest),        FALSE, sizeof(struct pptpStartCtrlConnRequest),
       CL(IDLE),        CL(IDLE),
      { 0, 0 },                                      /* no associated channel */      { 0, 0, NULL, NULL },                        /* no associated channel */
       { PPTP_StartCtrlConnReply, TRUE, PPTP_DFL_REPLY_TIME },        { PPTP_StartCtrlConnReply, TRUE, PPTP_DFL_REPLY_TIME },
     },      },
    { "StartCtrlConnReply", PptpStartCtrlConnReply,    { "StartCtrlConnReply", (PptpHandler) PptpStartCtrlConnReply,
       TRUE, sizeof(struct pptpStartCtrlConnReply),        TRUE, sizeof(struct pptpStartCtrlConnReply),
       CL(WAIT_CTL_REPLY),        CL(WAIT_CTL_REPLY),
      { 0, 0 },                                      /* no associated channel */      { 0, 0, NULL, NULL },                        /* no associated channel */
      { 0 },                                      /* no reply expected */      { 0, 0, 0 },                                /* no reply expected */
     },      },
    { "StopCtrlConnRequest", PptpStopCtrlConnRequest,    { "StopCtrlConnRequest", (PptpHandler) PptpStopCtrlConnRequest,
       FALSE, sizeof(struct pptpStopCtrlConnRequest),        FALSE, sizeof(struct pptpStopCtrlConnRequest),
       CL(WAIT_CTL_REPLY)|CL(WAIT_STOP_REPLY)|CL(ESTABLISHED),        CL(WAIT_CTL_REPLY)|CL(WAIT_STOP_REPLY)|CL(ESTABLISHED),
      { 0, 0 },                                      /* no associated channel */      { 0, 0, NULL, NULL },                        /* no associated channel */
       { PPTP_StopCtrlConnReply, TRUE, PPTP_STOPCCR_REPLY_TIME },        { PPTP_StopCtrlConnReply, TRUE, PPTP_STOPCCR_REPLY_TIME },
     },      },
    { "StopCtrlConnReply", PptpStopCtrlConnReply,    { "StopCtrlConnReply", (PptpHandler) PptpStopCtrlConnReply,
       TRUE, sizeof(struct pptpStopCtrlConnReply),        TRUE, sizeof(struct pptpStopCtrlConnReply),
       CL(WAIT_STOP_REPLY),        CL(WAIT_STOP_REPLY),
      { 0, 0 },                                      /* no associated channel */      { 0, 0, NULL, NULL },                        /* no associated channel */
      { 0 },                                      /* no reply expected */      { 0, 0, 0 },                                /* no reply expected */
     },      },
    { "EchoRequest", PptpEchoRequest,    { "EchoRequest", (PptpHandler) PptpEchoRequest,
       FALSE, sizeof(struct pptpEchoRequest),        FALSE, sizeof(struct pptpEchoRequest),
       CL(ESTABLISHED),        CL(ESTABLISHED),
      { 0, 0 },                                      /* no associated channel */      { 0, 0, NULL, NULL },                        /* no associated channel */
       { PPTP_EchoReply, TRUE, PPTP_DFL_REPLY_TIME },        { PPTP_EchoReply, TRUE, PPTP_DFL_REPLY_TIME },
     },      },
    { "EchoReply", PptpEchoReply,    { "EchoReply", (PptpHandler) PptpEchoReply,
       TRUE, sizeof(struct pptpEchoReply),        TRUE, sizeof(struct pptpEchoReply),
       CL(ESTABLISHED),        CL(ESTABLISHED),
      { 0, 0 },                                      /* no associated channel */      { 0, 0, NULL, NULL },                        /* no associated channel */
      { 0 },                                      /* no reply expected */      { 0, 0, 0 },                                /* no reply expected */
     },      },
    { "OutCallRequest", PptpOutCallRequest,    { "OutCallRequest", (PptpHandler) PptpOutCallRequest,
       FALSE, sizeof(struct pptpOutCallRequest),        FALSE, sizeof(struct pptpOutCallRequest),
       CL(ESTABLISHED),        CL(ESTABLISHED),
       { 0, PPTP_FIND_CHAN_MY_CID, NULL, "cid" },        { 0, PPTP_FIND_CHAN_MY_CID, NULL, "cid" },
       { PPTP_OutCallReply, TRUE, PPTP_OUTCALLREQ_REPLY_TIME },        { PPTP_OutCallReply, TRUE, PPTP_OUTCALLREQ_REPLY_TIME },
     },      },
    { "OutCallReply", PptpOutCallReply,    { "OutCallReply", (PptpHandler) PptpOutCallReply,
       TRUE, sizeof(struct pptpOutCallReply),        TRUE, sizeof(struct pptpOutCallReply),
       CH(WAIT_OUT_REPLY),        CH(WAIT_OUT_REPLY),
       { PPTP_FIND_CHAN_MY_CID, PPTP_FIND_CHAN_MY_CID, "peerCid", "cid" },        { PPTP_FIND_CHAN_MY_CID, PPTP_FIND_CHAN_MY_CID, "peerCid", "cid" },
      { 0 },                                   /* no reply expected */      { 0, 0, 0 },                           /* no reply expected */
     },      },
    { "InCallRequest", PptpInCallRequest,    { "InCallRequest", (PptpHandler) PptpInCallRequest,
       FALSE, sizeof(struct pptpInCallRequest),        FALSE, sizeof(struct pptpInCallRequest),
       CL(ESTABLISHED),        CL(ESTABLISHED),
       { 0, PPTP_FIND_CHAN_MY_CID, NULL, "cid" },        { 0, PPTP_FIND_CHAN_MY_CID, NULL, "cid" },
       { PPTP_InCallReply, FALSE, PPTP_DFL_REPLY_TIME },        { PPTP_InCallReply, FALSE, PPTP_DFL_REPLY_TIME },
     },      },
    { "InCallReply", PptpInCallReply,    { "InCallReply", (PptpHandler) PptpInCallReply,
       TRUE, sizeof(struct pptpInCallReply),        TRUE, sizeof(struct pptpInCallReply),
       CH(WAIT_IN_REPLY),        CH(WAIT_IN_REPLY),
       { PPTP_FIND_CHAN_MY_CID, PPTP_FIND_CHAN_MY_CID, "peerCid", "cid" },        { PPTP_FIND_CHAN_MY_CID, PPTP_FIND_CHAN_MY_CID, "peerCid", "cid" },
       { PPTP_InCallConn, FALSE, PPTP_INCALLREP_REPLY_TIME },        { PPTP_InCallConn, FALSE, PPTP_INCALLREP_REPLY_TIME },
     },      },
    { "InCallConn", PptpInCallConn,    { "InCallConn", (PptpHandler) PptpInCallConn,
       TRUE, sizeof(struct pptpInCallConn),        TRUE, sizeof(struct pptpInCallConn),
       CH(WAIT_CONNECT),        CH(WAIT_CONNECT),
       { PPTP_FIND_CHAN_MY_CID, PPTP_FIND_CHAN_PEER_CID, "peerCid", "peerCid" },        { PPTP_FIND_CHAN_MY_CID, PPTP_FIND_CHAN_PEER_CID, "peerCid", "peerCid" },
      { 0 },                                   /* no reply expected */      { 0, 0, 0 },                           /* no reply expected */
     },      },
    { "CallClearRequest", PptpCallClearRequest,    { "CallClearRequest", (PptpHandler) PptpCallClearRequest,
       FALSE, sizeof(struct pptpCallClearRequest),        FALSE, sizeof(struct pptpCallClearRequest),
       CH(WAIT_IN_REPLY)|CH(WAIT_ANSWER)|CH(ESTABLISHED),        CH(WAIT_IN_REPLY)|CH(WAIT_ANSWER)|CH(ESTABLISHED),
       { PPTP_FIND_CHAN_PNS_CID, PPTP_FIND_CHAN_PNS_CID, "cid", "cid" },        { PPTP_FIND_CHAN_PNS_CID, PPTP_FIND_CHAN_PNS_CID, "cid", "cid" },
       { PPTP_CallDiscNotify, TRUE, PPTP_DFL_REPLY_TIME },        { PPTP_CallDiscNotify, TRUE, PPTP_DFL_REPLY_TIME },
     },      },
    { "CallDiscNotify", PptpCallDiscNotify,    { "CallDiscNotify", (PptpHandler) PptpCallDiscNotify,
       FALSE, sizeof(struct pptpCallDiscNotify),        FALSE, sizeof(struct pptpCallDiscNotify),
       CH(WAIT_OUT_REPLY)|CH(WAIT_CONNECT)|CH(WAIT_DISCONNECT)|CH(ESTABLISHED),        CH(WAIT_OUT_REPLY)|CH(WAIT_CONNECT)|CH(WAIT_DISCONNECT)|CH(ESTABLISHED),
       { PPTP_FIND_CHAN_PAC_CID, PPTP_FIND_CHAN_PAC_CID, "cid", "cid" },        { PPTP_FIND_CHAN_PAC_CID, PPTP_FIND_CHAN_PAC_CID, "cid", "cid" },
      { 0 },                                   /* no reply expected */      { 0, 0, 0 },                           /* no reply expected */
     },      },
    { "WanErrorNotify", PptpWanErrorNotify,    { "WanErrorNotify", (PptpHandler) PptpWanErrorNotify,
       FALSE, sizeof(struct pptpWanErrorNotify),        FALSE, sizeof(struct pptpWanErrorNotify),
       CH(ESTABLISHED),        CH(ESTABLISHED),
       { PPTP_FIND_CHAN_PNS_CID, PPTP_FIND_CHAN_PNS_CID, "cid", "cid" },        { PPTP_FIND_CHAN_PNS_CID, PPTP_FIND_CHAN_PNS_CID, "cid", "cid" },
      { 0 },                                   /* no reply expected */      { 0, 0, 0 },                           /* no reply expected */
     },      },
    { "SetLinkInfo", PptpSetLinkInfo,    { "SetLinkInfo", (PptpHandler) PptpSetLinkInfo,
       FALSE, sizeof(struct pptpSetLinkInfo),        FALSE, sizeof(struct pptpSetLinkInfo),
       CH(ESTABLISHED),        CH(ESTABLISHED),
       { PPTP_FIND_CHAN_PAC_CID, PPTP_FIND_CHAN_PAC_CID, "cid", "cid" },        { PPTP_FIND_CHAN_PAC_CID, PPTP_FIND_CHAN_PAC_CID, "cid", "cid" },
      { 0 },                                   /* no reply expected */      { 0, 0, 0 },                           /* no reply expected */
     },      },
   };    };
   
Line 542  PptpCtrlListen(struct u_addr *ip, in_port_t port) Line 545  PptpCtrlListen(struct u_addr *ip, in_port_t port)
           
     /* See if we're already have a listener matching this address and port */      /* See if we're already have a listener matching this address and port */
     for (k = 0; k < gNumPptpLis; k++) {      for (k = 0; k < gNumPptpLis; k++) {
        PptpLis const l = gPptpLis[k];        PptpLis const m = gPptpLis[k];
   
        if (l != NULL        if (m != NULL
            && (!u_addrcompare (&l->self_addr, ip))            && (!u_addrcompare (&m->self_addr, ip))
            && l->self_port == port) {            && m->self_port == port) {
                l->ref++;                m->ref++;
                return(l);                return(m);
         }          }
     }      }
   
Line 623  PptpCtrlListenRetry(int type, void *cookie) Line 626  PptpCtrlListenRetry(int type, void *cookie)
 {  {
     PptpLis const       l = (PptpLis)cookie;      PptpLis const       l = (PptpLis)cookie;
   
       (void)type;
     if ((l->sock = TcpGetListenPort(&l->self_addr, l->self_port, FALSE)) < 0) {      if ((l->sock = TcpGetListenPort(&l->self_addr, l->self_port, FALSE)) < 0) {
         EventRegister(&l->retry, EVENT_TIMEOUT, PPTP_LISTEN_RETRY * 1000,          EventRegister(&l->retry, EVENT_TIMEOUT, PPTP_LISTEN_RETRY * 1000,
             0, PptpCtrlListenRetry, l);              0, PptpCtrlListenRetry, l);
Line 690  PptpCtrlOrigCall(int incoming, struct pptpctrlinfo *ci Line 694  PptpCtrlOrigCall(int incoming, struct pptpctrlinfo *ci
   /* Init */    /* Init */
   assert(gInitialized);    assert(gInitialized);
   port = port ? port : PPTP_PORT;    port = port ? port : PPTP_PORT;
  memset(cinfo, 0, sizeof(cinfo));  memset(cinfo, 0, sizeof(*cinfo));
   
   /* Find/create control block */    /* Find/create control block */
   if ((c = PptpCtrlGetCtrl(TRUE, locip, ip, port,    if ((c = PptpCtrlGetCtrl(TRUE, locip, ip, port,
Line 805  PptpCtrlListenEvent(int type, void *cookie) Line 809  PptpCtrlListenEvent(int type, void *cookie)
   char                          buf[48], buf2[48];    char                          buf[48], buf2[48];
   socklen_t                     addrLen;    socklen_t                     addrLen;
       
       (void)type;
     /* Accept connection */      /* Accept connection */
     if ((sock = TcpAcceptConnection(l->sock, &peerst, FALSE)) < 0)      if ((sock = TcpAcceptConnection(l->sock, &peerst, FALSE)) < 0)
         return;          return;
Line 851  PptpCtrlConnEvent(int type, void *cookie) Line 856  PptpCtrlConnEvent(int type, void *cookie)
   socklen_t             addrLen = sizeof(addr);    socklen_t             addrLen = sizeof(addr);
   char                  buf[48];    char                  buf[48];
   
     (void)type;
   
   /* Get event */    /* Get event */
   assert(c->state == PPTP_CTRL_ST_IDLE);    assert(c->state == PPTP_CTRL_ST_IDLE);
   
Line 965  PptpCtrlReadCtrl(int type, void *cookie) Line 972  PptpCtrlReadCtrl(int type, void *cookie)
   PptpMsgHead   const hdr = &c->frame.hdr;    PptpMsgHead   const hdr = &c->frame.hdr;
   int           nread;    int           nread;
   
     (void)type;
   
   /* Figure how much to read and read it */    /* Figure how much to read and read it */
   nread = (c->flen < sizeof(*hdr) ? sizeof(*hdr) : hdr->length) - c->flen;    nread = (c->flen < sizeof(*hdr) ? sizeof(*hdr) : hdr->length) - c->flen;
   if ((nread = read(c->csock, c->frame.buf + c->flen, nread)) <= 0) {    if ((nread = read(c->csock, c->frame.buf + c->flen, nread)) <= 0) {
Line 1194  PptpCtrlGetCtrl(int orig, struct u_addr *self_addr, Line 1203  PptpCtrlGetCtrl(int orig, struct u_addr *self_addr,
     if (orig) {      if (orig) {
         /* See if we're already have a control block matching this address and port */          /* See if we're already have a control block matching this address and port */
           for (k = 0; k < gNumPptpCtrl; k++) {            for (k = 0; k < gNumPptpCtrl; k++) {
                PptpCtrl        const c = gPptpCtrl[k];                PptpCtrl        const d = gPptpCtrl[k];
                   
                if (c != NULL                if (d != NULL
                    && (c->active_sessions < gPPTPtunlimit)                    && (d->active_sessions < gPPTPtunlimit)
                    && (u_addrcompare(&c->peer_addr, peer_addr) == 0)                    && (u_addrcompare(&d->peer_addr, peer_addr) == 0)
                    && (c->peer_port == peer_port || c->orig != orig)                    && (d->peer_port == peer_port || d->orig != orig)
                     && (u_addrempty(self_addr) ||                       && (u_addrempty(self_addr) || 
                      (u_addrcompare(&c->self_addr, self_addr) == 0))) {                      (u_addrcompare(&d->self_addr, self_addr) == 0))) {
                        return(c);                        return(d);
                 }                  }
           }            }
     }      }
Line 2098  PptpStopCtrlConnRequest(PptpCtrl c, struct pptpStopCtr Line 2107  PptpStopCtrlConnRequest(PptpCtrl c, struct pptpStopCtr
 static void  static void
 PptpStopCtrlConnReply(PptpCtrl c, struct pptpStopCtrlConnReply *rep)  PptpStopCtrlConnReply(PptpCtrl c, struct pptpStopCtrlConnReply *rep)
 {  {
     (void)rep;
   PptpCtrlKillCtrl(c);    PptpCtrlKillCtrl(c);
 }  }
   
Line 2168  PptpOutCallRequest(PptpCtrl c, struct pptpOutCallReque Line 2178  PptpOutCallRequest(PptpCtrl c, struct pptpOutCallReque
   
   /* Ask link layer about making the outgoing call */    /* Ask link layer about making the outgoing call */
   PptpCtrlInitCinfo(ch, &cinfo);    PptpCtrlInitCinfo(ch, &cinfo);
  linfo = (*gGetOutLink)(&cinfo, &c->self_addr, &c->peer_addr, c->peer_port, req->bearType,  linfo = (*gGetOutLink)(&cinfo, &c->self_addr, &c->peer_addr, c->peer_port,
    req->frameType, req->minBps, req->maxBps, calledNum, subAddress);    calledNum);
   if (linfo.cookie == NULL)    if (linfo.cookie == NULL)
     goto denied;      goto denied;
   
Line 2281  PptpInCallRequest(PptpCtrl c, struct pptpInCallRequest Line 2291  PptpInCallRequest(PptpCtrl c, struct pptpInCallRequest
   linfo.cancel = NULL;    linfo.cancel = NULL;
   if (gGetInLink)    if (gGetInLink)
     linfo = (*gGetInLink)(&cinfo, &c->self_addr, &c->peer_addr, c->peer_port,      linfo = (*gGetInLink)(&cinfo, &c->self_addr, &c->peer_addr, c->peer_port,
      req->bearType, callingNum, calledNum, subAddress);      callingNum, calledNum);
   ch->linfo = linfo;    ch->linfo = linfo;
   if (linfo.cookie == NULL) {    if (linfo.cookie == NULL) {
     Log(LG_PHYS2, ("pptp%d: incoming call request denied", c->id));      Log(LG_PHYS2, ("pptp%d: incoming call request denied", c->id));
Line 2368  PptpCallClearRequest(PptpChan ch, struct pptpCallClear Line 2378  PptpCallClearRequest(PptpChan ch, struct pptpCallClear
   struct pptpCallDiscNotify     notify;    struct pptpCallDiscNotify     notify;
   PptpCtrl                      const c = ch->ctrl;    PptpCtrl                      const c = ch->ctrl;
   
     (void)req;
   if (PPTP_CHAN_IS_PNS(ch)) {    if (PPTP_CHAN_IS_PNS(ch)) {
     Log(LG_PHYS2, ("pptp%d-%d: got %s, but we are PNS for this call",      Log(LG_PHYS2, ("pptp%d-%d: got %s, but we are PNS for this call",
       c->id, ch->id, gPptpMsgInfo[PPTP_CallClearRequest].name));        c->id, ch->id, gPptpMsgInfo[PPTP_CallClearRequest].name));
Line 2407  PptpWanErrorNotify(PptpChan ch, struct pptpWanErrorNot Line 2418  PptpWanErrorNotify(PptpChan ch, struct pptpWanErrorNot
 {  {
   PptpCtrl      const c = ch->ctrl;    PptpCtrl      const c = ch->ctrl;
   
     (void)notif;
   Log(LG_PHYS2, ("pptp%d-%d: ignoring %s",    Log(LG_PHYS2, ("pptp%d-%d: ignoring %s",
     c->id, ch->id, gPptpMsgInfo[PPTP_WanErrorNotify].name));      c->id, ch->id, gPptpMsgInfo[PPTP_WanErrorNotify].name));
 }  }
Line 2433  PptpSetLinkInfo(PptpChan ch, struct pptpSetLinkInfo *i Line 2445  PptpSetLinkInfo(PptpChan ch, struct pptpSetLinkInfo *i
  */   */
   
 int  int
PptpsStat(Context ctx, int ac, char *av[], void *arg)PptpsStat(Context ctx, int ac, const char *const av[], const void *arg)
 {  {
     int         k;      int         k;
     char        buf1[48], buf2[48];      char        buf1[48], buf2[48];
   
       (void)ac;
       (void)av;
       (void)arg;
   
     Printf("Active PPTP tunnels:\r\n");      Printf("Active PPTP tunnels:\r\n");
     for (k = 0; k < gNumPptpCtrl; k++) {      for (k = 0; k < gNumPptpCtrl; k++) {

Removed from v.1.1  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>