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.29 by pcg, Fri Mar 4 04:52:38 2005 UTC vs.
Revision 1.32 by pcg, Mon Mar 7 01:31:26 2005 UTC

235 dnsv4_fd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); 235 dnsv4_fd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP);
236 236
237 if (dnsv4_fd < 0) 237 if (dnsv4_fd < 0)
238 return -1; 238 return -1;
239 239
240#if defined(SOL_IP) && defined(IP_MTU_DISCOVER)
241 // this I really consider a linux bug. I am neither connected
242 // nor do I fragment myself. Linux still sets DF and doesn't
243 // fragment for me sometimes.
244 {
245 int oval = IP_PMTUDISC_DONT;
246 setsockopt (udpv4_fd, SOL_IP, IP_MTU_DISCOVER, &oval, sizeof oval);
247 }
248#endif
249
240 // standard daemon practise... 250 // standard daemon practise...
241 { 251 {
242 int oval = 1; 252 int oval = 1;
243 setsockopt (tcpv4_fd, SOL_SOCKET, SO_REUSEADDR, &oval, sizeof oval); 253 setsockopt (dnsv4_fd, SOL_SOCKET, SO_REUSEADDR, &oval, sizeof oval);
244 } 254 }
245 255
246 sockinfo si (THISNODE, PROT_DNSv4); 256 sockinfo si (THISNODE->dns_hostname,
257 THISNODE->dns_hostname ? THISNODE->dns_port : 0,
258 PROT_DNSv4);
247 259
248 if (bind (dnsv4_fd, si.sav4 (), si.salenv4 ())) 260 if (bind (dnsv4_fd, si.sav4 (), si.salenv4 ()))
249 { 261 {
250 slog (L_ERR, _("can't bind dnsv4 on %s: %s"), (const char *)si, strerror (errno)); 262 slog (L_ERR, _("can't bind dnsv4 on %s: %s"), (const char *)si, strerror (errno));
251 exit (EXIT_FAILURE); 263 exit (EXIT_FAILURE);
395 else 407 else
396 c->recv_vpn_packet (pkt, rsi); 408 c->recv_vpn_packet (pkt, rsi);
397 } 409 }
398} 410}
399 411
412bool
413vpn::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
414{
415 switch (si.prot)
416 {
417 case PROT_IPv4:
418 return send_ipv4_packet (pkt, si, tos);
419 case PROT_UDPv4:
420 return send_udpv4_packet (pkt, si, tos);
421#if ENABLE_TCP
422 case PROT_TCPv4:
423 return send_tcpv4_packet (pkt, si, tos);
424#endif
425#if ENABLE_ICMP
426 case PROT_ICMPv4:
427 return send_icmpv4_packet (pkt, si, tos);
428#endif
429#if ENABLE_DNS
430 case PROT_DNSv4:
431 return send_dnsv4_packet (pkt, si, tos);
432#endif
433
434 default:
435 slog (L_CRIT, _("%s: FATAL: trying to send packet with unsupported protocol"), (const char *)si);
436 }
437
438 return false;
439}
440
400void 441void
401vpn::ipv4_ev (io_watcher &w, short revents) 442vpn::ipv4_ev (io_watcher &w, short revents)
402{ 443{
403 if (revents & EVENT_READ) 444 if (revents & EVENT_READ)
404 { 445 {
413 454
414 if (len > 0) 455 if (len > 0)
415 { 456 {
416 pkt->len = len; 457 pkt->len = len;
417 458
418 // raw sockets deliver the ipv4, but don't expect it on sends 459 // raw sockets deliver the ipv4 header, but don't expect it on sends
419 // this is slow, but...
420 pkt->skip_hdr (IP_OVERHEAD); 460 pkt->skip_hdr (IP_OVERHEAD);
421 461
422 recv_vpn_packet (pkt, si); 462 recv_vpn_packet (pkt, si);
423 } 463 }
424 else 464 else
430 delete pkt; 470 delete pkt;
431 } 471 }
432 else 472 else
433 { 473 {
434 slog (L_ERR, 474 slog (L_ERR,
435 _("FATAL: unknown revents %08x in socket, terminating\n"), 475 _("FATAL: unknown revents %08x in socket, terminating\n"),
436 revents); 476 revents);
437 exit (EXIT_FAILURE); 477 exit (EXIT_FAILURE);
438 } 478 }
439} 479}
440 480
441#if ENABLE_ICMP 481#if ENABLE_ICMP
542 int dst = mac2id (pkt->dst); 582 int dst = mac2id (pkt->dst);
543 int src = mac2id (pkt->src); 583 int src = mac2id (pkt->src);
544 584
545 if (src != THISNODE->id) 585 if (src != THISNODE->id)
546 { 586 {
547 slog (L_ERR, _("FATAL: tap packet not originating on current node received, exiting.")); 587 slog (L_ERR, _("FATAL: tap packet not originating on current node received (if-up script not working properly?), exiting."));
548 exit (EXIT_FAILURE); 588 exit (EXIT_FAILURE);
549 } 589 }
550 590
551 if (dst == THISNODE->id) 591 if (dst == THISNODE->id)
552 { 592 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines