… | |
… | |
147 | } |
147 | } |
148 | } |
148 | } |
149 | |
149 | |
150 | ////////////////////////////////////////////////////////////////////////////// |
150 | ////////////////////////////////////////////////////////////////////////////// |
151 | |
151 | |
152 | void pkt_queue::put (tap_packet *p) |
152 | void pkt_queue::put (net_packet *p) |
153 | { |
153 | { |
154 | if (queue[i]) |
154 | if (queue[i]) |
155 | { |
155 | { |
156 | delete queue[i]; |
156 | delete queue[i]; |
157 | j = (j + 1) % QUEUEDEPTH; |
157 | j = (j + 1) % QUEUEDEPTH; |
… | |
… | |
160 | queue[i] = p; |
160 | queue[i] = p; |
161 | |
161 | |
162 | i = (i + 1) % QUEUEDEPTH; |
162 | i = (i + 1) % QUEUEDEPTH; |
163 | } |
163 | } |
164 | |
164 | |
165 | tap_packet *pkt_queue::get () |
165 | net_packet *pkt_queue::get () |
166 | { |
166 | { |
167 | tap_packet *p = queue[j]; |
167 | net_packet *p = queue[j]; |
168 | |
168 | |
169 | if (p) |
169 | if (p) |
170 | { |
170 | { |
171 | queue[j] = 0; |
171 | queue[j] = 0; |
172 | j = (j + 1) % QUEUEDEPTH; |
172 | j = (j + 1) % QUEUEDEPTH; |
… | |
… | |
565 | rekey.start (NOW + ::conf.rekey); |
565 | rekey.start (NOW + ::conf.rekey); |
566 | keepalive.start (NOW + ::conf.keepalive); |
566 | keepalive.start (NOW + ::conf.keepalive); |
567 | |
567 | |
568 | // send queued packets |
568 | // send queued packets |
569 | if (ictx && octx) |
569 | if (ictx && octx) |
|
|
570 | { |
570 | while (tap_packet *p = queue.get ()) |
571 | while (tap_packet *p = (tap_packet *)data_queue.get ()) |
571 | { |
572 | { |
572 | send_data_packet (p); |
573 | send_data_packet (p); |
573 | delete p; |
574 | delete p; |
574 | } |
575 | } |
|
|
576 | |
|
|
577 | while (vpn_packet *p = (vpn_packet *)vpn_queue.get ()) |
|
|
578 | { |
|
|
579 | send_vpn_packet (p, si, IPTOS_RELIABILITY); |
|
|
580 | delete p; |
|
|
581 | } |
|
|
582 | } |
575 | } |
583 | } |
576 | else |
584 | else |
577 | { |
585 | { |
578 | retry_cnt = 0; |
586 | retry_cnt = 0; |
579 | establish_connection.start (NOW + 5); |
587 | establish_connection.start (NOW + 5); |
… | |
… | |
783 | connection::send_data_packet (tap_packet *pkt, bool broadcast) |
791 | connection::send_data_packet (tap_packet *pkt, bool broadcast) |
784 | { |
792 | { |
785 | vpndata_packet *p = new vpndata_packet; |
793 | vpndata_packet *p = new vpndata_packet; |
786 | int tos = 0; |
794 | int tos = 0; |
787 | |
795 | |
|
|
796 | // I am not hilarious about peeking into packets, but so be it. |
788 | if (conf->inherit_tos |
797 | if (conf->inherit_tos |
789 | && (*pkt)[12] == 0x08 && (*pkt)[13] == 0x00 // IP |
798 | && (*pkt)[12] == 0x08 && (*pkt)[13] == 0x00 // IP |
790 | && ((*pkt)[14] & 0xf0) == 0x40) // IPv4 |
799 | && ((*pkt)[14] & 0xf0) == 0x40) // IPv4 |
791 | tos = (*pkt)[15] & IPTOS_TOS_MASK; |
800 | tos = (*pkt)[15] & IPTOS_TOS_MASK; |
792 | |
801 | |
… | |
… | |
805 | if (ictx && octx) |
814 | if (ictx && octx) |
806 | send_data_packet (pkt, broadcast); |
815 | send_data_packet (pkt, broadcast); |
807 | else |
816 | else |
808 | { |
817 | { |
809 | if (!broadcast)//DDDD |
818 | if (!broadcast)//DDDD |
810 | queue.put (new tap_packet (*pkt)); |
819 | data_queue.put (new tap_packet (*pkt)); |
811 | |
820 | |
812 | establish_connection (); |
821 | establish_connection (); |
813 | } |
822 | } |
814 | } |
823 | } |
815 | |
824 | |
816 | void connection::inject_vpn_packet (vpn_packet *pkt, int tos) |
825 | void connection::inject_vpn_packet (vpn_packet *pkt, int tos) |
817 | { |
826 | { |
818 | if (ictx && octx) |
827 | if (ictx && octx) |
819 | send_vpn_packet (pkt, si, tos); |
828 | send_vpn_packet (pkt, si, tos); |
820 | else |
829 | else |
|
|
830 | { |
|
|
831 | vpn_queue.put (new vpn_packet (*pkt)); |
|
|
832 | |
821 | establish_connection (); |
833 | establish_connection (); |
|
|
834 | } |
822 | } |
835 | } |
823 | |
836 | |
824 | void |
837 | void |
825 | connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi) |
838 | connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi) |
826 | { |
839 | { |
… | |
… | |
1099 | || THISNODE->connectmode != conf_node::C_ONDEMAND) |
1112 | || THISNODE->connectmode != conf_node::C_ONDEMAND) |
1100 | { |
1113 | { |
1101 | send_ping (si); |
1114 | send_ping (si); |
1102 | w.at = NOW + 5; |
1115 | w.at = NOW + 5; |
1103 | } |
1116 | } |
|
|
1117 | else if (NOW < last_activity + ::conf.keepalive + 10) |
|
|
1118 | // hold ondemand connections implicitly a few seconds longer |
|
|
1119 | // should delete octx, though, or something like that ;) |
|
|
1120 | w.at = last_activity + ::conf.keepalive + 10; |
1104 | else |
1121 | else |
1105 | reset_connection (); |
1122 | reset_connection (); |
1106 | } |
1123 | } |
1107 | |
1124 | |
1108 | void connection::send_connect_request (int id) |
1125 | void connection::send_connect_request (int id) |