├── README.md ├── build ├── decompress ├── install_ubnt_bcast_relay.v1.0 ├── install_ubnt_bcast_relay.v1.0.tgz ├── install_ubnt_bcast_relay.v1.1 ├── install_ubnt_bcast_relay.v1.1.tgz ├── install_ubnt_bcast_relay.v1.2 ├── install_ubnt_bcast_relay.v1.2.tgz ├── payload.tgz ├── payload ├── binaries │ └── udp-bcast-relay ├── remove.sh ├── scripts │ └── ubnt-bcast-relay.pl ├── setup.sh ├── templates-cfg │ └── service │ │ └── bcast-relay │ │ ├── id │ │ ├── node.def │ │ └── node.tag │ │ │ ├── address │ │ │ └── node.def │ │ │ ├── description │ │ │ └── node.def │ │ │ ├── interface │ │ │ └── node.def │ │ │ └── port │ │ │ └── node.def │ │ └── node.def └── version ├── ubnt-bcast-relay_ER-X.tgz ├── ubnt_bcast_relay.1.0.setup.tgz ├── ubnt_bcast_relay.1.1.setup.tgz ├── ubnt_bcast_relay.1.2.setup.tgz └── version /README.md: -------------------------------------------------------------------------------- 1 | # [Multicast, Sonos, Phorus & Play-Fi Broadcast 255.255.255.255: Discovery Solution](https://community.ubnt.com/t5/EdgeMAX/Multicast-Sonos-Phorus-amp-Play-Fi-Broadcast-255-255-255-255-lt/td-p/1259616) 2 | 3 | ## Licenses 4 | 5 | * GNU General Public License, version 3 6 | * GNU Lesser General Public License, version 3 7 | 8 | ## Features 9 | 10 | * [UDP Packet Broadcast Relay](http://www.joachim-breitner.de/udp-broadcast-relay/) compiled for EdgeMAX MIPS64 11 | * Integrated with EdgeOS CLI 12 | * Can also be configured from the EdgeOS Web GUI 13 | * Lightweight, very low overhead for home based networks 14 | 15 | ### This solution is designed to work on EdgeMAX routers. It has been tested up to EdgeOS v1.10.x 16 | 17 | So, like many folk who like to segregate our SOHO home networks with VLANs, subnets, etc., I was frustrated at not being able to use iOS apps, Windows drivers etc. to find and use (in my case) a Play-Fi LAN streaming speaker system on my logical networks. 18 | 19 | First, I was able to use IGMP-PROXY for the standard broadcast protocols across my VLANs, however, although systems (NAS, Printers, etc.) were happily broadcasting, the Phorus/Play-Fi 255.255.255.255:10102 broadcasts weren't reflected across the VLANs, which is actually a good thing in general, but not for my use case. 20 | 21 | Here is my LAN equipment configuration: 22 | 23 | ERL3 -> ToughSwitch 8-Pro (root switch) -> Cisco SG 200-08 24 | 25 | Definitive Technology W9 WiFi/Wired speaker is on my home user network VLAN 5 and is located in my den 26 | 27 | Office network is VLAN 6 28 | 29 | In order to have devices on VLAN 6 discover and use the W9 on VLAN 5, I needed to rebroadcast 255.255.255.255 on port 10102. I accomplished this, by downloading and compiling [Joachim Breitner's brilliant udp-broadcast-relay](http://www.joachim-breitner.de/udp-broadcast-relay/) on my ERL3 and then integrating it into the CLI configuration. 30 | 31 | YMMV and of course, there is always a risk using any non Ubiquiti approved/test software, but for those of us stuck with equipment that forces a home user paradigm on our networking, this may be the antidote. 32 | 33 | ## Installation 34 | 35 | * upload install_ubnt_bcast_relay.v1.2 to your router 36 | 37 | curl -Lo /tmp/install_ubnt_bcast_relay.v1.2.tgz https://github.com/britannic/ubnt-bcast-relay/raw/master/install_ubnt_bcast_relay.v1.2.tgz 38 | cd /tmp 39 | sudo tar zxvf ./install_ubnt_bcast_relay.v1.2.tgz 40 | sudo bash ./install_ubnt_bcast_relay.v1.2 41 | select menu option #1 if installing for the first time 42 | select menu option #2 to completely remove ubnt_bcast_relay 43 | 44 | ## Installation steps for EdgeRouter X 45 | 46 | * upload ubnt-bcast-relay_ER-X.tgz to your router and run the installer 47 | 48 | curl -Lo /tmp/ubnt-bcast-relay_ER-X.tgz https://github.com/britannic/ubnt-bcast-relay/raw/master/ubnt-bcast-relay_ER-X.tgz 49 | cd /tmp 50 | sudo tar zxvf ./ubnt-bcast-relay_ER-X.tgz 51 | sudo bash ./ubnt-bcast-relay/install.sh 52 | 53 | ## Removal 54 | 55 | ## Configuration 56 | 57 | ### Setup initial configuration 58 | 59 | Using the network description above, here is a working example: 60 | 61 | Run configure: 62 | 63 | set service bcast-relay id 1 description 'Play-Fi listener' 64 | set service bcast-relay id 1 interface eth0.5 65 | set service bcast-relay id 1 interface eth0.6 66 | set service bcast-relay id 1 port 10102 67 | commit 68 | save 69 | exit 70 | 71 | 72 | This generates a configuration stanza like this: 73 | 74 | service { 75 | bcast-relay { 76 | id 1 { 77 | description "Play-Fi listener" 78 | interface eth0.5 79 | interface eth0.6 80 | port 10102 81 | } 82 | } 83 | } 84 | 85 | ### Remove configuration 86 | 87 | Run configure 88 | delete service bcast-relay 89 | commit 90 | save 91 | exit 92 | 93 | #### To clone UBNT Broadcast Relay: 94 | 95 | git clone https://github.com/britannic/ubnt-bcast-relay.git 96 | -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | export COPY_EXTENDED_ATTRIBUTES_DISABLE=true 3 | export COPYFILE_DISABLE=true 4 | 5 | VERSION=$(cat ./version) 6 | NAME='ubnt_bcast_relay' 7 | # DROPBOX='/Users/Neil/Dropbox/EdgeMax' 8 | BCAST="${NAME}.${VERSION}." 9 | INSTALL="install_${NAME}.v${VERSION}" 10 | PAYLOAD='payload' 11 | 12 | if [[ -e "${0##*/}" ]]; then 13 | BASEDIR="$(pwd)" 14 | [[ -f ${BCAST}setup.tgz ]] && rm ${BCAST}setup.tgz 15 | cd ${PAYLOAD} 16 | echo ${VERSION} > version 17 | tar zcf ../${PAYLOAD}.tgz --exclude='._*' --exclude='.svn' --exclude='.DS_Store' --exclude='*.bak' --exclude='*~' ./* 18 | cd .. 19 | 20 | if [[ -e ${PAYLOAD}.tgz ]]; then 21 | cat decompress ${PAYLOAD}.tgz > ${INSTALL} 22 | else 23 | echo "${PAYLOAD}.tgz does not exist" 24 | exit 1 25 | fi 26 | 27 | chmod 0755 ${INSTALL} 28 | tar zcf ${INSTALL}.tgz ${INSTALL} 29 | echo "${INSTALL} created" 30 | # [[ -d "${DROPBOX}/" ]] && install -m 0755 ${INSTALL}.tgz "${DROPBOX}/" 31 | tar -zcf ../${BCAST}setup.tgz --exclude='._*' --exclude='.svn' --exclude='.DS_Store' --exclude='*.bak' --exclude='*~' "${BASEDIR}"/* 32 | mv ../${BCAST}setup.tgz "${BASEDIR}"/ 33 | 34 | [[ ${1} ]] && /usr/bin/scp "${BASEDIR}"/${INSTALL} ${1}@scratch:/tmp/${INSTALL} 35 | else 36 | echo "$(basename $0) must be run in the directory where it is located." 37 | fi 38 | exit 0 39 | -------------------------------------------------------------------------------- /decompress: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo 3 | echo 'Self Extracting Installer' 4 | echo 5 | echo 'UBNT UDP Broadcast Relay' 6 | echo 7 | 8 | VERSION='1.0' 9 | 10 | install_menu () { 11 | local IFS=' ' 12 | local PS3='Enter option number and hit return => ' 13 | local OPTIONS=('INSTALL' 'REMOVE' 'QUIT') 14 | shopt -s checkwinsize 15 | local COLUMNS=$(tput cols) 16 | 17 | while true; 18 | do 19 | echo -ne "Would you like to INSTALL, REMOVE or QUIT\n\n" | fold -s -w ${COLUMNS} 20 | select CHOICE in ${OPTIONS[@]}; do 21 | case ${REPLY} in 22 | 1) clear console 23 | sudo bash ./setup.sh 24 | return 1 25 | ;; 26 | 2) clear console 27 | if /opt/vyatta/bin/yesno -n 'Do you want to completely remove UBNT UDP Broadcast Relay? [y/N]: ' 28 | then 29 | sudo bash ./remove.sh 30 | break 31 | fi 32 | ;; 33 | 3|*) return 0 34 | ;; 35 | esac 36 | done 37 | done 38 | } 39 | 40 | CDIR="$(pwd)" 41 | 42 | # Make sure script runs as root 43 | if [[ ${EUID} -ne 0 ]]; then 44 | echo "$0 must be run as sudo or root!" 45 | exit 1 46 | fi 47 | 48 | export TMPDIR=$(mktemp -d /tmp/selfextract.XXXXXX) 49 | 50 | ARCHIVE=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' $0) 51 | 52 | tail -n+${ARCHIVE} $0 | tar xz -C "${TMPDIR}" 53 | 54 | cd "${TMPDIR}" 55 | 56 | install_menu 57 | 58 | cd "${CDIR}" 59 | rm -rf "${TMPDIR}" 60 | 61 | exit 0 62 | 63 | __ARCHIVE_BELOW__ 64 | -------------------------------------------------------------------------------- /install_ubnt_bcast_relay.v1.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/install_ubnt_bcast_relay.v1.0 -------------------------------------------------------------------------------- /install_ubnt_bcast_relay.v1.0.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/install_ubnt_bcast_relay.v1.0.tgz -------------------------------------------------------------------------------- /install_ubnt_bcast_relay.v1.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/install_ubnt_bcast_relay.v1.1 -------------------------------------------------------------------------------- /install_ubnt_bcast_relay.v1.1.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/install_ubnt_bcast_relay.v1.1.tgz -------------------------------------------------------------------------------- /install_ubnt_bcast_relay.v1.2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/install_ubnt_bcast_relay.v1.2 -------------------------------------------------------------------------------- /install_ubnt_bcast_relay.v1.2.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/install_ubnt_bcast_relay.v1.2.tgz -------------------------------------------------------------------------------- /payload.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/payload.tgz -------------------------------------------------------------------------------- /payload/binaries/udp-bcast-relay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/payload/binaries/udp-bcast-relay -------------------------------------------------------------------------------- /payload/remove.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script uninstalls the udp-bcast-relay 4 | 5 | # Set up the EdgeOS environment 6 | source /opt/vyatta/etc/functions/script-template 7 | shopt -s expand_aliases 8 | alias show='_vyatta_op_run show' 9 | alias run='/opt/vyatta/bin/vyatta-op-cmd-wrapper' 10 | alias check='/bin/cli-shell-api' 11 | 12 | # You must be root 13 | if [[ $EUID -ne 0 ]]; then 14 | echo "This script must be run as sudo or root" 1>&2 15 | exit 1 16 | fi 17 | 18 | # Check to see if bcast-relay is still configured and bail if it is 19 | check existsActive service bcast-relay 20 | if [[ $? -eq 0 ]]; then 21 | echo "[service bcast-relay] must be deleted from the configuration before removing the program" 1>&2 22 | exit 1 23 | fi 24 | 25 | progname='udp-bcast-relay' 26 | target='/config/scripts' 27 | 28 | echo "Stopping ubnt-bcast-relay service" 29 | ${target}/ubnt-bcast-relay.pl --stop 30 | 31 | # Delete files 32 | echo "Removing udp-bcast-relay from /opt/vyatta/sbin/" 33 | rm /opt/vyatta/sbin/udp-bcast-relay 34 | echo "Removing udp-bcast-relay.pl from ${target}/ubnt-bcast-relay.pl" 35 | rm ${target}/ubnt-bcast-relay.pl 36 | echo "Removing ubnt-bcast-relay templates from ${basedir}/templates-cfg/service/" 37 | rm -rf /opt/vyatta/share/vyatta-cfg/templates/service/bcast-relay 38 | 39 | # Finished 40 | echo "Uninstall of $progname complete." 41 | 42 | -------------------------------------------------------------------------------- /payload/scripts/ubnt-bcast-relay.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use lib '/opt/vyatta/share/perl5'; 4 | use File::Basename; 5 | use File::Compare; 6 | use Getopt::Long; 7 | use POSIX; 8 | use Vyatta::Config; 9 | 10 | use warnings; 11 | use strict; 12 | 13 | my $version = q{1.0}; 14 | my ( $update, $stop ); 15 | my $FALSE = 0; 16 | my $TRUE = 1; 17 | my $executable = q{/opt/vyatta/sbin/udp-bcast-relay}; 18 | my $pid_file = q{/var/run/udp-bcast-relay}; 19 | 20 | ############################### script runs here ############################### 21 | exit 0 if &main(); 22 | exit 1; 23 | ################################################################################ 24 | 25 | # Process the active configuration 26 | sub get_cfg_actv { 27 | my $config = new Vyatta::Config; 28 | my $input = shift; 29 | my $path = q{service bcast-relay id}; 30 | my $exists = q{existsOrig}; 31 | my $listNodes = q{listOrigNodes}; 32 | my $returnValue = q{returnOrigValue}; 33 | my $returnValues = q{returnOrigValues}; 34 | 35 | if ( is_configure() ) { 36 | $exists = q{exists}; 37 | $listNodes = q{listNodes}; 38 | $returnValue = q{returnValue}; 39 | $returnValues = q{returnValues}; 40 | } 41 | 42 | $config->setLevel($path); 43 | my @relays = $config->$listNodes(); 44 | 45 | for my $relay (@relays) { 46 | $config->setLevel( $path . q{ } . $relay ); 47 | my $lport = $config->$returnValue(q{port}); 48 | my @interfaces = $config->$returnValues(q{interface}); 49 | my ( $args, $error ); 50 | 51 | if ( scalar(@interfaces) < 2 ) { 52 | print qq{You must configure at least two valid interfaces!\n} 53 | . join( q{ }, @interfaces ); 54 | $error = $TRUE; 55 | } 56 | 57 | if ( !$lport ) { 58 | print qq{Port must be configured!\n}; 59 | $error = $TRUE; 60 | } 61 | exit 1 if $error; 62 | 63 | my $sourceaddress = $config->$returnValue(q{address}); 64 | if ( defined $sourceaddress && $sourceaddress ne q{} ) { 65 | $args = qq{ -s ${sourceaddress} ${relay} ${lport} } 66 | . join( q{ }, @interfaces ); 67 | } 68 | else { 69 | $args = qq{${relay} ${lport} } . join( q{ }, @interfaces ); 70 | } 71 | 72 | $input->{relays}->{$relay} = $args; 73 | } 74 | return $TRUE; 75 | } 76 | 77 | # Set up command line options 78 | sub get_options { 79 | my $input = shift; 80 | my @opts = ( 81 | [ 82 | q{--stop # Restart ubnt-bcast-relay with current configuration}, 83 | q{stop!} => \$stop 84 | ], 85 | [ 86 | q{--update # Restart ubnt-bcast-relay with current configuration}, 87 | q{update!} => \$update 88 | ], 89 | [ 90 | q{--help # Show help and usage text}, 91 | q{help} => sub { usage( { option => q{help}, exit_code => 0 } ) } 92 | ], 93 | [ 94 | q{--version # show program version number}, 95 | q{version} => sub { usage( { option => q{version}, exit_code => 0 } ) } 96 | ], 97 | ); 98 | 99 | return \@opts if $input->{option}; 100 | 101 | # Read command line flags and exit with help message if any are unknown 102 | return GetOptions( map { my $options = $_; (@$options)[ 1 .. $#$options ] } 103 | @opts ); 104 | return; 105 | } 106 | 107 | # Make sure script runs as root 108 | sub is_admin { 109 | return $TRUE if geteuid() == 0; 110 | return; 111 | } 112 | 113 | # Check to see if we are being run under configure 114 | sub is_configure { 115 | qx{/bin/cli-shell-api inSession}; 116 | return $? >> 8 != 0 ? $FALSE : $TRUE; 117 | } 118 | 119 | # This is the main function 120 | sub main { 121 | my $cfg = { relays => {}, }; 122 | 123 | # Get command line options or print help if no valid options 124 | get_options() or usage( { option => q{help}, exit_code => 1 } ); 125 | usage( { option => q{sudo}, exit_code => 1 } ) if not is_admin(); 126 | 127 | get_cfg_actv($cfg); 128 | 129 | if ($update) { 130 | restart_daemon($cfg); 131 | exit 0; 132 | } 133 | 134 | if ($stop) { 135 | stop_daemon($cfg); 136 | exit 0; 137 | } 138 | } 139 | 140 | # Restart 141 | sub restart_daemon { 142 | my $cfg = shift; 143 | stop_daemon($cfg); 144 | 145 | for my $relay ( keys %{$cfg->{relays}} ) { 146 | my $file = $pid_file . q{.} . ${relay} . q{.pid}; 147 | my $cmd 148 | = qq{start-stop-daemon --start --quiet --background } 149 | . q{--make-pidfile --pidfile } 150 | . $file 151 | . qq{ --exec } 152 | . $executable . q{ -- } 153 | . $cfg->{relays}->{$relay}; 154 | 155 | system($cmd) == 0 or die qq{start-stop-daemon failed: $?}; 156 | } 157 | } 158 | 159 | # Stop 160 | sub stop_daemon { 161 | my $cfg = shift; 162 | 163 | for my $relay ( keys %{$cfg->{relays}} ) { 164 | my $file = $pid_file . q{.} . ${relay} . q{.pid}; 165 | if ( -f $file ) { 166 | my $cmd = q{start-stop-daemon --quiet --stop --oknodo --pidfile } . $file; 167 | system($cmd); 168 | unlink $file; 169 | } 170 | } 171 | } 172 | 173 | # Process command line options and print usage 174 | sub usage { 175 | my $input = shift; 176 | my $progname = basename($0); 177 | my $usage = { 178 | help => sub { 179 | my $exitcode = shift; 180 | local $, = qq{\n}; 181 | print STDERR @_; 182 | print STDERR qq{usage: $progname \n}; 183 | print STDERR q{options:}, 184 | map( q{ } x 4 . $_->[0], 185 | sort { $a->[1] cmp $b->[1] } grep $_->[0] ne q{}, 186 | @{ get_options( { option => $TRUE } ) } ), 187 | qq{\n}; 188 | $exitcode == 1 ? return $TRUE : exit $exitcode; 189 | }, 190 | sudo => sub { 191 | my $exitcode = shift; 192 | print STDERR qq{This script must be run as root, use: sudo $0.\n}; 193 | exit $exitcode; 194 | }, 195 | version => sub { 196 | my $exitcode = shift; 197 | printf STDERR qq{%s version: %s\n}, $progname, $version; 198 | exit $exitcode; 199 | }, 200 | }; 201 | 202 | # Process option argument 203 | $usage->{ $input->{option} }->( $input->{exit_code} ); 204 | } 205 | -------------------------------------------------------------------------------- /payload/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script installs ubnt-bcast-relay and integrates it with the CLI 4 | 5 | # You must be root 6 | if [[ $EUID -ne 0 ]]; then 7 | echo "This script must be run as sudo (root)" 1>&2 8 | exit 1 9 | fi 10 | 11 | basedir=$(dirname $0) 12 | target='/config/scripts' 13 | 14 | # Copy binary into /opt/vyatta/sbin 15 | echo "Installing udp-bcast-relay to /opt/vyatta/sbin/" 16 | install -o root -g root -m 0755 ${basedir}/binaries/udp-bcast-relay /opt/vyatta/sbin/udp-bcast-relay 17 | 18 | # Copy config helper script into /opt/vyatta/sbin 19 | echo "Installing ubnt-bcast-relay.pl to ${target}/" 20 | install -o root -g root -m 0755 ${basedir}/scripts/ubnt-bcast-relay.pl ${target}/ubnt-bcast-relay.pl 21 | 22 | # Copy vyatta-cfg templates 23 | echo "Copying ubnt-bcast-relay templates to ${basedir}/templates-cfg/service/bcast-relay" 24 | cp -r ${basedir}/templates-cfg/service/bcast-relay /opt/vyatta/share/vyatta-cfg/templates/service/ 25 | chown -R root:root /opt/vyatta/share/vyatta-cfg/templates/service/bcast-relay 26 | -------------------------------------------------------------------------------- /payload/templates-cfg/service/bcast-relay/id/node.def: -------------------------------------------------------------------------------- 1 | tag: 2 | priority: 990 3 | type: u32 4 | 5 | help: A unique ID # for each network that udp-bcast-relay listens on 6 | 7 | syntax:expression: $VAR(@) > 0 && $VAR(@) <= 99 ; \ 8 | "ID number must be in range 1 to 99" 9 | 10 | val_help: u32:1-99; Numerical ID # 11 | comp_help: Make sure that the ID # is unique for each network. 12 | 13 | end: if [[ "$COMMIT_ACTION" == "DELETE" ]]; then 14 | sudo /config/scripts/ubnt-bcast-relay.pl --stop; 15 | else 16 | sudo /config/scripts/ubnt-bcast-relay.pl --update; 17 | fi 18 | 19 | -------------------------------------------------------------------------------- /payload/templates-cfg/service/bcast-relay/id/node.tag/address/node.def: -------------------------------------------------------------------------------- 1 | type: ipv4 2 | help: Sets the source IP of forwarded packets, otherwise the original sender's address is used 3 | val_help: ipv4: Optional: source IP address for forwarded packets 4 | -------------------------------------------------------------------------------- /payload/templates-cfg/service/bcast-relay/id/node.tag/description/node.def: -------------------------------------------------------------------------------- 1 | type: txt 2 | help: UDP broadcast daemon description 3 | -------------------------------------------------------------------------------- /payload/templates-cfg/service/bcast-relay/id/node.tag/interface/node.def: -------------------------------------------------------------------------------- 1 | multi: 2 | type: txt 3 | help: Interface to repeat UDP broadcasts to [REQUIRED] 4 | 5 | allowed: /usr/sbin/ubnt-ifctl list-sys-intfs all 6 | 7 | commit:expression: exec "/usr/sbin/ubnt-ifctl valid-intf $VAR(@) all error" 8 | -------------------------------------------------------------------------------- /payload/templates-cfg/service/bcast-relay/id/node.tag/port/node.def: -------------------------------------------------------------------------------- 1 | type: u32 2 | 3 | help: Destination or source port to listen and retransmit on 4 | 5 | syntax:expression: $VAR(@) > 0 && $VAR(@) <= 65535 ; \ 6 | "Port number must be in range 1 to 65535" 7 | 8 | val_help: u32:1-65535; Numbered port 9 | comp_help: Make sure that the port # matches the broadcast port. 10 | -------------------------------------------------------------------------------- /payload/templates-cfg/service/bcast-relay/node.def: -------------------------------------------------------------------------------- 1 | help: UDP Broadcast Relay parameters 2 | -------------------------------------------------------------------------------- /payload/version: -------------------------------------------------------------------------------- 1 | 1.2 2 | -------------------------------------------------------------------------------- /ubnt-bcast-relay_ER-X.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/ubnt-bcast-relay_ER-X.tgz -------------------------------------------------------------------------------- /ubnt_bcast_relay.1.0.setup.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/ubnt_bcast_relay.1.0.setup.tgz -------------------------------------------------------------------------------- /ubnt_bcast_relay.1.1.setup.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/ubnt_bcast_relay.1.1.setup.tgz -------------------------------------------------------------------------------- /ubnt_bcast_relay.1.2.setup.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/britannic/ubnt-bcast-relay/08f5459696bc875caf89583c787ad8c423bb554a/ubnt_bcast_relay.1.2.setup.tgz -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | 1.2 2 | --------------------------------------------------------------------------------