/* ----------------------------------------------------------------------------- l2tpvpn_refuse - called by vpnd to refuse an incomming connection. return values: -1 error socket# launch pppd with next server address 0 handled, do nothing ----------------------------------------------------------------------------- */ int l2tpvpn_refuse(void) { u_int8_t recv_buf[1500]; int addrlen; struct sockaddr_in6 from; int newSockfd; /* we should check if there are too many call from the same IP address in the last xxx minutes, proving a denial of service attack */ /* need t read the packet to empty the socket buffer */ while((newSockfd = socket(PF_PPP, SOCK_DGRAM, PPPPROTO_L2TP)) < 0) if (errno != EINTR) { vpnlog(LOG_ERR, "VPND L2TP plugin: Unable to open L2TP socket during refuse\n"); return -1; } /* accept the call. it will copy the data to the new socket */ setsockopt(newSockfd, PPPPROTO_L2TP, L2TP_OPT_ACCEPT, 0, 0); /* and close it right away */ close(newSockfd); /* read the duplicated SCCRQ from the listen socket and ignore for now */ if (l2tp_sys_recvfrom(listen_sockfd, recv_buf, 1500, MSG_DONTWAIT, (struct sockaddr*)&from, &addrlen) < 0) return -1; return 0; }
/* ----------------------------------------------------------------------------- l2tpvpn_accept ----------------------------------------------------------------------------- */ int l2tpvpn_accept(void) { u_int8_t recv_buf[1500]; socklen_t addrlen; struct sockaddr_in6 from; int newSockfd; /* we should check if there are too many call from the same IP address in the last xxx minutes, proving a denial of service attack */ while((newSockfd = socket(PF_PPP, SOCK_DGRAM, PPPPROTO_L2TP)) < 0) if (errno != EINTR) { vpnlog(LOG_ERR, "L2TP plugin: Unable to open L2TP socket during accept\n"); return -1; } /* accept the call. it will copy the data to the new socket */ //set_flag(newSockfd, kerneldebug & 1, L2TP_FLAG_DEBUG); setsockopt(newSockfd, PPPPROTO_L2TP, L2TP_OPT_ACCEPT, 0, 0); /* read the duplicated SCCRQ from the listen socket and ignore for now */ if (l2tp_sys_recvfrom(listen_sockfd, recv_buf, 1500, MSG_DONTWAIT, (struct sockaddr*)&from, &addrlen) < 0) return -1; return newSockfd; }