static void npppd_iface_network_input_ipv4(npppd_iface *_this, u_char *pktp, int lpktp) { struct ip *iphdr; npppd *_npppd; npppd_ppp *ppp; struct npppd_iface_network_input_arg input_arg; NPPPD_IFACE_ASSERT(_this != NULL); NPPPD_IFACE_ASSERT(pktp != NULL); iphdr = (struct ip *)pktp; _npppd = _this->npppd; if (lpktp < sizeof(iphdr)) { npppd_iface_log(_this, LOG_ERR, "Received short packet."); return; } if (IN_MULTICAST(ntohl(iphdr->ip_dst.s_addr))) { NPPPD_IFACE_ASSERT(((npppd *)(_this->npppd))->rd != NULL); input_arg._this = _this; input_arg.pktp = pktp; input_arg.lpktp = lpktp; /* delegate */ rd_walktree(((npppd *)(_this->npppd))->rd, npppd_iface_network_input_delegate, &input_arg); return; } ppp = npppd_get_ppp_by_ip(_npppd, iphdr->ip_dst); if (ppp == NULL) { #ifdef NPPPD_DEBUG log_printf(LOG_INFO, "%s received a packet to unknown " "%s.", _this->ifname, inet_ntoa(iphdr->ip_dst)); #endif return; } #ifndef NO_ADJUST_MSS if (ppp->adjust_mss) { adjust_tcp_mss(pktp, lpktp, MRU_IPMTU(ppp->peer_mru)); } #endif if (ppp->timeout_sec > 0 && !ip_is_idle_packet(iphdr, lpktp)) ppp_reset_idle_timeout(ppp); #ifdef USE_NPPPD_MPPE if (MPPE_SEND_READY(ppp)) { /* output via MPPE if MPPE started */ mppe_pkt_output(&ppp->mppe, PPP_PROTO_IP, pktp, lpktp); return; } else if (MPPE_IS_REQUIRED(ppp)) { /* in case MPPE not started but MPPE is mandatory */ ppp_log(ppp, LOG_WARNING, "A packet received from network, " "but MPPE is not started."); return; } #endif ppp_output(ppp, PPP_PROTO_IP, 0, 0, pktp, lpktp); }
/** This function is called when IPCP is opened */ void ppp_ipcp_opened(npppd_ppp *_this) { time_t curr_time; curr_time = get_monosec(); npppd_set_ip_enabled(_this->pppd, _this, 1); if (_this->logged_acct_start == 0) { char label[512], ipstr[64]; ppp_set_tunnel_label(_this, label, sizeof(label)); strlcpy(ipstr, " ip=", sizeof(ipstr)); strlcat(ipstr, inet_ntoa(_this->ppp_framed_ip_address), sizeof(ipstr)); if (_this->ppp_framed_ip_netmask.s_addr != 0xffffffffL) { strlcat(ipstr, ":", sizeof(ipstr)); strlcat(ipstr, inet_ntoa(_this->ppp_framed_ip_netmask), sizeof(ipstr)); } ppp_log(_this, LOG_NOTICE, "logtype=TUNNELSTART user=\"%s\" duration=%lusec layer2=%s " "layer2from=%s auth=%s %s iface=%s%s", _this->username[0]? _this->username : "******", (long)(curr_time - _this->start_monotime), _this->phy_label, label, _this->username[0]? ppp_peer_auth_string(_this) : "none", ipstr, npppd_ppp_get_iface_name(_this->pppd, _this), (_this->lcp.dialin_proxy != 0)? " dialin_proxy=yes" : "" ); #ifdef USE_NPPPD_RADIUS npppd_ppp_radius_acct_start(_this->pppd, _this); #endif _this->logged_acct_start = 1; ppp_reset_idle_timeout(_this); } #ifdef USE_NPPPD_PIPEX ppp_on_network_pipex(_this); #endif }