Date: Sun, 01 Aug 2004 12:08:20 +0200 From: Matthias Andree <matthias.andree@gmx.de> To: FreeBSD-gnats-submit@FreeBSD.org Cc: SeaD <sead@deep.perm.ru> Subject: ports/69868: [MAINTAINER] net/rp-pppoe: enable pppoe-relay (fixup lost patch) Message-ID: <E1BrDGO-0001Ur-6w@libertas.emma.line.org> Resent-Message-ID: <200408011010.i71AAIxA086328@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 69868 >Category: ports >Synopsis: [MAINTAINER] net/rp-pppoe: enable pppoe-relay (fixup lost patch) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: maintainer-update >Submitter-Id: current-users >Arrival-Date: Sun Aug 01 10:10:18 GMT 2004 >Closed-Date: >Last-Modified: >Originator: Matthias Andree >Release: FreeBSD 4.10-RELEASE-p2 i386 >Organization: >Environment: System: FreeBSD libertas.emma.line.org 4.10-RELEASE-p2 FreeBSD 4.10-RELEASE-p2 #2: Thu Jul 1 00:06:57 CEST >Description: This patch is a revised edition of the now closed ports/64041. * enable pppoe-relay patches originally submitted by SeaD (Cc'd) on 2004-03-10 patch got lost as my ports/68113 was committed Generated with FreeBSD Port Tools 0.50 >How-To-Repeat: >Fix: --- rp-pppoe-3.5_1.patch begins here --- diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/Makefile /root/ports/net/rp-pppoe/Makefile --- /usr/ports/net/rp-pppoe/Makefile Thu Jun 24 16:26:50 2004 +++ /root/ports/net/rp-pppoe/Makefile Sun Aug 1 11:59:14 2004 @@ -7,6 +7,7 @@ PORTNAME= rp-pppoe PORTVERSION= 3.5 +PORTREVISION= 1 CATEGORIES= net MASTER_SITES= http://www.roaringpenguin.com/penguin/pppoe/ @@ -15,6 +16,7 @@ USE_REINPLACE= yes GNU_CONFIGURE= yes +PATCH_WRKSRC= ${WRKSRC}/src CONFIGURE_WRKSRC= ${WRKSRC}/src BUILD_WRKSRC= ${WRKSRC}/src @@ -50,7 +52,7 @@ do-install: # Binaries -.for f in pppoe pppoe-server +.for f in pppoe pppoe-server pppoe-relay @${INSTALL_PROGRAM} ${BUILD_WRKSRC}/${f} ${PREFIX}/sbin .endfor # Configurations @@ -59,10 +61,6 @@ @${INSTALL_DATA} ${WRKSRC}/configs/${f} \ ${PREFIX}/etc/ppp/${f}.sample .endfor -.if !exists(${PREFIX}/etc/ppp/pppoe.conf) - ${INSTALL_SCRIPT} ${PREFIX}/etc/ppp/pppoe.conf.sample \ - ${PREFIX}/etc/ppp/pppoe.conf -.endif # Manual pages @${MKDIR} ${MAN5PREFIX}/man/man5 .for f in ${MAN5} @@ -76,6 +74,11 @@ .for f in ${SCRIPT_FILES} @${INSTALL_SCRIPT} ${WRKSRC}/scripts/${f} ${PREFIX}/sbin .endfor +# Startup scripts +.for f in 04pppoe-relay.sh.sample 04pppoe-server.sh.sample + @${INSTALL_SCRIPT} ${FILESDIR}/${f} ${PREFIX}/etc/rc.d/ +.endfor + # Documentation .ifndef (NOPORTDOCS) @${MKDIR} ${DOCSDIR} diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/files/04pppoe-relay.sh.sample /root/ports/net/rp-pppoe/files/04pppoe-relay.sh.sample --- /usr/ports/net/rp-pppoe/files/04pppoe-relay.sh.sample Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/files/04pppoe-relay.sh.sample Tue Jul 27 00:13:57 2004 @@ -0,0 +1,30 @@ +#! /bin/sh + +# use a subshell to support new -CURRENT rc.d structure +( +daemon=pppoe-relay +daemon_path=/usr/local/sbin +daemon_flags= + +case $1 in + start) + if [ -x ${daemon_path}/$daemon ]; then + ${daemon_path}/$daemon $daemon_flags + echo -n " $daemon" + fi + ;; + stop) + killall $daemon && echo -n " $daemon" + ;; + restart) + $0 stop + sleep 1 + $0 start + ;; + *) + echo "Usage: `basename $0` {start|stop|restart}" >&2 + exit 64 + ;; +esac +exit 0 +) diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/files/04pppoe-server.sh.sample /root/ports/net/rp-pppoe/files/04pppoe-server.sh.sample --- /usr/ports/net/rp-pppoe/files/04pppoe-server.sh.sample Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/files/04pppoe-server.sh.sample Tue Jul 27 00:13:26 2004 @@ -0,0 +1,31 @@ +#! /bin/sh + +# use a subshell to support new -CURRENT rc.d structure +( +daemon=pppoe-server +daemon_path=/usr/local/sbin +daemon_flags= + +case $1 in + start) + if [ -x ${daemon_path}/$daemon ]; then + ${daemon_path}/$daemon $daemon_flags + echo -n " $daemon" + fi + ;; + stop) + killall $daemon && echo -n " $daemon" + ;; + restart) + $0 stop + sleep 1 + $0 start + ;; + *) + echo "Usage: `basename $0` {start|stop|restart}" >&2 + exit 64 + ;; +esac + +exit 0 +) diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/files/patch-ab /root/ports/net/rp-pppoe/files/patch-ab --- /usr/ports/net/rp-pppoe/files/patch-ab Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/files/patch-ab Wed Mar 10 13:49:47 2004 @@ -0,0 +1,11 @@ +--- configure.orig Mon Jul 8 20:38:24 2002 ++++ configure Wed Mar 10 15:50:51 2004 +@@ -2083,7 +2083,7 @@ + + + # Determine what targets to build +-TARGETS="pppoe pppoe-server" ++TARGETS="pppoe pppoe-server pppoe-relay" + + # pppoe-sniff is built only on Linux and Solaris + if test "$ac_cv_header_linux_if_packet_h" = "yes" -o "$ac_cv_header_sys_dlpi_h" = "yes" ; then diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/files/patch-ac /root/ports/net/rp-pppoe/files/patch-ac --- /usr/ports/net/rp-pppoe/files/patch-ac Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/files/patch-ac Wed Mar 10 13:49:47 2004 @@ -0,0 +1,15 @@ +--- if.c.orig Mon Jul 8 20:38:24 2002 ++++ if.c Wed Mar 10 15:47:26 2004 +@@ -285,7 +285,12 @@ + int i; + + /* BSD only opens one socket for both Discovery and Session packets */ ++#if defined(__FreeBSD__) ++ /* Confirmed for FreeBSD 4.8-R [SeaD] */ ++ if (!hwaddr) { ++#else + if (fd >= 0) { ++#endif + return fd; + } + diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/files/patch-ad /root/ports/net/rp-pppoe/files/patch-ad --- /usr/ports/net/rp-pppoe/files/patch-ad Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/files/patch-ad Wed Mar 10 13:49:47 2004 @@ -0,0 +1,179 @@ +--- relay.c.orig Mon Jul 8 20:38:24 2002 ++++ relay.c Wed Mar 10 16:29:40 2004 +@@ -743,6 +743,11 @@ + relayLoop() + { + fd_set readable, readableCopy; ++#if defined(__FreeBSD__) ++ PPPoEPacket packet; ++ int size; ++ int type; ++#endif + int maxFD; + int i, r; + int sock; +@@ -772,6 +777,27 @@ + continue; + } + ++#if defined(__FreeBSD__) ++ for (i=0; i<NumInterfaces; i++) { ++ /* Because FreeBSD use one interface for both Discovery and ++ Session types we use first socket for packet receiving [SeaD] */ ++ if (!FD_ISSET(Interfaces[i].discoverySock, &readableCopy)) ++ continue; ++ if (receivePacket(Interfaces[i].discoverySock, &packet, &size) < 0) ++ continue; ++ ++ /* Ignore unknown code/version */ ++ if (packet.ver != 1 || packet.type != 1) ++ continue; ++ ++ type = etherType(&packet); ++ if (type == Eth_PPPOE_Discovery) { ++ relayGotDiscoveryPacket(&Interfaces[i], &packet, size); ++ } else if (type == Eth_PPPOE_Session) { ++ relayGotSessionPacket(&Interfaces[i], &packet, size); ++ } ++ } ++#else + /* Handle session packets first */ + for (i=0; i<NumInterfaces; i++) { + if (FD_ISSET(Interfaces[i].sessionSock, &readableCopy)) { +@@ -786,6 +812,7 @@ + } + } + ++#endif + /* Handle the session-cleaning process */ + if (FD_ISSET(CleanPipe[0], &readableCopy)) { + char dummy; +@@ -805,6 +832,46 @@ + *%DESCRIPTION: + * Receives and processes a discovery packet. + ***********************************************************************/ ++#if defined(__FreeBSD__) ++void ++relayGotDiscoveryPacket(PPPoEInterface const *iface, ++ PPPoEPacket *packet, ++ int size) ++{ ++ ++ if (ntohs(packet->length) + HDR_SIZE > size) { ++ syslog(LOG_ERR, "Bogus PPPoE length field (%u)", ++ (unsigned int) ntohs(packet->length)); ++ return; ++ } ++ ++ /* Drop Ethernet frame padding */ ++ if (size > ntohs(packet->length) + HDR_SIZE) { ++ size = ntohs(packet->length) + HDR_SIZE; ++ } ++ ++ switch(packet->code) { ++ case CODE_PADT: ++ relayHandlePADT(iface, packet, size); ++ break; ++ case CODE_PADI: ++ relayHandlePADI(iface, packet, size); ++ break; ++ case CODE_PADO: ++ relayHandlePADO(iface, packet, size); ++ break; ++ case CODE_PADR: ++ relayHandlePADR(iface, packet, size); ++ break; ++ case CODE_PADS: ++ relayHandlePADS(iface, packet, size); ++ break; ++ default: ++ syslog(LOG_ERR, "Discovery packet on %s with unknown code %d", ++ iface->name, (int) packet->code); ++ } ++} ++#else + void + relayGotDiscoveryPacket(PPPoEInterface const *iface) + { +@@ -852,6 +919,7 @@ + iface->name, (int) packet.code); + } + } ++#endif + + /********************************************************************** + *%FUNCTION: relayGotSessionPacket +@@ -862,6 +930,65 @@ + *%DESCRIPTION: + * Receives and processes a session packet. + ***********************************************************************/ ++#if defined(__FreeBSD__) ++void ++relayGotSessionPacket(PPPoEInterface const *iface, ++ PPPoEPacket *packet, ++ int size) ++{ ++ SessionHash *sh; ++ PPPoESession *ses; ++ ++ /* Must be a session packet */ ++ if (packet->code != CODE_SESS) { ++ syslog(LOG_ERR, "Session packet with code %d", (int) packet->code); ++ return; ++ } ++ ++ /* Ignore session packets whose destination address isn't ours */ ++ if (memcmp(packet->ethHdr.h_dest, iface->mac, ETH_ALEN)) { ++ return; ++ } ++ ++ /* Validate length */ ++ if (ntohs(packet->length) + HDR_SIZE > size) { ++ syslog(LOG_ERR, "Bogus PPPoE length field (%u)", ++ (unsigned int) ntohs(packet->length)); ++ return; ++ } ++ ++ /* Drop Ethernet frame padding */ ++ if (size > ntohs(packet->length) + HDR_SIZE) { ++ size = ntohs(packet->length) + HDR_SIZE; ++ } ++ ++ /* We're in business! Find the hash */ ++ sh = findSession(packet->ethHdr.h_source, packet->session); ++ if (!sh) { ++ /* Don't log this. Someone could be running the client and the ++ relay on the same box. */ ++ return; ++ } ++ ++ /* Relay it */ ++ ses = sh->ses; ++ ses->epoch = Epoch; ++ sh = sh->peer; ++ packet->session = sh->sesNum; ++ memcpy(packet->ethHdr.h_source, sh->interface->mac, ETH_ALEN); ++ memcpy(packet->ethHdr.h_dest, sh->peerMac, ETH_ALEN); ++#if 0 ++ fprintf(stderr, "Relaying %02x:%02x:%02x:%02x:%02x:%02x(%s:%d) to %02x:%02x:%02x:%02x:%02x:%02x(%s:%d)\n", ++ sh->peer->peerMac[0], sh->peer->peerMac[1], sh->peer->peerMac[2], ++ sh->peer->peerMac[3], sh->peer->peerMac[4], sh->peer->peerMac[5], ++ sh->peer->interface->name, ntohs(sh->peer->sesNum), ++ sh->peerMac[0], sh->peerMac[1], sh->peerMac[2], ++ sh->peerMac[3], sh->peerMac[4], sh->peerMac[5], ++ sh->interface->name, ntohs(sh->sesNum)); ++#endif ++ sendPacket(NULL, sh->interface->sessionSock, packet, size); ++} ++#else + void + relayGotSessionPacket(PPPoEInterface const *iface) + { +@@ -928,6 +1055,7 @@ + #endif + sendPacket(NULL, sh->interface->sessionSock, &packet, size); + } ++#endif + + /********************************************************************** + *%FUNCTION: relayHandlePADT diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/files/patch-ae /root/ports/net/rp-pppoe/files/patch-ae --- /usr/ports/net/rp-pppoe/files/patch-ae Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/files/patch-ae Wed Mar 10 13:49:47 2004 @@ -0,0 +1,16 @@ +--- relay.h.orig Mon Jul 8 20:38:24 2002 ++++ relay.h Wed Mar 10 15:50:51 2004 +@@ -51,8 +51,13 @@ + + /* Function prototypes */ + ++#if defined(__FreeBSD__) ++void relayGotSessionPacket(PPPoEInterface const *iface, PPPoEPacket *packet, int size); ++void relayGotDiscoveryPacket(PPPoEInterface const *iface, PPPoEPacket *packet, int size); ++#else + void relayGotSessionPacket(PPPoEInterface const *i); + void relayGotDiscoveryPacket(PPPoEInterface const *i); ++#endif + PPPoEInterface *findInterface(int sock); + unsigned int hash(unsigned char const *mac, UINT16_t sesNum); + SessionHash *findSession(unsigned char const *mac, UINT16_t sesNum); diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/pkg-message /root/ports/net/rp-pppoe/pkg-message --- /usr/ports/net/rp-pppoe/pkg-message Thu Jan 1 01:00:00 1970 +++ /root/ports/net/rp-pppoe/pkg-message Tue Jul 27 01:13:30 2004 @@ -0,0 +1,4 @@ +Note that many of the script this port installs haven't been tested in +a long time and the components tested are pppoe and pppoe-relay for the +major part. Use the adsl-* configuration scripts at your own risk. +Feedback about success and failure to the port maintainer is appreciated though. diff -ruN --exclude=CVS /usr/ports/net/rp-pppoe/pkg-plist /root/ports/net/rp-pppoe/pkg-plist --- /usr/ports/net/rp-pppoe/pkg-plist Thu Jun 24 16:26:50 2004 +++ /root/ports/net/rp-pppoe/pkg-plist Tue Jul 27 01:11:36 2004 @@ -5,11 +5,14 @@ sbin/adsl-status sbin/adsl-stop sbin/pppoe +sbin/pppoe-relay sbin/pppoe-server etc/ppp/firewall-masq.sample etc/ppp/firewall-standalone.sample etc/ppp/pap-secrets.sample etc/ppp/pppoe-server-options.sample -@unexec if cmp -s %D/etc/ppp/pppoe.conf.sample %D/etc/ppp/pppoe.conf ; then rm %D/etc/ppp/pppoe.conf ; fi +@unexec for i in ppp/pppoe.conf rc.d/04pppoe-server.sh rc.d/04pppoe-relay.sh ; do if cmp -s %D/etc/$i.sample %D/etc/$i ; then rm %D/etc/$i ; fi ; done etc/ppp/pppoe.conf.sample +etc/rc.d/04pppoe-server.sh.sample +etc/rc.d/04pppoe-relay.sh.sample @unexec rmdir %D/etc/ppp 2>/dev/null || echo "If you are permanently removing pppoe, you should also ``rm -Rf ${PKG_PREFIX}/etc/ppp'' removing any configuration and password files left." | /usr/bin/fmt --- rp-pppoe-3.5_1.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E1BrDGO-0001Ur-6w>