CALLBACK SERVER emuluje WINDOWS NT RAS SERVER. Sorry. This file is only slovak language. ;-(. (ale ak by chcel niekto spravit anglicku ci lepsiu verziu moze mailnut.) ver 1.0.1 (doplnene logy mien nepodstatne). umoznuje pouzitie cbcp protokolu ako server (nie klient !). A tak teda umoznuje pripojit Win95 a mozno aj inych klientov pri callbacku. T.j. po zavolani na server sa overi cez CHAP ! meno a heslo a potom ak je to privilegovany user, tak je mu ponuknute tak ako pri spojeni na NT navolit spatne telefonne cislo. Windows95 potom prejde do stavu cakania na spatne volanie (ktore sa mi inac ako takto nepodarilo vyvolat). Medzitym server zavola callbackser (kde sa da podla potreby doplnat kadejaky logovanie pre vykazanie platby sa telefona pod.) Tento zase zavola nakoniec "cb volaj ". z upraveneho balika callback. A ten zmeni mgetty.config subor a cez mgetty prevedie spatne jedno ! zavolanie naspat a opravi si zase naspat svoj config. (tieto sarady s mgettom nerobim ja ale standartny balik callback-4_24_tar.gz. Tento som len doupravil o moznost zadania telefonneho cisla z poveloveho riadku. Instalacia: Odporucam zacat na debiane (je tam prednastaneve ppp pre spojenie z win95. ja som robil na toho casu stabilnej verzii Debian-1.3.1.r8. 1, rozbehnut klasicke ppp necallbackove z win95 na Server pouzitim mgetty. T.j. v /etc/inittab so:23:respawn:/sbin/mgetty -n1 -s57600 -D ttyS0 v /etc/ppp/ spravit chap-secrets s meno usera, meno stroja, heslo meno stroj heslo meno stroj heslo (ak su problemy s chapom je vhodne zacat s papom a vyhodit pap-sectrets .. vid prislusne readme. Ale Chap nam bude treba !. teda ozivit. NASTAVIT vhodne mgetty ! t.j. ... mgetty.config : debug 8 speed 57600 rings 1 issue-file ... login-prompt ... a hlavne init-chat ... \d\d\d+++\d\d\dATZ0&F OK ATS0=0S2=255 OK (napr pre zyxel) a ... nastavit aj spravne modem ... napr mgetty sa snazi zhadzovanim DTR resetovat modem (preto ho tak treba nastavit) ale to sa da zas vycitat z logu od mgetty pri vysokej urovni debugu. /etc/mgetty/login.config: /AutoPPP/ - a_ppp /usr/sbin/pppd auth +chap mojeip:jehoip pre pap dat +pap login 2, nainstalovat callback-4_24_tar.gz. t.j. subory active.ttyS0 callback.ttyS0 cb cblogin cbmgetty enable.ttyS0 /etc/callback.setup (vsetko popisane pri baliku) ja neskor budem ako uzivatel pppd teda v setupe : destinations: ( definuje skupinu pppdg ktora je extra - voli si ) pppdg: poviemsi extra ( cislo sama) users: pppd: pppdg (definuje usera pppd do skupiny pppdg). to vyzaduje zmenu v inittab: na s0:...:cbmgetty ttyS0 nastvenie linkov na programy, urobenie linku modem.ttyS0 na mgetty ... Este som tento balik upravil v tom ze nerohoduje sa hned podla mena ale pyta meno, heslo a az potom sa rozhodne ci sa da spavit callback alebo pyta heslo este raz (tentokrat uz login) pre vstup do unixu. Takto by mala byt moznost a, pripojit sa cez normalny terminal (term90.exe a dat atdtcislo) po pripojeni pyta meno (heslo) potom podla skupiny bud pevny callback alebo volitelny (pyta cislo) alebo direct pripojenie. Pre callback by mal zmenit mgetty.config podla callback.ttyS0 kde je napr iny login prompt (ja som spatne volanie) a hlavne tam program doplna iny init-chat (doplni tam ATDT telefonne cislo) cim zavola spat. Ja vidim na teminaly RING RING tak napisem ATA (answer) cim moj modem dvihne, spoja sa a dostanem callbackovy login promt. A teda mam nePPP callback. b, pripojit sa cez PPP (priamo bez callbacku) mgetty to ma dokazat. c, pripojit sa cez PPP ale v dat si terminal po vytaceni cisla. Tam sa prihlasit podla bodu a, navolit callback ale etse pred skoncenim preprogramovat modem aby nedetekoval CD (inac spadne spojenie). potom pocakt na spatne zavolanie , preprogramovat modem spat (inac by nezavesil aj ked by spadla linka) a nechat pokracovat PPP spojenie. Vpodstate by to fungovalo ale ... programovanie modemu ... treba script a navyse kazdy nmodem trochu iny!. moj xircom to dokonca vedel len cez ats... lebo na at&c0 kaslal .. a teda moc komplikovane a mala spolahlivost. preto ... zmena PPP aby zvladalo cbcp podla WinNT a bude to pre usera malina. 3, nahradit PPP novym ppp (pozor vie robit len server) !!! nie klienta. .. nechelo sa mi s tym natahovat a mne to staci .. /etc/ppp/calbackser .. tento program vola novy pppd /etc/ppp/callbusers - tu pozera kto moze robit callback (meno!...) /etc/ppp/cb ... nove cb co vie cb volaj cislo (cez usera pppd a grupu pppdg). dat vysoky debug a pozriet ci vsetko slape ako ma: t.j.: v login.config ... pppd.new auth +chap mojeIP:jehoIP cb kdebug 7 debug (cb by malo povolit cbcp protokol) kdebug 7 debug potom vyhodit. MAT VELA CHUTI A NEBAT SA. ... a napisat lepsi navod a lepsi program ako tento zlepenec. Zdrojove kody: /etc/ppp/callbusers ## ludia ktory mozu mat callback (musi koncit !) blb! somar! bobovsky! puk! zmeny v callback-4_24_tar.gz ... ... Zmeny v ppp (z orginalneho ppp-2.2.0f najskor som spravil ppp-2.2.0f-23 pouzitim opravneho patchu pre debian distribuciu Linuxu. a nan treba aplikovat tieto diffy: (patch -p < toto). Kompilacia: sprav ./configure pre linky (plus net/if_ppp.h do net z linux) vojdi do pppd make HAS_SHADOW=1, a strip + prava. diff -rN --unified=10 ppp-2.2.0f-23o/pppd/Makefile.linux ppp-2.2.0f-23/pppd/Makefile.linux --- ppp-2.2.0f-23o/pppd/Makefile.linux Mon Jul 27 11:32:07 1998 +++ ppp-2.2.0f-23/pppd/Makefile.linux Fri Aug 14 01:38:29 1998 @@ -1,22 +1,22 @@ # # pppd makefile for Linux # $Id: Makefile.linux,v 1.5 1996/05/26 13:33:17 alvar Exp $ # PPPDSRCS = main.c magic.c fsm.c lcp.c ipcp.c upap.c chap.c md5.c ccp.c \ - ipxcp.c auth.c options.c sys-linux.c + ipxcp.c auth.c options.c sys-linux.c cbcps.c HEADERS = callout.h pathnames.h patchlevel.h chap.h md5.h \ ipxcp.h MANPAGES = pppd.8 PPPDOBJS = main.o magic.o fsm.o lcp.o ipcp.o upap.o chap.o md5.o ccp.o \ - auth.o options.o sys-linux.o + auth.o options.o sys-linux.o cbcps.o all: pppd # # include dependancies if present and backup if as a header file ifeq (.depend,$(wildcard .depend)) include .depend HEADERS := $(HEADERS) .depend endif diff -rN --unified=10 ppp-2.2.0f-23o/pppd/auth.c ppp-2.2.0f-23/pppd/auth.c --- ppp-2.2.0f-23o/pppd/auth.c Mon Jul 27 11:32:07 1998 +++ ppp-2.2.0f-23/pppd/auth.c Thu Aug 13 22:25:07 1998 @@ -54,20 +54,21 @@ #endif #ifdef HAS_PWAUTH #include #ifndef PW_PPP #define PW_PPP PW_LOGIN #endif #endif #include "pppd.h" +#include "cbcps.h" #include "fsm.h" #include "lcp.h" #include "upap.h" #include "chap.h" #include "ipcp.h" #include "ccp.h" #include "pathnames.h" #if defined(sun) && defined(sparc) #include @@ -96,20 +97,21 @@ /* Bits in auth_pending[] */ #define UPAP_WITHPEER 1 #define UPAP_PEER 2 #define CHAP_WITHPEER 4 #define CHAP_PEER 8 /* Prototypes */ void check_access __P((FILE *, char *)); static void network_phase __P((int)); +static void callback_phase __P((int)); static int login __P((char *, char *, char **, int *)); static void logout __P((void)); static int null_login __P((int)); static int get_upap_passwd __P((void)); static int have_upap_secret __P((void)); static int have_chap_secret __P((char *, char *)); static int scan_authfile __P((FILE *, char *, char *, char *, struct wordlist **, char *)); static void free_wordlist __P((struct wordlist *)); @@ -143,20 +145,21 @@ /* * LCP has gone down; it will either die or try to re-establish. */ void link_down(unit) int unit; { ipcp_close(0); ccp_close(0); + cbcp_close(0); //nepodstatne phase = PHASE_TERMINATE; } /* * The link is established. * Proceed to the Dead, Authenticate or Network phase as appropriate. */ void link_established(unit) int unit; @@ -191,39 +194,54 @@ } if (ho->neg_chap) { ChapAuthWithPeer(unit, our_name, ho->chap_mdtype); auth |= CHAP_WITHPEER; } else if (ho->neg_upap) { upap_authwithpeer(unit, user, passwd); auth |= UPAP_WITHPEER; } auth_pending[unit] = auth; - if (!auth) - network_phase(unit); + if (!auth) // ak neni auth tak priamo bez chap/pap ideme. + { + callback_phase(unit); + } } /* * Proceed to the network phase. */ static void network_phase(unit) int unit; { phase = PHASE_NETWORK; ipcp_open(unit); #ifdef IPX_CHANGE ipxcp_open(unit); #endif /* IPX_CHANGE */ ccp_open(unit); } +static void +callback_phase(int unit) //faza callbacku .. +{ + lcp_options *wo=&lcp_wantoptions[unit]; + lcp_options *go=&lcp_gotoptions[unit]; + if(!wo->neg_cbcp || !go->neg_cbcp) + network_phase(unit); // pri licitacii alebo cez opt cb nepovolena + else { + phase = PHASE_CALLBACK; + cbcp_open(unit); // toto ho prinuti poslat vyzvu .. + } +} + /* * The peer has failed to authenticate himself using `protocol'. */ void auth_peer_fail(unit, protocol) int unit, protocol; { /* * Authentication failure: take the link down */ @@ -251,26 +269,22 @@ syslog(LOG_WARNING, "auth_peer_success: unknown protocol %x", protocol); return; } /* * If there is no more authentication still to be done, * proceed to the network phase. */ if ((auth_pending[unit] &= ~bit) == 0) { - phase = PHASE_NETWORK; - ipcp_open(unit); -#ifdef IPX_CHANGE - ipxcp_open(unit); -#endif /* IPX_CHANGE */ - ccp_open(unit); +// syslog(LOG_DEBUG," bbo po auth_peer_success"); + callback_phase(unit); } } /* * We have failed to authenticate ourselves to the peer using `protocol'. */ void auth_withpeer_fail(unit, protocol) int unit, protocol; { @@ -762,20 +776,22 @@ FILE *f; int ret, len; char *filename; struct wordlist *addrs; char secbuf[MAXWORDLEN]; filename = _PATH_CHAPFILE; addrs = NULL; secbuf[0] = 0; + BCOPY(client,cbcpuser,strlen(client)>19 ? 19: strlen(client)); + cbcpuser[19]=0; f = fopen(filename, "r"); if (f == NULL) { syslog(LOG_ERR, "Can't open chap secret file %s: %m", filename); return 0; } check_access(f, filename); ret = scan_authfile(f, client, server, secbuf, &addrs, filename); fclose(f); if (ret < 0) diff -rN --unified=10 ppp-2.2.0f-23o/pppd/callbackser/main.c ppp-2.2.0f-23/pppd/callbackser/main.c --- ppp-2.2.0f-23o/pppd/callbackser/main.c Thu Jan 1 01:00:00 1970 +++ ppp-2.2.0f-23/pppd/callbackser/main.c Fri Aug 14 01:28:15 1998 @@ -0,0 +1,28 @@ +/* + * cbcp - Call Back Configuration Protocol. SERVER + * Miro Bobovsky , 13.8.1998 + * robte s tym co chete - GPL a lubovolny iny vse povoliaci. + * toto spusta pppd, Ocakava ze zmeni mgetty.config aby telefonoval + * To spravi cez cb ... upravene aby som mohol priamo volat + * cb je z balika callback-4_24_tar.gz + uprava +*/ +#include +#include +#include +#include +#include + +main(int argc, char **argv) +{ +char *user=argv[1]; +char *cislo=argv[2]; +char buff[50]; + +if(argc!=3) return(-1); +openlog("callbackser", LOG_PID | LOG_NDELAY, LOG_LOCAL2); +syslog(LOG_INFO,"zavolam na %s pre usera %s",cislo,user); +strncpy(buff,"/etc/ppp/cb volaj ",50); +strncat(buff,cislo,sizeof(buff)-strlen(buff)-1); +sleep(5); // pocka kym spadne ppp a potom v klude spravi respawn modemu. +system(buff); +} diff -rN --unified=10 ppp-2.2.0f-23o/pppd/cbcps.c ppp-2.2.0f-23/pppd/cbcps.c --- ppp-2.2.0f-23o/pppd/cbcps.c Thu Jan 1 01:00:00 1970 +++ ppp-2.2.0f-23/pppd/cbcps.c Fri Aug 14 01:26:11 1998 @@ -0,0 +1,234 @@ +/* + * cbcp - Call Back Configuration Protocol. SERVER + * Miro Bobovsky , 13.8.1998 + * robte s tym co chete - GPL a lubovolny iny vse povoliaci. + * ocakavam za pppd prepinac auth +chap cb ... + * ocakavam subor /etc/ppp/callbusers kde su mena konciace! + * tych, kory mozu robit callback napr bobovsky!blaa ... + * snazim sa spustit /etc/ppp/callbackser pre volanie. (mgetty). +*/ +#include +#include +#include +#include +#include + +#include "pppd.h" +#include "fsm.h" +#include "lcp.h" +#include "ipcp.h" +#include "cbcps.h" + +extern void network_phase __P((int)); +void cbcp_recvresp(cbcp_state *us, char *pckt, int len); +void cbcp_sendack(cbcp_state *us,u_char type,u_char delay, + char *address); +int mozecallb(char *); + +cbcp_state cbcp[NUM_PPP]; +char cbcpuser[20]; + +void cbcp_lowerup(int iface) //vola lcp.c +{ +LCPDEBUG((LOG_DEBUG," bbo cbcp_lowerup")); +} + +void cbcp_init(int iface) // z main.c +{ + cbcp_state *us; + + LCPDEBUG((LOG_DEBUG," bbo cbcp_init")); + cbcpuser[0]=0; + us = &cbcp[iface]; + memset(us, 0, sizeof(cbcp_state)); + us->us_unit = iface; + us->cbenable=0; +} + +void cbcp_open(int unit) //z auth -- startuje cbcp komunikaciu +{ + u_char buf[256]; + u_char *bufp = buf; + int len = 0; + u_char *outp; + int outlen; + cbcp_state *us = &cbcp[unit]; + + us->us_id = 1; + outp = outpacket_buf; + outlen=6; // 4 hlava+2 nocallback + us->cbenable=0; //nemoze + PUTCHAR(CB_CONF_NO, bufp); + PUTCHAR(2 , bufp); //dlzka + if(mozecallb(cbcpuser)){ // pozri ci moze aj callback + us->cbenable=1; //moze + outlen+=5; // o callback; + PUTCHAR(CB_CONF_USER, bufp); //on si povie cislo + PUTCHAR(5 , bufp); //dlzka + PUTCHAR(0, bufp); // delay + PUTCHAR(1, bufp); // adrtype + PUTCHAR(0, bufp); // bezcislaZ + } + LCPDEBUG((LOG_DEBUG, "bbo cbcp_open")); + MAKEHEADER(outp, PPP_CBCP); // a dorobim paket , dlzky a ... + PUTCHAR(CBCP_REQ, outp); // prikaz + PUTCHAR(us->us_id,outp); //id + PUTSHORT(outlen, outp); // IBAZE WINNT posiela to kazde 2 sek. + BCOPY(buf, outp, outlen-4); // s novym id a ja len raz .. ale ide. + output(1, outpacket_buf, outlen + PPP_HDRLEN); +} + +void cbcp_close(int unit) +{ + LCPDEBUG((LOG_DEBUG, "bbo cbcp_close")); +} + +/* process an incomming packet */ +void cbcp_input(int unit, u_char *inpacket, int pktlen) +{ + u_char *inp; + u_char code, id; + u_short len; + + cbcp_state *us = &cbcp[unit]; + inp = inpacket; + LCPDEBUG((LOG_DEBUG," bbo cbcp_input")); + if (pktlen < CBCP_MINLEN) { + syslog(LOG_ERR, "CBCP packet is too small"); + return; + } + + GETCHAR(code, inp); + GETCHAR(id, inp); + GETSHORT(len, inp); + + if (len > pktlen) { + syslog(LOG_ERR, "CBCP packet: invalid length"); + return; + } + + len -= CBCP_MINLEN; + + switch(code) { + case CBCP_REQ: // toto je neosetrene bo nema co prist. + syslog(LOG_ERR, "CBCP_REQ received !!!!"); + break; + + case CBCP_RESP: + LCPDEBUG((LOG_DEBUG, "CBCP_RESP received")); + if (id != us->us_id) + syslog(LOG_ERR,"CBCP RESP zle id, caka %d dostal %d",us->us_id,id); + cbcp_recvresp(us,inp,len); + break; + + case CBCP_ACK: // toto je neosetrene bo nema co prist. + syslog(LOG_ERR, "CBCP_ACK received !!!!"); + break; + + default: + break; + } +} + +/* protocol was rejected by foe */ +void cbcp_protrej(int iface) +{ + LCPDEBUG((LOG_DEBUG," bbo cbcp_protrej")); +} +int cbcp_printpkt(u_char *p, int plen, + void (*printer) __P((void *, char *, ...)), + void *arg) +{ + LCPDEBUG((LOG_DEBUG," bbo cbcp_printpkt")); +} + +void cbcp_recvresp(cbcp_state *us, char *pckt, int len) +{ + u_char type, delay, addr_type; + int opt_len; + char address[256]; + + address[0]=0; + if (len<2) { + syslog(LOG_ERR, "CBCP recvresp: kratky, %d",len); + return;} + + GETCHAR(type, pckt); + GETCHAR(opt_len, pckt); + + if (opt_len > 2) + GETCHAR(delay, pckt); + + if (opt_len > 4) { + if(us->cbenable==1) us->cbenable++; + GETCHAR(addr_type, pckt); + memcpy(address, pckt, opt_len - 4); + address[opt_len - 4] = 0; + if (address[0]) + LCPDEBUG((LOG_DEBUG, "mam cislo: %s", address)); + } + cbcp_sendack(us,type,delay,address); +} + +void cbcp_sendack( cbcp_state *us,u_char type,u_char delay, + char *address) +{ + u_char buf[256]; + u_char *bufp = buf; + int len = 0; + u_char *outp; + int outlen; + + outp = outpacket_buf; + if(us->cbenable!=2){ + len=2; + PUTCHAR(CB_CONF_NO, bufp); + PUTCHAR(len , bufp); + }else{ + len=strlen(address)+5; + PUTCHAR(CB_CONF_USER, bufp); + PUTCHAR(len, bufp); + PUTCHAR(delay, bufp); + PUTCHAR(1, bufp); + BCOPY(address,bufp,len-5);bufp+=len-5; + PUTCHAR(0, bufp); + } + LCPDEBUG((LOG_DEBUG, "bbo cbcp_sendack")); + outlen = 4 + len; + MAKEHEADER(outp, PPP_CBCP); + PUTCHAR(CBCP_ACK, outp); + PUTCHAR(us->us_id,outp); + PUTSHORT(outlen, outp); + BCOPY(buf, outp, len); + output(1, outpacket_buf, outlen + PPP_HDRLEN); +{ phase = PHASE_NETWORK; //network_phase(us->us_unit); + ipcp_open(us->us_unit); +#ifdef IPX_CHANGE + ipxcp_open(us->us_unit); +#endif /* IPX_CHANGE */ + ccp_open(us->us_unit); } + +if(us->cbenable==2){ // spustenie programu na volanie (pripravi mgetty). +char *argv[4]; + argv[0] = "/etc/ppp/callbackser"; //progam + argv[1] = cbcpuser; //ID + argv[2] = address; // cislo + argv[3] = NULL; + run_program(argv[0], argv, 0); + } +} +int mozecallb(char *kto) +{ + FILE *fp; + char *a; + char riadok[20]; + if(strlen(kto)<2) return 0; + if((fp=fopen("/etc/ppp/callbusers","r"))==NULL) + {syslog(LOG_ERR,"neviem otvorit callbusers");return 0;} + while(fgets(riadok,19,fp)!=NULL){ + if( (a=strchr(riadok,'!'))!=NULL ) *a=0; + if(strcmp(riadok,kto)==0) {fclose(fp); return 1;} + } + fclose(fp);return 0; +} + diff -rN --unified=10 ppp-2.2.0f-23o/pppd/cbcps.h ppp-2.2.0f-23/pppd/cbcps.h --- ppp-2.2.0f-23o/pppd/cbcps.h Thu Jan 1 01:00:00 1970 +++ ppp-2.2.0f-23/pppd/cbcps.h Fri Aug 14 00:11:58 1998 @@ -0,0 +1,34 @@ +/* + * cbcp - Call Back Configuration Protocol. SERVER + * Miro Bobovsky , 13.8.1998 + * robte s tym co chete - GPL a lubovolny iny vse povoliaci. +*/ + +#define PPP_CBCP 0xc029 /* Callback Control Protocol */ +typedef struct cbcp_state { + int us_unit; /* Interface unit number */ + u_char us_id; /* Current id */ + u_char cbenable; // ci je povoleny + char *us_number; /* Telefone Number */ +} cbcp_state; + +void cbcp_init __P((int)); +void cbcp_open __P((int)); +void cbcp_lowerup __P((int)); +void cbcp_input __P((int, u_char *, int)); +void cbcp_protrej __P((int)); +int cbcp_printpkt __P((u_char *, int,void (*) __P((void *, char *, ...)), + void *)); +extern cbcp_state cbcp[]; +extern char cbcpuser[]; +#define CBCP_MINLEN 4 + +#define CBCP_REQ 1 +#define CBCP_RESP 2 +#define CBCP_ACK 3 + +#define CB_CONF_NO 1 +#define CB_CONF_USER 2 +#define CB_CONF_ADMIN 3 +#define CB_CONF_LIST 4 + diff -rN --unified=10 ppp-2.2.0f-23o/pppd/examles/callbusers ppp-2.2.0f-23/pppd/examles/callbusers --- ppp-2.2.0f-23o/pppd/examles/callbusers Thu Jan 1 01:00:00 1970 +++ ppp-2.2.0f-23/pppd/examles/callbusers Fri Aug 14 01:30:26 1998 @@ -0,0 +1,5 @@ +## ludia ktory mozu mat callback +blb! +somar! +bobovsky! +puk! diff -rN --unified=10 ppp-2.2.0f-23o/pppd/lcp.c ppp-2.2.0f-23/pppd/lcp.c --- ppp-2.2.0f-23o/pppd/lcp.c Mon Jul 27 11:32:07 1998 +++ ppp-2.2.0f-23/pppd/lcp.c Thu Aug 13 21:07:10 1998 @@ -121,20 +121,21 @@ int lcp_loopbackfail = DEFLOOPBACKFAIL; /* * Length of each type of configuration option (in octets) */ #define CILEN_VOID 2 #define CILEN_SHORT 4 /* CILEN_VOID + sizeof(short) */ #define CILEN_CHAP 5 /* CILEN_VOID + sizeof(short) + 1 */ #define CILEN_LONG 6 /* CILEN_VOID + sizeof(long) */ #define CILEN_LQR 8 /* CILEN_VOID + sizeof(short) + sizeof(long) */ +#define CILEN_CBCP 3 #define CODENAME(x) ((x) == CONFACK ? "ACK" : \ (x) == CONFNAK ? "NAK" : "REJ") /* * lcp_init - Initialize LCP. */ void lcp_init(unit) @@ -158,32 +159,34 @@ wo->mru = DEFMRU; wo->neg_asyncmap = 0; wo->asyncmap = 0; wo->neg_chap = 0; /* Set to 1 on server */ wo->neg_upap = 0; /* Set to 1 on server */ wo->chap_mdtype = CHAP_DIGEST_MD5; wo->neg_magicnumber = 1; wo->neg_pcompression = 1; wo->neg_accompression = 1; wo->neg_lqr = 0; /* no LQR implementation yet */ + wo->neg_cbcp = 0; ao->neg_mru = 1; ao->mru = MAXMRU; ao->neg_asyncmap = 1; ao->asyncmap = 0; ao->neg_chap = 1; ao->chap_mdtype = CHAP_DIGEST_MD5; ao->neg_upap = 1; ao->neg_magicnumber = 1; ao->neg_pcompression = 1; ao->neg_accompression = 1; ao->neg_lqr = 0; /* no LQR implementation yet */ + ao->neg_cbcp = 0; memset(xmit_accm[unit], 0, sizeof(xmit_accm[0])); xmit_accm[unit][3] = 0x60000000; } /* * lcp_open - LCP is allowed to come up. */ void @@ -480,29 +483,31 @@ lcp_cilen(f) fsm *f; { lcp_options *go = &lcp_gotoptions[f->unit]; #define LENCIVOID(neg) (neg ? CILEN_VOID : 0) #define LENCICHAP(neg) (neg ? CILEN_CHAP : 0) #define LENCISHORT(neg) (neg ? CILEN_SHORT : 0) #define LENCILONG(neg) (neg ? CILEN_LONG : 0) #define LENCILQR(neg) (neg ? CILEN_LQR: 0) +#define LENCICBCP(neg) (neg ? CILEN_CBCP: 0) /* * NB: we only ask for one of CHAP and UPAP, even if we will * accept either. */ return (LENCISHORT(go->neg_mru) + LENCILONG(go->neg_asyncmap) + LENCICHAP(go->neg_chap) + LENCISHORT(!go->neg_chap && go->neg_upap) + LENCILQR(go->neg_lqr) + + LENCICBCP(go->neg_cbcp) + LENCILONG(go->neg_magicnumber) + LENCIVOID(go->neg_pcompression) + LENCIVOID(go->neg_accompression)); } /* * lcp_addci - Add our desired CIs to a packet. */ static void @@ -539,25 +544,35 @@ PUTLONG(val, ucp); \ } #define ADDCILQR(opt, neg, val) \ if (neg) { \ PUTCHAR(opt, ucp); \ PUTCHAR(CILEN_LQR, ucp); \ PUTSHORT(PPP_LQR, ucp); \ PUTLONG(val, ucp); \ } +// pre zostrojenie otazky na licitaciu - conf calback +#define ADDCICBCP(opt, neg, val) \ + if (neg) { \ + LCPDEBUG((LOG_INFO, "Bbo ADDCIBCP")); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_CBCP, ucp); \ + PUTCHAR(val, ucp); \ + } + ADDCISHORT(CI_MRU, go->neg_mru, go->mru); ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap, go->asyncmap); ADDCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype); ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP); ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period); + ADDCICBCP(CI_CALLBACK, go->neg_cbcp, CBCP_OPT); ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber); ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression); ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression); if (ucp - start_ucp != *lenp) { /* this should never happen, because peer_mtu should be 1500 */ syslog(LOG_ERR, "Bug in lcp_addci: wrong length"); } } @@ -602,20 +617,35 @@ goto bad; \ GETCHAR(citype, p); \ GETCHAR(cilen, p); \ if (cilen != CILEN_SHORT || \ citype != opt) \ goto bad; \ GETSHORT(cishort, p); \ if (cishort != val) \ goto bad; \ } +// prijem potvrdenia cbcp. +#define ACKCICBCP(opt, neg, val) \ + if (neg) { \ + LCPDEBUG((LOG_INFO, "Bbo ACKCICBCP")); \ + if ((len -= CILEN_CBCP) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_CBCP || \ + citype != opt) \ + goto bad; \ + GETCHAR(cichar, p); \ + if (cichar != val) \ + goto bad; \ + } #define ACKCICHAP(opt, neg, val, digest) \ if (neg) { \ if ((len -= CILEN_CHAP) < 0) \ goto bad; \ GETCHAR(citype, p); \ GETCHAR(cilen, p); \ if (cilen != CILEN_CHAP || \ citype != opt) \ goto bad; \ GETSHORT(cishort, p); \ @@ -653,20 +683,21 @@ GETLONG(cilong, p); \ if (cilong != val) \ goto bad; \ } ACKCISHORT(CI_MRU, go->neg_mru, go->mru); ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap, go->asyncmap); ACKCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype); ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP); ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period); + ACKCICBCP(CI_CALLBACK, go->neg_cbcp, CBCP_OPT); ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber); ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression); ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression); /* * If there are any remaining CIs, then this packet is bad. */ if (len != 0) goto bad; return (1); @@ -724,20 +755,33 @@ len >= CILEN_CHAP && \ p[1] == CILEN_CHAP && \ p[0] == opt) { \ len -= CILEN_CHAP; \ INCPTR(2, p); \ GETSHORT(cishort, p); \ GETCHAR(cichar, p); \ no.neg = 1; \ code \ } +// hmmm tu sa mi nikdy nedostal ale som to opajcoval podla readme.cbcp +#define NAKCICBCP(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_CBCP && \ + p[1] == CILEN_CBCP && \ + p[0] == opt) { \ + LCPDEBUG((LOG_INFO, "Bbo NAKCICBCP")); \ + len -= CILEN_CBCP; \ + INCPTR(2, p); \ + GETCHAR(cichar, p); \ + no.neg = 1; \ + code \ + } #define NAKCISHORT(opt, neg, code) \ if (go->neg && \ len >= CILEN_SHORT && \ p[1] == CILEN_SHORT && \ p[0] == opt) { \ len -= CILEN_SHORT; \ INCPTR(2, p); \ GETSHORT(cishort, p); \ no.neg = 1; \ code \ @@ -846,20 +890,25 @@ * to stop asking for LQR. We haven't got any other protocol. * If they Nak the reporting period, take their value XXX ? */ NAKCILQR(CI_QUALITY, neg_lqr, if (cishort != PPP_LQR) try.neg_lqr = 0; else try.lqr_period = cilong; ); +// Only implementing CBCP... not the rest of the callback options + NAKCICBCP(CI_CALLBACK, neg_cbcp, + try.neg_cbcp = 0; + ); + /* * Check for a looped-back line. */ NAKCILONG(CI_MAGICNUMBER, neg_magicnumber, try.magicnumber = magic(); looped_back = 1; ); /* * Peer shouldn't send Nak for protocol compression or @@ -1053,28 +1102,45 @@ len -= CILEN_LQR; \ INCPTR(2, p); \ GETSHORT(cishort, p); \ GETLONG(cilong, p); \ /* Check rejected value. */ \ if (cishort != PPP_LQR || cilong != val) \ goto bad; \ try.neg = 0; \ LCPDEBUG((LOG_INFO,"lcp_rejci rejected LQR opt %d", opt)); \ } +// Klinet na moju otazku odpoveda ze si nepraje cbcp. +#define REJCICBCP(opt, neg, val) \ + if (go->neg && \ + len >= CILEN_CBCP && \ + p[1] == CILEN_CBCP && \ + p[0] == opt) { \ + LCPDEBUG((LOG_INFO, "Bbo REJCICBCP")); \ + len -= CILEN_CBCP; \ + INCPTR(2, p); \ + GETCHAR(cichar, p); \ + /* Check rejected value. */ \ + if (cichar != val) \ + goto bad; \ + try.neg = 0; \ + LCPDEBUG((LOG_INFO,"lcp_rejci rejected Callback opt %d", opt)); \ + } REJCISHORT(CI_MRU, neg_mru, go->mru); REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap); REJCICHAP(CI_AUTHTYPE, neg_chap, PPP_CHAP, go->chap_mdtype); if (!go->neg_chap) { REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP); } REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period); + REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT); REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber); REJCIVOID(CI_PCOMPRESSION, neg_pcompression); REJCIVOID(CI_ACCOMPRESSION, neg_accompression); /* * If there are any remaining CIs, then this packet is bad. */ if (len != 0) goto bad; /* @@ -1359,20 +1425,29 @@ case CI_ACCOMPRESSION: LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd ACCOMPRESSION")); if (!ao->neg_accompression || cilen != CILEN_VOID) { orc = CONFREJ; break; } ho->neg_accompression = 1; break; + case CI_CALLBACK: // on mi ponuka cbcp a co ja na to. + LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd Bbo callback")); + if (!ao->neg_cbcp || + cilen != CILEN_CBCP) { + orc = CONFREJ; + break; + } + ho->neg_cbcp = 1; + break; default: LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd unknown option %d", citype)); orc = CONFREJ; break; } endswitch: LCPDEBUG((LOG_INFO, " (%s)", CODENAME(orc))); @@ -1462,20 +1537,21 @@ ppp_recv_config(f->unit, (go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU), (go->neg_asyncmap? go->asyncmap: 0x00000000), go->neg_pcompression, go->neg_accompression); if (ho->neg_mru) peer_mru[f->unit] = ho->mru; ChapLowerUp(f->unit); /* Enable CHAP */ upap_lowerup(f->unit); /* Enable UPAP */ + cbcp_lowerup(f->unit); /* Enable CBCP i tak to nic neurobi */ #ifdef IPX_CHANGE ipxcp_lowerup(f->unit); /* Enable IPXCP */ #endif /* IPX_CHANGE */ ipcp_lowerup(f->unit); /* Enable IPCP */ ccp_lowerup(f->unit); /* Enable CCP */ lcp_echo_lowerup(f->unit); /* Enable echo messages */ link_established(f->unit); } @@ -1627,20 +1703,35 @@ } break; case CI_QUALITY: if (olen >= CILEN_SHORT) { p += 2; printer(arg, "quality "); GETSHORT(cishort, p); switch (cishort) { case PPP_LQR: printer(arg, "lqr"); + break; + default: + printer(arg, "0x%x", cishort); + } + } + break; + case CI_CALLBACK: // pre ake take vypisy paketov + LCPDEBUG((LOG_INFO, "Bbo CI_CALLBACK case")); + if (olen >= CILEN_CBCP) { + p += 2; + printer(arg, "callback "); + GETCHAR(code, p); + switch (code) { + case CBCP_OPT: + printer(arg, "CBCP"); break; default: printer(arg, "0x%x", cishort); } } break; case CI_MAGICNUMBER: if (olen == CILEN_LONG) { p += 2; GETLONG(cilong, p); diff -rN --unified=10 ppp-2.2.0f-23o/pppd/lcp.h ppp-2.2.0f-23/pppd/lcp.h --- ppp-2.2.0f-23o/pppd/lcp.h Tue Nov 21 21:15:16 1995 +++ ppp-2.2.0f-23/pppd/lcp.h Mon Aug 10 20:09:35 1998 @@ -22,44 +22,47 @@ /* * Options. */ #define CI_MRU 1 /* Maximum Receive Unit */ #define CI_ASYNCMAP 2 /* Async Control Character Map */ #define CI_AUTHTYPE 3 /* Authentication Type */ #define CI_QUALITY 4 /* Quality Protocol */ #define CI_MAGICNUMBER 5 /* Magic Number */ #define CI_PCOMPRESSION 7 /* Protocol Field Compression */ #define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ +#define CI_CALLBACK 13 /* callback */ /* * LCP-specific packet types. */ #define PROTREJ 8 /* Protocol Reject */ #define ECHOREQ 9 /* Echo Request */ #define ECHOREP 10 /* Echo Reply */ #define DISCREQ 11 /* Discard Request */ +#define CBCP_OPT 6 /* Use callback control protocol */ /* * The state of options is described by an lcp_options structure. */ typedef struct lcp_options { int passive : 1; /* Don't die if we don't get a response */ int silent : 1; /* Wait for the other end to start first */ int restart : 1; /* Restart vs. exit after close */ int neg_mru : 1; /* Negotiate the MRU? */ int neg_asyncmap : 1; /* Negotiate the async map? */ int neg_upap : 1; /* Ask for UPAP authentication? */ int neg_chap : 1; /* Ask for CHAP authentication? */ int neg_magicnumber : 1; /* Ask for magic number? */ int neg_pcompression : 1; /* HDLC Protocol Field Compression? */ int neg_accompression : 1; /* HDLC Address/Control Field Compression? */ int neg_lqr : 1; /* Negotiate use of Link Quality Reports */ + int neg_cbcp : 1; /* Negotiate use of CBCP */ u_short mru; /* Value of MRU */ u_char chap_mdtype; /* which MD type (hashing algorithm) */ u_int32_t asyncmap; /* Value of async map */ u_int32_t magicnumber; int numloops; /* Number of loops during magic number neg. */ u_int32_t lqr_period; /* Reporting period for LQR 1/100ths second */ } lcp_options; extern fsm lcp_fsm[]; extern lcp_options lcp_wantoptions[]; diff -rN --unified=10 ppp-2.2.0f-23o/pppd/main.c ppp-2.2.0f-23/pppd/main.c --- ppp-2.2.0f-23o/pppd/main.c Mon Jul 27 11:32:07 1998 +++ ppp-2.2.0f-23/pppd/main.c Thu Aug 13 20:34:56 1998 @@ -48,20 +48,21 @@ #ifdef IPX_CHANGE #include "ipxcp.h" #endif /* IPX_CHANGE */ #include "upap.h" #include "chap.h" #include "ccp.h" #include "pathnames.h" #include "patchlevel.h" +#include "cbcps.h" /* * If REQ_SYSOPTIONS is defined to 1, pppd will not run unless * /etc/ppp/options exists. */ #ifndef REQ_SYSOPTIONS #define REQ_SYSOPTIONS 1 #endif /* interface vars */ @@ -148,20 +149,22 @@ #ifdef IPX_CHANGE { PPP_IPXCP, ipxcp_init, ipxcp_input, ipxcp_protrej, ipxcp_printpkt, NULL, "IPXCP" }, #endif /* IPX_CHANGE */ { PPP_PAP, upap_init, upap_input, upap_protrej, upap_printpkt, NULL, "PAP" }, { PPP_CHAP, ChapInit, ChapInput, ChapProtocolReject, ChapPrintPkt, NULL, "CHAP" }, { PPP_CCP, ccp_init, ccp_input, ccp_protrej, ccp_printpkt, ccp_datainput, "CCP" }, + { PPP_CBCP, cbcp_init, cbcp_input, cbcp_protrej, + cbcp_printpkt, NULL, "CBCP" }, }; #define N_PROTO (sizeof(prottbl) / sizeof(prottbl[0])) main(argc, argv) int argc; char *argv[]; { int i, nonblock; struct sigaction sa; diff -rN --unified=10 ppp-2.2.0f-23o/pppd/options.c ppp-2.2.0f-23/pppd/options.c --- ppp-2.2.0f-23o/pppd/options.c Mon Jul 27 11:32:07 1998 +++ ppp-2.2.0f-23/pppd/options.c Thu Aug 13 20:46:25 1998 @@ -34,20 +34,21 @@ #include #include #include #include "pppd.h" #include "pathnames.h" #include "patchlevel.h" #include "fsm.h" #include "lcp.h" #include "ipcp.h" +#include "cbcps.h" #ifdef IPX_CHANGE #include "ipxcp.h" #endif /* IPX_CHANGE */ #include "upap.h" #include "chap.h" #include "ccp.h" #include @@ -123,20 +124,21 @@ static int reqchap __P((void)); static int setspeed __P((char *)); static int noaccomp __P((void)); static int noasyncmap __P((void)); static int noipaddr __P((void)); static int nomagicnumber __P((void)); static int setasyncmap __P((char **)); static int setescape __P((char **)); static int setmru __P((char **)); static int setmtu __P((char **)); +static int setcbcp __P((void)); static int nomru __P((void)); static int nopcomp __P((void)); static int setconnector __P((char **)); static int setdisconnector __P((char **)); static int setdomain __P((char **)); static int setnetmask __P((char **)); static int setcrtscts __P((void)); static int setnocrtscts __P((void)); static int setxonxoff __P((void)); static int setnodetach __P((void)); @@ -241,20 +243,21 @@ {"connect", 1, setconnector}, /* A program to set up a connection */ {"disconnect", 1, setdisconnector}, /* program to disconnect serial dev. */ {"crtscts", 0, setcrtscts}, /* set h/w flow control */ {"-crtscts", 0, setnocrtscts}, /* clear h/w flow control */ {"xonxoff", 0, setxonxoff}, /* set s/w flow control */ {"debug", 0, setdebug}, /* Increase debugging level */ {"kdebug", 1, setkdebug}, /* Enable kernel-level debugging */ {"domain", 1, setdomain}, /* Add given domain name to hostname*/ {"mru", 1, setmru}, /* Set MRU value for negotiation */ {"mtu", 1, setmtu}, /* Set our MTU */ + {"cb", 0, setcbcp}, {"netmask", 1, setnetmask}, /* set netmask */ {"passive", 0, setpassive}, /* Set passive mode */ {"silent", 0, setsilent}, /* Set silent mode */ {"modem", 0, setmodem}, /* Use modem control lines */ {"local", 0, setlocal}, /* Don't use modem control lines */ {"lock", 0, setlock}, /* Lock serial device (with lock file) */ {"name", 1, setname}, /* Set local name for authentication */ {"user", 1, setuser}, /* Set username for PAP auth with peer */ {"usehostname", 0, setusehostname}, /* Must use hostname for auth. */ {"remotename", 1, setremote}, /* Set remote name for authentication */ @@ -994,20 +997,27 @@ return 0; if (mtu < MINMRU || mtu > MAXMRU) { fprintf(stderr, "mtu option value of %ld is too %s\n", mtu, (mtu < MINMRU? "small": "large")); return 0; } lcp_allowoptions[0].mru = mtu; return (1); } +static int +setcbcp() +{ +lcp_wantoptions[0].neg_cbcp = 1; // poslem licitaciu na cbcp +lcp_allowoptions[0].neg_cbcp = 1; // ak bude pytat cbcp potvrdim. +return(1); +} /* * nopcomp - Disable Protocol field compression negotiation. */ static int nopcomp() { lcp_wantoptions[0].neg_pcompression = 0; lcp_allowoptions[0].neg_pcompression = 0; return (1); diff -rN --unified=10 ppp-2.2.0f-23o/pppd/pppd.h ppp-2.2.0f-23/pppd/pppd.h --- ppp-2.2.0f-23o/pppd/pppd.h Mon Jul 27 11:32:07 1998 +++ ppp-2.2.0f-23/pppd/pppd.h Tue Aug 11 17:25:06 1998 @@ -85,22 +85,23 @@ extern int disable_defaultip; /* Don't use hostname for default IP adrs */ extern char *ipparam; /* Extra parameter for ip up/down scripts */ extern int cryptpap; /* Others' PAP passwords are encrypted */ /* * Values for phase. */ #define PHASE_DEAD 0 #define PHASE_ESTABLISH 1 #define PHASE_AUTHENTICATE 2 -#define PHASE_NETWORK 3 -#define PHASE_TERMINATE 4 +#define PHASE_CALLBACK 3 +#define PHASE_NETWORK 4 +#define PHASE_TERMINATE 5 /* * Prototypes. */ void quit __P((void)); /* Cleanup and exit */ void timeout __P((void (*)(), caddr_t, int)); /* Look-alike of kernel's timeout() */ void untimeout __P((void (*)(), caddr_t)); /* Look-alike of kernel's untimeout() */ void output __P((int, u_char *, int)); diff -rN --unified=10 ppp-2.2.0f-23o/pppd/chap.c ppp-2.2.0f-23/pppd/chap.c --- ppp-2.2.0f-23o/pppd/chap.c Tue Sep 1 11:06:17 1998 +++ ppp-2.2.0f-23/pppd/chap.c Tue Sep 1 12:05:12 1998 @@ -508,29 +508,31 @@ break; default: CHAPDEBUG((LOG_INFO, "unknown digest type %d", cstate->chal_type)); } } ChapSendStatus(cstate, code); if (code == CHAP_SUCCESS) { + syslog(LOG_NOTICE, "CHAP login ok:%s",rhostname); old_state = cstate->serverstate; cstate->serverstate = CHAPSS_OPEN; if (old_state == CHAPSS_INITIAL_CHAL) { auth_peer_success(cstate->unit, PPP_CHAP); } if (cstate->chal_interval != 0) TIMEOUT(ChapRechallenge, (caddr_t) cstate, cstate->chal_interval); } else { + syslog(LOG_NOTICE, "CHAP login error:%s",rhostname); syslog(LOG_ERR, "CHAP peer authentication failed"); cstate->serverstate = CHAPSS_BADAUTH; auth_peer_fail(cstate->unit, PPP_CHAP); } } /* * ChapReceiveSuccess - Receive Success */ static void