… | |
… | |
248 | vpn_packet *pkt = new vpn_packet; |
248 | vpn_packet *pkt = new vpn_packet; |
249 | struct sockaddr_in sa; |
249 | struct sockaddr_in sa; |
250 | socklen_t sa_len = sizeof (sa); |
250 | socklen_t sa_len = sizeof (sa); |
251 | int len; |
251 | int len; |
252 | |
252 | |
253 | len = recvfrom (w.fd, &((*pkt)[0]), MAXSIZE, 0, (sockaddr *)&sa, &sa_len); |
253 | len = recvfrom (w.p->fd, &((*pkt)[0]), MAXSIZE, 0, (sockaddr *)&sa, &sa_len); |
254 | |
254 | |
255 | sockinfo si(sa); |
255 | sockinfo si(sa); |
256 | |
256 | |
257 | if (len > 0) |
257 | if (len > 0) |
258 | { |
258 | { |
… | |
… | |
291 | vpn_packet *pkt = new vpn_packet; |
291 | vpn_packet *pkt = new vpn_packet; |
292 | struct sockaddr_in sa; |
292 | struct sockaddr_in sa; |
293 | socklen_t sa_len = sizeof (sa); |
293 | socklen_t sa_len = sizeof (sa); |
294 | int len; |
294 | int len; |
295 | |
295 | |
296 | len = recvfrom (w.fd, &((*pkt)[0]), MAXSIZE, 0, (sockaddr *)&sa, &sa_len); |
296 | len = recvfrom (w.p->fd, &((*pkt)[0]), MAXSIZE, 0, (sockaddr *)&sa, &sa_len); |
297 | |
297 | |
298 | sockinfo si(sa, PROT_IPv4); |
298 | sockinfo si(sa, PROT_IPv4); |
299 | |
299 | |
300 | if (len > 0) |
300 | if (len > 0) |
301 | { |
301 | { |
… | |
… | |
356 | tstamp last_activity; |
356 | tstamp last_activity; |
357 | const sockinfo si; |
357 | const sockinfo si; |
358 | vpn &v; |
358 | vpn &v; |
359 | bool ok; |
359 | bool ok; |
360 | |
360 | |
|
|
361 | vpn_packet *r_pkt; |
|
|
362 | u32 r_len, r_ofs; |
|
|
363 | |
361 | void tcpv4_ev (io_watcher &w, short revents); |
364 | void tcpv4_ev (io_watcher &w, short revents); |
362 | |
365 | |
363 | operator tcp_si_map::value_type() |
366 | operator tcp_si_map::value_type() |
364 | { |
367 | { |
365 | return tcp_si_map::value_type (&si, this); |
368 | return tcp_si_map::value_type (&si, this); |
366 | } |
369 | } |
367 | |
370 | |
368 | tcp_connection (int fd_, const sockinfo &si_, vpn &v_) |
371 | tcp_connection (int fd, const sockinfo &si_, vpn &v_) |
369 | : v(v_), si(si_), io_watcher(this, &tcp_connection::tcpv4_ev), ok(false) |
372 | : v(v_), si(si_), io_watcher(this, &tcp_connection::tcpv4_ev) |
370 | { |
373 | { |
371 | last_activity = NOW; |
374 | last_activity = NOW; |
|
|
375 | ok = false; |
|
|
376 | r_pkt = 0; |
372 | start (fd_, POLLOUT); |
377 | start (fd, POLLOUT); |
373 | } |
378 | } |
374 | |
379 | |
375 | ~tcp_connection () { close (fd); } |
380 | ~tcp_connection () { if (p) close (p->fd); } |
376 | }; |
381 | }; |
377 | |
382 | |
378 | void tcp_si_map::cleaner_cb (time_watcher &w) |
383 | void tcp_si_map::cleaner_cb (time_watcher &w) |
379 | { |
384 | { |
380 | w.at = NOW + 600; |
385 | w.at = NOW + 600; |
… | |
… | |
421 | |
426 | |
422 | i->last_activity = NOW; |
427 | i->last_activity = NOW; |
423 | |
428 | |
424 | if (i->ok) |
429 | if (i->ok) |
425 | { |
430 | { |
426 | setsockopt (i->fd, SOL_IP, IP_TOS, &tos, sizeof tos); |
431 | setsockopt (i->p->fd, SOL_IP, IP_TOS, &tos, sizeof tos); |
427 | |
432 | |
428 | // we use none of the advantages of tcp |
433 | // we use none of the advantages of tcp |
429 | write (i->fd, (void *)pkt, pkt->len + sizeof (u32)) != pkt->len + sizeof (u32); |
434 | write (i->p->fd, (void *)pkt, pkt->len + sizeof (u32)) != pkt->len + sizeof (u32); |
430 | } |
435 | } |
431 | } |
436 | } |
432 | |
437 | |
433 | #if 0 |
438 | #if 0 |
434 | setsockopt (udpv4_fd, SOL_IP, IP_TOS, &tos, sizeof tos); |
439 | setsockopt (udpv4_fd, SOL_IP, IP_TOS, &tos, sizeof tos); |
… | |
… | |
442 | last_activity = NOW; |
447 | last_activity = NOW; |
443 | |
448 | |
444 | if (!ok) // just established? |
449 | if (!ok) // just established? |
445 | { |
450 | { |
446 | ok = true; |
451 | ok = true; |
447 | fcntl (fd, F_SETFL, 0); |
|
|
448 | stop (); |
|
|
449 | start (fd, POLLIN); |
452 | set (POLLIN); |
450 | } |
453 | } |
451 | |
454 | |
452 | if (revents & (POLLIN | POLLERR)) |
455 | if (revents & (POLLIN | POLLERR)) |
453 | { |
456 | { |
454 | u32 len; |
457 | u32 len; |
455 | |
458 | |
456 | if (sizeof (len) == read (fd, &len, sizeof (len))) |
459 | if (sizeof (len) == read (p->fd, &len, sizeof (len))) |
457 | { |
460 | { |
458 | vpn_packet *pkt = new vpn_packet; |
461 | vpn_packet *pkt = new vpn_packet; |
459 | |
462 | |
460 | if (len == read (fd, &((*pkt)[0]), len)) |
463 | if (len == read (p->fd, &((*pkt)[0]), len)) |
461 | { |
464 | { |
462 | pkt->len = len; |
465 | pkt->len = len; |
463 | |
466 | |
464 | v.recv_vpn_packet (pkt, si); |
467 | v.recv_vpn_packet (pkt, si); |
465 | return; |
468 | return; |
… | |
… | |
467 | |
470 | |
468 | delete pkt; |
471 | delete pkt; |
469 | } |
472 | } |
470 | |
473 | |
471 | tcp_si.erase (&si); |
474 | tcp_si.erase (&si); |
|
|
475 | |
472 | stop (); |
476 | set (0);//D |
473 | } |
477 | } |
474 | } |
478 | } |
475 | |
479 | |
476 | void |
480 | void |
477 | vpn::tcpv4_ev (io_watcher &w, short revents) |
481 | vpn::tcpv4_ev (io_watcher &w, short revents) |
… | |
… | |
480 | { |
484 | { |
481 | struct sockaddr_in sa; |
485 | struct sockaddr_in sa; |
482 | socklen_t sa_len = sizeof (sa); |
486 | socklen_t sa_len = sizeof (sa); |
483 | int len; |
487 | int len; |
484 | |
488 | |
485 | int fd = accept (w.fd, (sockaddr *)&sa, &sa_len); |
489 | int fd = accept (w.p->fd, (sockaddr *)&sa, &sa_len); |
486 | |
490 | |
487 | if (fd >= 0) |
491 | if (fd >= 0) |
488 | { |
492 | { |
489 | fcntl (fd, F_SETFL, O_NONBLOCK); |
493 | fcntl (fd, F_SETFL, O_NONBLOCK); |
490 | |
494 | |
491 | sockinfo si(sa, PROT_TCPv4); |
495 | sockinfo si(sa, PROT_TCPv4); |
492 | tcp_connection *i = new tcp_connection (fd, si, *this); |
496 | tcp_connection *i = new tcp_connection (fd, si, *this); |
493 | |
497 | |
494 | slog (L_ERR, "accepted %d\n", fd);//D |
498 | slog (L_DEBUG, _("accepted tcp connection from %s\n"), (const char *)si);//D |
495 | |
499 | |
496 | tcp_si.insert (*i); |
500 | tcp_si.insert (*i); |
497 | } |
501 | } |
498 | } |
502 | } |
499 | } |
503 | } |