aboutsummaryrefslogtreecommitdiff
path: root/net/rp-pppoe
diff options
context:
space:
mode:
authorKirill Ponomarev <krion@FreeBSD.org>2004-08-01 16:31:10 +0000
committerKirill Ponomarev <krion@FreeBSD.org>2004-08-01 16:31:10 +0000
commitb88d4fa6e7ec031bd5c89f5370ed94a29ca0d61c (patch)
tree1f7755ec2482e0b6f17f9dbb1ee7bd7112498430 /net/rp-pppoe
parente90cae033911daf478722823127970eb4f1f9274 (diff)
downloadports-b88d4fa6e7ec031bd5c89f5370ed94a29ca0d61c.tar.gz
ports-b88d4fa6e7ec031bd5c89f5370ed94a29ca0d61c.zip
Enable pppoe-relay
PR: ports/69868 Submitted by: maintainer
Notes
Notes: svn path=/head/; revision=115208
Diffstat (limited to 'net/rp-pppoe')
-rw-r--r--net/rp-pppoe/Makefile13
-rw-r--r--net/rp-pppoe/files/04pppoe-relay.sh.sample30
-rw-r--r--net/rp-pppoe/files/04pppoe-server.sh.sample31
-rw-r--r--net/rp-pppoe/files/patch-ab11
-rw-r--r--net/rp-pppoe/files/patch-ac15
-rw-r--r--net/rp-pppoe/files/patch-ad179
-rw-r--r--net/rp-pppoe/files/patch-ae16
-rw-r--r--net/rp-pppoe/pkg-message4
-rw-r--r--net/rp-pppoe/pkg-plist5
9 files changed, 298 insertions, 6 deletions
diff --git a/net/rp-pppoe/Makefile b/net/rp-pppoe/Makefile
index f9d6b096b1c7..20e9d24408c7 100644
--- a/net/rp-pppoe/Makefile
+++ b/net/rp-pppoe/Makefile
@@ -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 @@ COMMENT= "The popular Roaring Penguin's PPPoE software"
USE_REINPLACE= yes
GNU_CONFIGURE= yes
+PATCH_WRKSRC= ${WRKSRC}/src
CONFIGURE_WRKSRC= ${WRKSRC}/src
BUILD_WRKSRC= ${WRKSRC}/src
@@ -50,7 +52,7 @@ post-patch:
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 @@ do-install:
@${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 @@ do-install:
.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 --git a/net/rp-pppoe/files/04pppoe-relay.sh.sample b/net/rp-pppoe/files/04pppoe-relay.sh.sample
new file mode 100644
index 000000000000..1915d5c7b578
--- /dev/null
+++ b/net/rp-pppoe/files/04pppoe-relay.sh.sample
@@ -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 --git a/net/rp-pppoe/files/04pppoe-server.sh.sample b/net/rp-pppoe/files/04pppoe-server.sh.sample
new file mode 100644
index 000000000000..6195e84b9d8c
--- /dev/null
+++ b/net/rp-pppoe/files/04pppoe-server.sh.sample
@@ -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 --git a/net/rp-pppoe/files/patch-ab b/net/rp-pppoe/files/patch-ab
new file mode 100644
index 000000000000..e5185a1c211b
--- /dev/null
+++ b/net/rp-pppoe/files/patch-ab
@@ -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 --git a/net/rp-pppoe/files/patch-ac b/net/rp-pppoe/files/patch-ac
new file mode 100644
index 000000000000..0203a0b745dc
--- /dev/null
+++ b/net/rp-pppoe/files/patch-ac
@@ -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 --git a/net/rp-pppoe/files/patch-ad b/net/rp-pppoe/files/patch-ad
new file mode 100644
index 000000000000..5bab53ed4e0d
--- /dev/null
+++ b/net/rp-pppoe/files/patch-ad
@@ -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 --git a/net/rp-pppoe/files/patch-ae b/net/rp-pppoe/files/patch-ae
new file mode 100644
index 000000000000..10ecb35213df
--- /dev/null
+++ b/net/rp-pppoe/files/patch-ae
@@ -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 --git a/net/rp-pppoe/pkg-message b/net/rp-pppoe/pkg-message
new file mode 100644
index 000000000000..cde1a1b25cb6
--- /dev/null
+++ b/net/rp-pppoe/pkg-message
@@ -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 --git a/net/rp-pppoe/pkg-plist b/net/rp-pppoe/pkg-plist
index d127ac2a78ad..2119af2c4bb2 100644
--- a/net/rp-pppoe/pkg-plist
+++ b/net/rp-pppoe/pkg-plist
@@ -5,11 +5,14 @@ sbin/adsl-start
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