00001 #ifdef HAVE_CONFIG_H
00002 #include <config.h>
00003 #endif
00004
00005 #include "n2nc.h"
00006 #include "filter.h"
00007 #include "packetmanager.h"
00008 #include "filteradapter.h"
00009 #include "filters/filterblowfish.h"
00010 #include "utils.h"
00011 #include "libvdeplug_dyn.h"
00012
00013 #include <fstream>
00014
00015 using namespace n2nc;
00016 using namespace std;
00017
00018 namespace n2nc{
00019
00020 struct myconf_t myconf;
00021
00022 int stdinoutAttach(net::Socket *srv_sock, FilterAdapter &fa);
00023 int vdeAttach(net::Socket *srv_sock, FilterAdapter &fa);
00024 int loadArgsHelper(int argc,char **argv);
00025 int passivemode(net::Socket *ctl_sock, net::Socket &srv_sock, FilterAdapter &fa);
00026 int activemode(net::Socket *ctl_sock, net::Socket &srv_sock, FilterAdapter &fa);
00027 int punching(net::Socket &srv_sock);
00028
00029 Server::packet *sendMSG(net::Socket *ctl_sock,Server::server_command cmd) ;
00030 Server::packet *awaitMSG(net::Socket *ctl_sock,Server::server_command cmd, Server::packet *recvpk) ;
00031
00032 Server::packet *sendMSG(net::Socket *ctl_sock,Server::server_command cmd){
00033 Server::packet pk;
00034 bzero(&pk,sizeof(pk));
00035 pk.cmd=cmd ;
00036 pk.src = myconf.myid ;
00037 pk.dst = myconf.otherid ;
00038 ctl_sock->send((void*)&pk,sizeof(pk));
00039 }
00040
00041 Server::packet *awaitMSG(net::Socket *ctl_sock,Server::server_command cmd, Server::packet *recvpk){
00042 ctl_sock->recv(recvpk,sizeof(Server::packet));
00043 if (recvpk->cmd == cmd )
00044 return recvpk;
00045 else
00046 return NULL ;
00047 }
00048
00049 int punching(net::Socket &srv_sock){
00050 bool imreceiving = false;
00051 bool imsending = false;
00052 int timeoutcicles = 1000 ;
00053 struct timespec ts ;
00054 ts.tv_sec = 0;
00055 ts.tv_nsec = 10000000L ;
00056 PacketManager::srv_packet_header srv_pk ;
00057 PacketManager::srv_packet_header srv_pk_recv ;
00058
00059
00060 while( (!(imsending && imreceiving)) && --timeoutcicles){
00061 bzero(&srv_pk,sizeof(srv_pk));
00062 srv_pk.h_type = PacketManager::SRV_PK_GARBAGE ;
00063
00064 srv_sock.send(&srv_pk,sizeof(srv_pk));
00065
00066 if (srv_sock.recvCheck() >= sizeof(srv_pk_recv)){
00067
00068 srv_sock.recv(&srv_pk_recv,sizeof(srv_pk_recv));
00069 switch(srv_pk_recv.h_type){
00070 case PacketManager::SRV_PK_GARBAGE :
00071 bzero(&srv_pk,sizeof(srv_pk));
00072 srv_pk.h_type = PacketManager::SRV_PK_GARBAGE_ACK ;
00073
00074 srv_sock.send(&srv_pk,sizeof(srv_pk));
00075 imreceiving = true ;
00076 std::cerr << "RECEIVED GARBAGE" << std::endl ;
00077 break ;
00078
00079 case PacketManager::SRV_PK_GARBAGE_ACK :
00080 imsending = true ;
00081 std::cerr << "RECEIVED GARBAGE_ACK" << std::endl ;
00082 break ;
00083 }
00084 }
00085 ::nanosleep(&ts,NULL);
00086 }
00087
00088 if (!timeoutcicles){
00089 std::cerr << "timeoutcicles expires"<< std::endl ;
00090 return 0 ;
00091 }
00092
00093 while (srv_sock.recvCheck() > 0 && srv_sock.recv(&srv_pk_recv,sizeof(srv_pk_recv)))
00094 ;
00095 return 1 ;
00096 }
00097
00098 int loadArgsHelper(int argc,char **argv){
00099 utils::args::ArgumentsHelper args(argv, argc) ;
00100 utils::args::ValidArgument* t_val ;
00101 string filterdir ;
00102 string homedir = getenv ("HOME");
00103
00104 t_val = args.addValid("-sport");
00105 t_val->comment = "server port" ;
00106 t_val->paramlist_pattern.push_back("d") ;
00107
00108 t_val = args.addValid("-saddr");
00109 t_val->comment = "server address" ;
00110 t_val->paramlist_pattern.push_back("s") ;
00111 t_val->paramrequired = true ;
00112
00113 t_val = args.addValid("-bindip");
00114 t_val->comment = "bind service port to ip" ;
00115 t_val->paramlist_pattern.push_back("s") ;
00116 t_val->paramrequired = true ;
00117
00118 t_val = args.addValid("-keydir");
00119 t_val->comment = "rsa key directory" ;
00120 t_val->paramlist_pattern.push_back("s") ;
00121
00122 t_val = args.addValid("-filterdir");
00123 t_val->comment = "filter modules directory" ;
00124 t_val->paramlist_pattern.push_back("s") ;
00125 t_val->paramrequired = true ;
00126
00127 t_val = args.addValid("-myid");
00128 t_val->paramlist_pattern.push_back("s") ;
00129 t_val->comment = "my id" ;
00130
00131 t_val = args.addValid("-otherid");
00132 t_val->paramlist_pattern.push_back("s") ;
00133 t_val->comment = "endpoint id" ;
00134
00135 t_val = args.addValid("-vdesock");
00136 t_val->paramlist_pattern.push_back("s") ;
00137 t_val->comment = "vde socket control dir" ;
00138 t_val->defaultparam = "/tmp/vde.ctl/" ;
00139
00140 t_val = args.addValid("-mysrvport");
00141 t_val->paramlist_pattern.push_back("d") ;
00142 t_val->comment = "my service port" ;
00143
00144 t_val = args.addValid("-mtu");
00145 t_val->paramlist_pattern.push_back("d") ;
00146 t_val->comment = "max transfer unit to send" ;
00147
00148 t_val = args.addValid("-mss");
00149 t_val->paramlist_pattern.push_back("d") ;
00150 t_val->comment = "maximum segment size to read" ;
00151
00152 t_val = args.addValid("-p");
00153 t_val->comment = "passive mode" ;
00154
00155
00156 cerr << args.dumpAllValid() ;
00157 cerr << args.toString() << endl ;
00158
00159 cerr << "valid?: " << args.validate() << endl ;
00160
00161 if (args["-p"]){
00162 cerr << "passive mode" << endl ;
00163 myconf.mode_isactive = false ;
00164 }else{
00165 cerr << "active mode" << endl ;
00166 myconf.mode_isactive = true ;
00167 }
00168
00169 if (args["-myid"]){
00170 cerr << args["-myid"]->param() << endl ;
00171 myconf.myid = utils::stringToHex(args["-myid"]->param() );
00172 }else{
00173
00174 if(myconf.mode_isactive)
00175 myconf.myid = 1234 ;
00176 else
00177 myconf.myid = 4321 ;
00178 }
00179
00180 if (args["-otherid"]){
00181 cerr << args["-otherid"]->param() << endl ;
00182 myconf.otherid = utils::stringToHex(args["-otherid"]->param() );
00183 }else{
00184
00185 if(!myconf.mode_isactive)
00186 myconf.otherid = 1234 ;
00187 else
00188 myconf.otherid = 4321 ;
00189 }
00190
00191 if (args["-mysrvport"]){
00192 cerr << args["-mysrvport"]->param() << endl ;
00193 myconf.mysrvport = atoi (args["-mysrvport"]->param().c_str());
00194 }else{
00195
00196 if(myconf.mode_isactive)
00197 myconf.mysrvport = 2345 ;
00198 else
00199 myconf.mysrvport = 5432 ;
00200 }
00201
00202 if (args["-sport"]){
00203 myconf.sport = atoi (args["-sport"]->param().c_str());
00204 }else{
00205 myconf.sport = 5555 ;
00206 }
00207
00208 if (args["-vdesock"]){
00209 myconf.vdepath = args["-vdesock"]->param();
00210 }
00211
00212 if (args["-keydir"]){
00213 myconf.keydir = args["-keydir"]->param();
00214 }else{
00215
00216 myconf.keydir = homedir + "/.n2nc/keyring";
00217 }
00218
00219 if (args["-saddr"]){
00220 myconf.saddr = args["-saddr"]->param();
00221 }else{
00222
00223 myconf.saddr = "127.0.0.1" ;
00224 }
00225
00226 if (args["-bindip"]){
00227 myconf.bind_ip = args["-bindip"]->param();
00228 }else{
00229 myconf.bind_ip = "127.0.0.1" ;
00230
00231 }
00232
00233 if (args["-mtu"]){
00234 myconf.mss = atoi( args["-mtu"]->param().c_str() );
00235 }else{
00236 myconf.mss = 0 ;
00237 }
00238
00239 if (args["-filterdir"]){
00240 filterdir = args["-filterdir"]->param() ;
00241 }else{
00242
00243 filterdir = "/home/fab/myproject/n2nc-wc/n2nc/trunk/debug/src/filters/.libs/" ;
00244
00245 }
00246
00247 string loadfilterfname = homedir + "/.n2nc/loadfilters" ;
00248 fstream filestr (loadfilterfname.c_str(), fstream::in);
00249 if (!filestr.is_open()){
00250 std::cerr << "WARNING: NO ~/.n2nc/loadfilters file found." << loadfilterfname << std::endl ;
00251 }
00252 char plugin_fname[255];
00253 while(filestr.is_open() && !filestr.eof()){
00254 filestr.getline(plugin_fname,255);
00255 if (plugin_fname[0] == '#' || (strlen(plugin_fname) < 1)) continue ;
00256 myconf.plugins.push_back(filterdir + "/" + plugin_fname);
00257 }
00258
00259
00260
00261 std::cerr << "CONFIGURATION. ID:" << std::hex << myconf.myid << "\tSERVICEPORT: " << myconf.mysrvport << std::endl ;
00262 std::cerr << "CONFIGURATION. OTHERID:" << std::hex << myconf.otherid << "\tOTHERSERVICEPORT: " << myconf.othersrvport << std::endl ;
00263 }
00264
00265 int passivemode(net::Socket *ctl_sock, net::Socket &srv_sock, FilterAdapter &fa){
00266 Server::packet pk , recvpk ;
00267 net::SocketAddress *peer_srv_sa ;
00268 PacketManager::srv_packet_header srv_pk_recv ;
00269
00270
00271 char ciphertext[128];
00272 security::Rsa rsa;
00273 std::ostringstream os ;
00274 os << myconf.keydir << "/" << std::hex << myconf.myid << ".pri" ;
00275
00276 std::cerr << "loading rsa private key: " << os.str() << std::endl ;
00277 if (rsa.loadPriFromFile(os.str()) == -1){
00278 cerr << "fatal error on loading private key: " << os.str() << std::endl ;
00279 exit(1);
00280 }
00281
00282
00283 reawait:
00284
00285 if (awaitMSG(ctl_sock,Server::CMD_CONNECT,&recvpk))
00286 std::cerr << "CMD_CONNECT RECEIVED from ID: " << hex << recvpk.src << std::endl ;
00287 else{
00288 std::cerr << "SOME COMMAND RECEIVED but not expected. Restart" << std::endl ;
00289 goto reawait;
00290 }
00291
00292 myconf.otherid = recvpk.src ;
00293
00294
00295 sendMSG(ctl_sock,Server::CMD_GET_CLIENT_INFO);
00296
00297
00298 if (awaitMSG(ctl_sock,Server::CMD_GET_CLIENT_INFO_REPLY,&recvpk))
00299 std::cerr << "CMD_GET_CLIENT_INFO_REPLY RECEIVED" << std::endl ;
00300 else{
00301 std::cerr << "CMD_GET_CLIENT_INFO_REPLY NOT RECEIVED" << std::endl ;
00302 exit (255);
00303 }
00304
00305 if (recvpk.msg == Server::MSG_NOT_FOUND){
00306 std::cerr << "PEER NOT FOUND: " << hex << myconf.otherid << std::endl ;
00307 exit (255);
00308 }else if (recvpk.msg == Server::MSG_OK){
00309
00310 std::cerr << "PEER FOUND: " << hex << myconf.otherid << std::endl ;
00311 }
00312
00313 peer_srv_sa = new net::SocketAddress((struct sockaddr*) &recvpk.srv_addr);
00314 std::cerr << "other peer has:" << peer_srv_sa->toString()<< std::endl ;
00315
00316
00317 sendMSG(ctl_sock,Server::CMD_CONNECT_ACK);
00318 std::cerr << "SENDING CMD_CONNECT_ACK to:" << hex << myconf.otherid << std::endl ;
00319
00320 srv_sock.open(*peer_srv_sa);
00321
00322 if (punching(srv_sock)){
00323 std::cerr << "connection established successflully" << std::endl ;
00324 }else{
00325 std::cerr << "there was a problem to connect" << std::endl ;
00326 exit (255);
00327 }
00328
00329
00330 sendMSG(ctl_sock,Server::CMD_CONNECT_OK);
00331 std::cerr << "SENDING CMD_CONNECT_OK to:" << hex << myconf.otherid << std::endl ;
00332
00333
00334
00335
00336 if (awaitMSG(ctl_sock,Server::CMD_CONNECT_OK_ACK,&recvpk))
00337 std::cerr << "CMD_CONNECT_OK_ACK RECEIVED" << std::endl ;
00338 else{
00339 std::cerr << "CMD_CONNECT_OK_ACK NOT RECEIVED" << std::endl ;
00340 exit (255);
00341 }
00342
00343
00344 while (srv_sock.recvCheck() > 0 && srv_sock.recv(&srv_pk_recv,sizeof(srv_pk_recv))) ;
00345
00346
00347 if (awaitMSG(ctl_sock,Server::CMD_SMSG,&recvpk)){
00348 rsa.decrypt(recvpk.smsg,ciphertext,128);
00349 ::memcpy(&myconf.skey,ciphertext,sizeof(myconf.skey));
00350 std::cerr << "CMD_SMSG RECEIVED. session key: " << ciphertext << std::endl ;
00351 }
00352 else{
00353 std::cerr << "CMD_SMSG NOT RECEIVED" << std::endl ;
00354 exit (255);
00355 }
00356
00357 sendMSG(ctl_sock,Server::CMD_SMSG_ACK);
00358 std::cerr << "SENDING CMD_SMSG_ACK to:" << hex << myconf.otherid << std::endl ;
00359
00360 if (myconf.vdepath != "")
00361 vdeAttach(&srv_sock,fa);
00362 else
00363 stdinoutAttach(&srv_sock,fa);
00364
00365
00366
00367 return 0 ;
00368 }
00369
00370 int activemode(net::Socket *ctl_sock, net::Socket &srv_sock, FilterAdapter &fa){
00371 bool imreceiving = false;
00372 bool imsending = false;
00373 Server::packet pk , recvpk ;
00374 net::SocketAddress *peer_srv_sa ;
00375 PacketManager::srv_packet_header srv_pk ;
00376 PacketManager::srv_packet_header srv_pk_recv ;
00377
00378
00379 char ciphertext[128];
00380 security::Rsa rsa;
00381 std::ostringstream os ;
00382 os << myconf.keydir << "/" << hex << myconf.otherid << ".pub" ;
00383 std::cerr << "loading rsa public key of other peer: " << os.str() << std::endl ;
00384 if (rsa.loadPubFromFile(os.str()) == -1){
00385 exit(1);
00386 }
00387
00388
00389
00390 sendMSG(ctl_sock,Server::CMD_GET_CLIENT_INFO);
00391
00392
00393 if (awaitMSG(ctl_sock,Server::CMD_GET_CLIENT_INFO_REPLY,&recvpk))
00394 std::cerr << "CMD_GET_CLIENT_INFO_REPLY RECEIVED" << std::endl ;
00395 else{
00396 std::cerr << "CMD_GET_CLIENT_INFO_REPLY NOT RECEIVED" << std::endl ;
00397 exit(1);
00398 }
00399
00400 if (recvpk.msg == Server::MSG_NOT_FOUND){
00401
00402 std::cerr << "PEER NOT FOUND: " << hex << myconf.otherid << std::endl ;
00403 exit (255);
00404 }
00405 peer_srv_sa = new net::SocketAddress((struct sockaddr*) &recvpk.srv_addr);
00406 std::cerr << "loading sa. other peer has:" << peer_srv_sa->toString()<< std::endl ;
00407
00408
00409
00410 srv_sock.open(*peer_srv_sa);
00411
00412
00413 sendMSG(ctl_sock,Server::CMD_CONNECT);
00414
00415 if (awaitMSG(ctl_sock,Server::CMD_CONNECT_ACK,&recvpk))
00416 std::cerr << "CMD_CONNECT_ACK RECEIVED, starting garbaging data" << std::endl ;
00417 else{
00418 std::cerr << "CMD_CONNECT_ACK NOT RECEIVED" << std::endl ;
00419 exit (255);
00420 }
00421
00422 if (punching(srv_sock)){
00423 std::cerr << "connection established successflully" << std::endl ;
00424 }else{
00425 std::cerr << "connection failure" << std::endl ;
00426 exit (255);
00427 }
00428
00429
00430
00431
00432 if (awaitMSG(ctl_sock,Server::CMD_CONNECT_OK,&recvpk))
00433 std::cerr << "CMD_CONNECT_OK RECEIVED" << std::endl ;
00434 else{
00435 std::cerr << "CMD_CONNECT_OK NOT RECEIVED" << std::endl ;
00436 exit (255);
00437 }
00438
00439 sendMSG(ctl_sock,Server::CMD_CONNECT_OK_ACK);
00440
00441 while (srv_sock.recvCheck() > 0 && srv_sock.recv(&srv_pk_recv,sizeof(srv_pk_recv))) ;
00442
00443 security::BlowFish::keyRand(&myconf.skey);
00444 std::cerr << "creating random session key: " << myconf.skey.key << std::endl ;
00445 std::cerr << "encrypt smsg len: " << rsa.encrypt((void*)&myconf.skey,ciphertext,sizeof(myconf.skey)) << std::endl ;
00446
00447 bzero(&pk,sizeof(pk));
00448 pk.cmd=Server::CMD_SMSG ;
00449 pk.src = myconf.myid ;
00450 pk.dst = myconf.otherid ;
00451 memcpy(pk.smsg,ciphertext,128);
00452
00453 ctl_sock->send((void*)&pk,sizeof(pk));
00454
00455 if (awaitMSG(ctl_sock,Server::CMD_SMSG_ACK,&recvpk))
00456 std::cerr << "CMD_SMSG_ACK RECEIVED" << std::endl ;
00457 else{
00458 std::cerr << "CMD_SMSG_ACK NOT RECEIVED" << std::endl ;
00459 exit (255);
00460 }
00461
00462 if (myconf.vdepath != "")
00463 vdeAttach(&srv_sock,fa);
00464 else
00465 stdinoutAttach(&srv_sock,fa);
00466
00467 }
00468
00469 int stdinoutAttach(net::Socket *srv_sock, FilterAdapter &fa){
00470 void *stdinbuf = malloc(65535);
00471 void *buf = malloc(65535);
00472
00473 int inlen =0 ;
00474 fd_set readfds ;
00475 int maxfd , sent, mss;
00476 PacketManager::srv_packet_header pk ,recvpk;
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497 mss = MAX_MSS - sizeof(PacketManager::srv_packet_header_t) - fa.getMaxOverHead() ;
00498 mss = (myconf.mss ? myconf.mss : mss) ;
00499
00500
00501
00502 FD_ZERO(&readfds);
00503 FD_SET(0,&readfds);
00504 FD_SET(srv_sock->getFD(),&readfds);
00505 maxfd = srv_sock->getFD() ;
00506 long long tread = 0;
00507 struct timeval tv,tv2;
00508
00509
00510 while (true){
00511 FD_ZERO(&readfds);
00512 FD_SET(0,&readfds);
00513 FD_SET(srv_sock->getFD(),&readfds);
00514 if ( ::select(maxfd+1,&readfds, NULL, NULL, NULL) < 0) {
00515 std::cerr << "problem with select" << ::strerror(errno) << std::endl ;
00516 }
00517 if (FD_ISSET(0,&readfds)){
00518 inlen = ::read(0,stdinbuf,mss );
00519 std::cerr << "**STD <<<<<<<<< STDIN LEN: " << dec << inlen << std::endl ;
00520 if (inlen < 0){
00521 std::cerr << "** >>>>>>>>>> STD_READ.MAIN::STDIN.INLEN -1 " << std::endl ;
00522 continue ;
00523 }
00524 if(inlen > MAX_MPS){
00525 std::cerr << "** >>>>>>>>>> STD_READ.MAIN::STDIN. len exceed mps: " << dec<< inlen << std::endl ;
00526 }
00527
00528 tread += inlen ;
00529 sent = fa.send(stdinbuf,inlen);
00530 std::cerr << "**STD >>>>>>>>>> NETWRITE LEN: " << dec << sent << std::endl ;
00531 std::cerr << std::endl ;
00532
00533 if (!inlen){std::cerr << "reading from stdin 0 byte, sent EOF" << std::endl; }
00534 }
00535 if (FD_ISSET(srv_sock->getFD(),&readfds)){
00536 inlen = fa.recv(buf,MAX_MSS);
00537 std::cerr << "** <<<<<<<<< SOCK READ LEN: " << dec<< inlen << std::endl ;
00538 std::cerr << std::endl ;
00539 if (inlen < 0) continue ;
00540 ::write(1,buf,inlen);
00541
00542 if(!inlen){std::cerr << "MAIN::new_read EOF" << std::endl ; exit(0);}
00543 }
00544 ::fflush(NULL);
00545 }
00546 ::free(stdinbuf);
00547
00548 }
00549
00550 int vdeAttach(net::Socket *srv_sock, FilterAdapter &fa){
00551 void *stdinbuf = malloc(65535);
00552 void *buf = malloc(65535);
00553
00554 int inlen =0 ;
00555 fd_set readfds ;
00556 int maxfd , sent,mss;
00557 PacketManager::srv_packet_header pk ,recvpk;
00558 void *vh;
00559 struct vdepluglib vdeplug ;
00560 libvdeplug_dynopen(vdeplug);
00561 std::cerr << "loading vdeplug library: " << (vdeplug.dl_handle == NULL ? "problem" : "OK") << std::endl ;
00562 vde_open_args vdearg; vdearg.group=NULL ; vdearg.mode=0700, vdearg.port=0 ;
00563 VDECONN *vdec ;
00564 vdec = vdeplug.vde_open(myconf.vdepath.c_str(),"n2nc",&vdearg);
00565 int fdplug = vdeplug.vde_datafd(vdec);
00566
00567 mss = MAX_MSS - sizeof(PacketManager::srv_packet_header_t) - fa.getMaxOverHead() ;
00568 mss = (myconf.mss ? myconf.mss : mss) ;
00569
00570 maxfd = srv_sock->getFD() > fdplug ? srv_sock->getFD() : fdplug ;
00571 long long tread = 0;
00572 struct timeval tv,tv2;
00573
00574 while (true){
00575 FD_ZERO(&readfds);
00576 FD_SET(fdplug,&readfds);
00577 FD_SET(srv_sock->getFD(),&readfds);
00578 if ( ::select(maxfd+1,&readfds, NULL, NULL, NULL) < 0) {
00579 std::cerr << "problem with select" << ::strerror(errno) << std::endl ;
00580 }
00581 if (FD_ISSET(fdplug,&readfds)){
00582 inlen = vdeplug.vde_recv(vdec,stdinbuf,mss,0);
00583
00584
00585 if (inlen < 0){
00586 std::cerr << "** >>>>>>>>>> STD_READ.MAIN::STDIN.INLEN -1 " << std::endl ;
00587 continue ;
00588 }
00589 if(inlen > MAX_MPS){
00590 std::cerr << "** >>>>>>>>>> STD_READ.MAIN::STDIN. len exceed mps: " << dec << inlen << std::endl ;
00591 }
00592
00593 sent = fa.send(stdinbuf,inlen);
00594 std::cerr << "PLUG >> NET . read: " << dec <<inlen << " written: " << sent << std::endl ;
00595
00596 if (!inlen){std::cerr << "reading from stdin 0 byte, sent EOF" << std::endl; }
00597 }
00598 if (FD_ISSET(srv_sock->getFD(),&readfds)){
00599 inlen = fa.recv(buf,MAX_MSS);
00600 if (inlen < 0){
00601 std::cerr << "MAIN RECV ERROR" << std::endl ;
00602 continue ;
00603 }
00604 sent = vdeplug.vde_send(vdec,buf,inlen,0);
00605 std::cerr << "NET >>> PLUG . read: " << dec << inlen << " written: " << sent << std::endl ;
00606
00607 if(!inlen){std::cerr << "MAIN::read EOF" << std::endl ; exit(0);}
00608 }
00609
00610 }
00611 ::free(stdinbuf);
00612
00613 }
00614
00615 }
00616
00617 int main(int argc, char *argv[]){
00618 net::TcpSocket *ctl_sock ;
00619 Server::packet pk , recvpk ;
00620 n2nc::sync::Thread::init();
00621 loadArgsHelper(argc,argv);
00622 net::SocketAddress *srv_sa ;
00623 net::UdpSocket srv_sock(AF_INET) ;
00624 net::SocketAddress *server_sa ;
00625 int retval, mss ;
00626 std::vector<std::string>::iterator fit;
00627 Filter *f;
00628
00629
00630 server_sa = net::Resolver::getSocketAddressByService ( myconf.saddr, myconf.sport, SOCK_STREAM, 0, true ) ;
00631 srv_sa = net::Resolver::getSocketAddressByService ( myconf.bind_ip, myconf.mysrvport, SOCK_DGRAM, AF_INET, false ) ;
00632
00633
00634
00635 retval = srv_sock.bind(*srv_sa);
00636
00637
00638 PacketManager pkm(&srv_sock) ;
00639 FilterAdapter fa(pkm);
00640
00641 for (fit = myconf.plugins.begin() ; fit != myconf.plugins.end(); fit++){
00642 f = Filter::load_filter(*fit);
00643 if (!f) continue ;
00644 f->setPKM(&pkm);
00645 f->setSessionKey(&myconf.skey);
00646 fa.addFilter(f);
00647 }
00648
00649
00650 mss = MAX_MSS - sizeof(PacketManager::srv_packet_header_t) - fa.getMaxOverHead() ;
00651 mss = (myconf.mss ? myconf.mss : mss) ;
00652 std::cerr << dec << "MSS, MPS: " << MAX_MSS << ", " << mss << std::endl ;
00653
00654
00655
00656 ctl_sock = new net::TcpSocket(server_sa->getAddressFamily());
00657 retval = ctl_sock->open(*server_sa);
00658 if (retval < 0){
00659 std::cerr << "Problem connecting to server" << std::endl ;
00660 exit(1);
00661 }
00662
00663
00664 pk.cmd = Server::CMD_REGISTER ;
00665 pk.src = myconf.myid ;
00666 pk.src_port = myconf.mysrvport ;
00667 ctl_sock->send((void*)&pk,sizeof(pk));
00668
00669 awaitMSG(ctl_sock,Server::CMD_REGISTER_ACK,&recvpk);
00670
00671 if (recvpk.cmd == Server::CMD_REGISTER_ACK && recvpk.msg == Server::MSG_OK){
00672 std::cerr << "REGISTERED SUCCESFULLY" << std::endl ;
00673 }else if(recvpk.msg == Server::MSG_ALREADY_REGISTERED){
00674 std::cerr << "ALREADY REGISTERED" << std::endl ;
00675 exit(1);
00676 }
00677
00678
00679 if (myconf.mode_isactive)
00680 activemode(ctl_sock,srv_sock,fa);
00681 else
00682 passivemode(ctl_sock,srv_sock,fa);
00683
00684 return EXIT_SUCCESS;
00685 }
00686