void EInterfaces::recalculate_mtu(void) { UInt32 Min_MTU; int n; Min_MTU = 0; for(n=0; n<numberof(m_aInterfaces); n++) { if ( m_aInterfaces[n].m_fEnabled ) { if ( Min_MTU ) Min_MTU = MIN(ifnet_mtu(m_aInterfaces[n].m_ifnet), Min_MTU); else Min_MTU = ifnet_mtu(m_aInterfaces[n].m_ifnet); } } if ( 0==Min_MTU ) { debugError("Error in MTU calculation.\n"); m_Min_MTU = 1500; // Set to standard MTU size } m_Min_MTU = Min_MTU; debug("Minimum MTU of %d interface(s) is %d bytes\n", m_nInterfacesInUse, m_Min_MTU); }
/* ----------------------------------------------------------------------------- Handle a CCP packet. `rcvd' is 1 if the packet was received, 0 if it is about to be transmitted. mbuf points to the ccp payload (doesn't include FF03 and 80FD) ----------------------------------------------------------------------------- */ void ppp_comp_ccp(struct ppp_if *wan, mbuf_t m, int rcvd) { u_char *p = mbuf_data(m); int slen; slen = CCP_LENGTH(p); if (slen > mbuf_pkthdr_len(m)) { LOGDBG(wan->net, ("ppp_comp_ccp: not enough data in mbuf (expected = %d, got = %d)\n", slen, mbuf_pkthdr_len(m))); return; } switch (CCP_CODE(p)) { case CCP_CONFREQ: case CCP_TERMREQ: case CCP_TERMACK: /* CCP must be going down - disable compression */ wan->sc_flags &= ~(rcvd ? SC_COMP_RUN : SC_DECOMP_RUN); break; case CCP_CONFACK: if (wan->sc_flags & SC_CCP_OPEN && !(wan->sc_flags & SC_CCP_UP) && slen >= CCP_HDRLEN + CCP_OPT_MINLEN && slen >= CCP_OPT_LENGTH(p + CCP_HDRLEN) + CCP_HDRLEN) { if (rcvd) { /* peer is agreeing to send compressed packets. */ if (wan->rc_state && (*wan->rcomp->decomp_init) (wan->rc_state, p + CCP_HDRLEN, slen - CCP_HDRLEN, ifnet_unit(wan->net), 0, wan->mru, ifnet_flags(wan->net) & IFF_DEBUG)) { wan->sc_flags |= SC_DECOMP_RUN; wan->sc_flags &= ~(SC_DC_ERROR | SC_DC_FERROR); } } else { /* we're agreeing to send compressed packets. */ if (wan->xc_state && (*wan->xcomp->comp_init) (wan->xc_state, p + CCP_HDRLEN, slen - CCP_HDRLEN, ifnet_unit(wan->net), 0, ifnet_mtu(wan->net), ifnet_flags(wan->net) & IFF_DEBUG)) { wan->sc_flags |= SC_COMP_RUN; } } } break; case CCP_RESETACK: if (wan->sc_flags & SC_CCP_UP) { if (rcvd) { if (wan->rc_state && (wan->sc_flags & SC_DECOMP_RUN)) { (*wan->rcomp->decomp_reset)(wan->rc_state); wan->sc_flags &= ~SC_DC_ERROR; } } else { if (wan->xc_state && (wan->sc_flags & SC_COMP_RUN)) (*wan->xcomp->comp_reset)(wan->xc_state); } } break; } }