ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/vpn.C
(Generate patch)

Comparing gvpe/src/vpn.C (file contents):
Revision 1.28 by pcg, Thu Mar 3 16:54:34 2005 UTC vs.
Revision 1.31 by pcg, Sat Mar 5 19:13:16 2005 UTC

228#endif 228#endif
229 229
230#if ENABLE_DNS 230#if ENABLE_DNS
231 if (THISNODE->protocols & PROT_DNSv4) 231 if (THISNODE->protocols & PROT_DNSv4)
232 { 232 {
233 dns_forwarder.set (::conf.dns_forw_host, ::conf.dns_forw_port, PROT_DNSv4);
234
233 dnsv4_fd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); 235 dnsv4_fd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP);
234 236
235 if (dnsv4_fd < 0) 237 if (dnsv4_fd < 0)
236 return -1; 238 return -1;
237 239
238 // standard daemon practise... 240 // standard daemon practise...
239 { 241 {
240 int oval = 1; 242 int oval = 1;
241 setsockopt (tcpv4_fd, SOL_SOCKET, SO_REUSEADDR, &oval, sizeof oval); 243 setsockopt (dnsv4_fd, SOL_SOCKET, SO_REUSEADDR, &oval, sizeof oval);
242 } 244 }
243 245
244 sockinfo si (THISNODE, PROT_DNSv4); 246 sockinfo si (THISNODE->dns_hostname,
247 THISNODE->dns_hostname ? THISNODE->dns_port : 0,
248 PROT_DNSv4);
245 249
246 if (bind (dnsv4_fd, si.sav4 (), si.salenv4 ())) 250 if (bind (dnsv4_fd, si.sav4 (), si.salenv4 ()))
247 { 251 {
248 slog (L_ERR, _("can't bind dnsv4 on %s: %s"), (const char *)si, strerror (errno)); 252 slog (L_ERR, _("can't bind dnsv4 on %s: %s"), (const char *)si, strerror (errno));
249 exit (EXIT_FAILURE); 253 exit (EXIT_FAILURE);
393 else 397 else
394 c->recv_vpn_packet (pkt, rsi); 398 c->recv_vpn_packet (pkt, rsi);
395 } 399 }
396} 400}
397 401
402bool
403vpn::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
404{
405 switch (si.prot)
406 {
407 case PROT_IPv4:
408 return send_ipv4_packet (pkt, si, tos);
409 case PROT_UDPv4:
410 return send_udpv4_packet (pkt, si, tos);
411#if ENABLE_TCP
412 case PROT_TCPv4:
413 return send_tcpv4_packet (pkt, si, tos);
414#endif
415#if ENABLE_ICMP
416 case PROT_ICMPv4:
417 return send_icmpv4_packet (pkt, si, tos);
418#endif
419#if ENABLE_DNS
420 case PROT_DNSv4:
421 return send_dnsv4_packet (pkt, si, tos);
422#endif
423
424 default:
425 slog (L_CRIT, _("%s: FATAL: trying to send packet with unsupported protocol"), (const char *)si);
426 }
427
428 return false;
429}
430
398void 431void
399vpn::ipv4_ev (io_watcher &w, short revents) 432vpn::ipv4_ev (io_watcher &w, short revents)
400{ 433{
401 if (revents & EVENT_READ) 434 if (revents & EVENT_READ)
402 { 435 {
411 444
412 if (len > 0) 445 if (len > 0)
413 { 446 {
414 pkt->len = len; 447 pkt->len = len;
415 448
416 // raw sockets deliver the ipv4, but don't expect it on sends 449 // raw sockets deliver the ipv4 header, but don't expect it on sends
417 // this is slow, but...
418 pkt->skip_hdr (IP_OVERHEAD); 450 pkt->skip_hdr (IP_OVERHEAD);
419 451
420 recv_vpn_packet (pkt, si); 452 recv_vpn_packet (pkt, si);
421 } 453 }
422 else 454 else
428 delete pkt; 460 delete pkt;
429 } 461 }
430 else 462 else
431 { 463 {
432 slog (L_ERR, 464 slog (L_ERR,
433 _("FATAL: unknown revents %08x in socket, terminating\n"), 465 _("FATAL: unknown revents %08x in socket, terminating\n"),
434 revents); 466 revents);
435 exit (EXIT_FAILURE); 467 exit (EXIT_FAILURE);
436 } 468 }
437} 469}
438 470
439#if ENABLE_ICMP 471#if ENABLE_ICMP
540 int dst = mac2id (pkt->dst); 572 int dst = mac2id (pkt->dst);
541 int src = mac2id (pkt->src); 573 int src = mac2id (pkt->src);
542 574
543 if (src != THISNODE->id) 575 if (src != THISNODE->id)
544 { 576 {
545 slog (L_ERR, _("FATAL: tap packet not originating on current node received, exiting.")); 577 slog (L_ERR, _("FATAL: tap packet not originating on current node received (if-up script not working properly?), exiting."));
546 exit (EXIT_FAILURE); 578 exit (EXIT_FAILURE);
547 } 579 }
548 580
549 if (dst == THISNODE->id) 581 if (dst == THISNODE->id)
550 { 582 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines