… | |
… | |
481 | connection::send_ping (SOCKADDR *dsa, u8 pong) |
481 | connection::send_ping (SOCKADDR *dsa, u8 pong) |
482 | { |
482 | { |
483 | ping_packet *pkt = new ping_packet; |
483 | ping_packet *pkt = new ping_packet; |
484 | |
484 | |
485 | pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING); |
485 | pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING); |
486 | vpn->send_vpn_packet (pkt, dsa); |
486 | vpn->send_vpn_packet (pkt, dsa, IPTOS_LOWDELAY); |
487 | |
487 | |
488 | delete pkt; |
488 | delete pkt; |
489 | } |
489 | } |
490 | |
490 | |
491 | void |
491 | void |
… | |
… | |
496 | if (limiter.can (dsa)) |
496 | if (limiter.can (dsa)) |
497 | { |
497 | { |
498 | config_packet *pkt = new config_packet; |
498 | config_packet *pkt = new config_packet; |
499 | |
499 | |
500 | pkt->setup (vpn_packet::PT_RESET, conf->id); |
500 | pkt->setup (vpn_packet::PT_RESET, conf->id); |
501 | vpn->send_vpn_packet (pkt, dsa); |
501 | vpn->send_vpn_packet (pkt, dsa, IPTOS_MINCOST); |
502 | |
502 | |
503 | delete pkt; |
503 | delete pkt; |
504 | } |
504 | } |
505 | } |
505 | } |
506 | |
506 | |
… | |
… | |
550 | fatal ("RSA_public_encrypt error"); |
550 | fatal ("RSA_public_encrypt error"); |
551 | #endif |
551 | #endif |
552 | |
552 | |
553 | slog (L_TRACE, ">>%d PT_AUTH(%d) [%s]", conf->id, subtype, (const char *)sockinfo (sa)); |
553 | slog (L_TRACE, ">>%d PT_AUTH(%d) [%s]", conf->id, subtype, (const char *)sockinfo (sa)); |
554 | |
554 | |
555 | vpn->send_vpn_packet (pkt, sa); |
555 | vpn->send_vpn_packet (pkt, sa, IPTOS_RELIABILITY); |
556 | |
556 | |
557 | delete pkt; |
557 | delete pkt; |
558 | } |
558 | } |
559 | } |
559 | } |
560 | |
560 | |
… | |
… | |
635 | |
635 | |
636 | void |
636 | void |
637 | connection::send_data_packet (tap_packet * pkt, bool broadcast) |
637 | connection::send_data_packet (tap_packet * pkt, bool broadcast) |
638 | { |
638 | { |
639 | vpndata_packet *p = new vpndata_packet; |
639 | vpndata_packet *p = new vpndata_packet; |
|
|
640 | int tos = 0; |
|
|
641 | |
|
|
642 | if (conf->inherit_tos |
|
|
643 | && (*pkt)[12] == 0x08 && (*pkt)[13] == 0x00 // IP |
|
|
644 | && ((*pkt)[14] & 0xf0) == 0x40) // IPv4 |
|
|
645 | tos = (*pkt)[15] & IPTOS_TOS_MASK; |
|
|
646 | printf ("%d %02x %02x %02x %02x = %02x\n", (int)conf->inherit_tos, (*pkt)[12],(*pkt)[13],(*pkt)[14],(*pkt)[15], tos); |
640 | |
647 | |
641 | p->setup (this, broadcast ? 0 : conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs |
648 | p->setup (this, broadcast ? 0 : conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs |
642 | vpn->send_vpn_packet (p, &sa); |
649 | vpn->send_vpn_packet (p, &sa, tos); |
643 | |
650 | |
644 | delete p; |
651 | delete p; |
645 | |
652 | |
646 | if (oseqno > MAX_SEQNO) |
653 | if (oseqno > MAX_SEQNO) |
647 | rekey (); |
654 | rekey (); |
… | |
… | |
1095 | |
1102 | |
1096 | return 0; |
1103 | return 0; |
1097 | } |
1104 | } |
1098 | |
1105 | |
1099 | void |
1106 | void |
1100 | vpn::send_vpn_packet (vpn_packet *pkt, SOCKADDR *sa) |
1107 | vpn::send_vpn_packet (vpn_packet *pkt, SOCKADDR *sa, int tos) |
1101 | { |
1108 | { |
|
|
1109 | setsockopt (socket_fd, SOL_IP, IP_TOS, &tos, sizeof tos); |
1102 | sendto (socket_fd, &((*pkt)[0]), pkt->len, 0, (sockaddr *)sa, sizeof (*sa)); |
1110 | sendto (socket_fd, &((*pkt)[0]), pkt->len, 0, (sockaddr *)sa, sizeof (*sa)); |
1103 | } |
1111 | } |
1104 | |
1112 | |
1105 | void |
1113 | void |
1106 | vpn::shutdown_all () |
1114 | vpn::shutdown_all () |