… | |
… | |
335 | |
335 | |
336 | return true; |
336 | return true; |
337 | } |
337 | } |
338 | |
338 | |
339 | void |
339 | void |
|
|
340 | vpn::inject_data_packet (tap_packet *pkt, int dst) |
|
|
341 | { |
|
|
342 | if (dst) |
|
|
343 | { |
|
|
344 | // unicast |
|
|
345 | if (dst != THISNODE->id) |
|
|
346 | conns[dst - 1]->inject_data_packet (pkt); |
|
|
347 | } |
|
|
348 | else |
|
|
349 | { |
|
|
350 | // broadcast, this is ugly, but due to the security policy |
|
|
351 | // we have to connect to all hosts... |
|
|
352 | for (conns_vector::iterator c = conns.begin (); c != conns.end (); ++c) |
|
|
353 | if ((*c)->conf != THISNODE) |
|
|
354 | (*c)->inject_data_packet (pkt, true); |
|
|
355 | } |
|
|
356 | } |
|
|
357 | |
|
|
358 | void |
340 | vpn::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi) |
359 | vpn::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi) |
341 | { |
360 | { |
342 | unsigned int src = pkt->src (); |
361 | unsigned int src = pkt->src (); |
343 | unsigned int dst = pkt->dst (); |
362 | unsigned int dst = pkt->dst (); |
344 | |
363 | |
… | |
… | |
358 | connection *c = conns[src - 1]; |
377 | connection *c = conns[src - 1]; |
359 | |
378 | |
360 | if (dst == 0) |
379 | if (dst == 0) |
361 | slog (L_WARN, _("%s(%s): received broadcast (protocol violation)"), |
380 | slog (L_WARN, _("%s(%s): received broadcast (protocol violation)"), |
362 | c->conf->nodename, (const char *)rsi); |
381 | c->conf->nodename, (const char *)rsi); |
363 | else if (dst != 0 && dst != THISNODE->id) |
382 | else if (dst != THISNODE->id) |
364 | { |
383 | { |
365 | if (THISNODE->routerprio) |
384 | if (THISNODE->routerprio) |
366 | // the tos setting gets lost here. who cares. |
385 | // the tos setting gets lost here. who cares. |
367 | conns[dst - 1]->inject_vpn_packet (pkt); |
386 | conns[dst - 1]->inject_vpn_packet (pkt); |
368 | else |
387 | else |
… | |
… | |
552 | } |
571 | } |
553 | |
572 | |
554 | if (dst > conns.size ()) |
573 | if (dst > conns.size ()) |
555 | slog (L_ERR, _("tap packet for unknown node %d received, ignoring."), dst); |
574 | slog (L_ERR, _("tap packet for unknown node %d received, ignoring."), dst); |
556 | else |
575 | else |
557 | { |
|
|
558 | if (dst) |
|
|
559 | { |
|
|
560 | // unicast |
|
|
561 | if (dst != THISNODE->id) |
|
|
562 | conns[dst - 1]->inject_data_packet (pkt); |
|
|
563 | } |
|
|
564 | else |
|
|
565 | { |
|
|
566 | // broadcast, this is ugly, but due to the security policy |
|
|
567 | // we have to connect to all hosts... |
|
|
568 | for (conns_vector::iterator c = conns.begin (); c != conns.end (); ++c) |
|
|
569 | if ((*c)->conf != THISNODE) |
|
|
570 | (*c)->inject_data_packet (pkt); |
576 | inject_data_packet (pkt, dst); |
571 | } |
|
|
572 | } |
|
|
573 | } |
577 | } |
574 | |
578 | |
575 | delete pkt; |
579 | delete pkt; |
576 | } |
580 | } |
577 | else if (revents & (POLLHUP | POLLERR)) |
581 | else if (revents & (POLLHUP | POLLERR)) |