summaryrefslogtreecommitdiffstats
path: root/package/br2684ctl
diff options
context:
space:
mode:
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-04-02 13:00:06 +0000
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-04-02 13:00:06 +0000
commitea69cda1d999824a532f6ea58deb11c1777ff8a7 (patch)
treed732a03a24c812fe26d0e322a5b531a1d212d471 /package/br2684ctl
parentd8a1a7c53e3cb7d71d2955e56d30f976ac07a773 (diff)
Add routed support to br2684
Signed-off-by: Juan I. Gonzalez <juan.i.gonzalez at subdown dot net> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@10710 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/br2684ctl')
-rwxr-xr-xpackage/br2684ctl/files/br2684ctl7
-rw-r--r--package/br2684ctl/patches/101-routed_support.patch301
2 files changed, 307 insertions, 1 deletions
diff --git a/package/br2684ctl/files/br2684ctl b/package/br2684ctl/files/br2684ctl
index b121c7a4a..b31373ffc 100755
--- a/package/br2684ctl/files/br2684ctl
+++ b/package/br2684ctl/files/br2684ctl
@@ -14,11 +14,16 @@ start_daemon() {
config_get vpi "$cfg" vpi
config_get vci "$cfg" vci
config_get encaps "$cfg" encaps
+ config_get payload "cfg" payload
case "$encaps" in
1|vc) encaps=1;;
*) encaps=0;;
esac
- br2684ctl -b -c "$unit" -e "$encaps" -a "${atmdev:+$atmdev.}${vpi:-8}.${vci:-35}"
+ case "$payload" in
+ 1|bridged) payload=1;;
+ *) payload=0;;
+ esac
+ br2684ctl -b -c "$unit" -e "$encaps" -p "$payload" -a "${atmdev:+$atmdev.}${vpi:-8}.${vci:-35}"
}
start() {
diff --git a/package/br2684ctl/patches/101-routed_support.patch b/package/br2684ctl/patches/101-routed_support.patch
new file mode 100644
index 000000000..8c73a4364
--- /dev/null
+++ b/package/br2684ctl/patches/101-routed_support.patch
@@ -0,0 +1,301 @@
+diff -Nu br2684ctl-20040226.orig/br2684ctl.c br2684ctl.orig/br2684ctl.c
+--- br2684ctl-20040226.orig/br2684ctl.c 2008-03-25 22:26:59.000000000 +0000
++++ br2684ctl.orig/br2684ctl.c 2008-03-31 10:11:06.000000000 +0100
+@@ -10,6 +10,10 @@
+ #include <atm.h>
+ #include <linux/atmdev.h>
+ #include <linux/atmbr2684.h>
++#ifndef BR2684_FLAG_ROUTED
++#warning "Kernel missing routed support for br2684"
++#define BR2684_FLAG_ROUTED (1<<16) /* payload is routed, not bridged */
++#endif
+
+ /* Written by Marcell GAL <cell@sch.bme.hu> to make use of the */
+ /* ioctls defined in the br2684... kernel patch */
+@@ -28,26 +32,35 @@
+ #define LOG_OPTION LOG_PERROR|LOG_PID
+ #define LOG_FACILITY LOG_LOCAL2
+
++struct br2684_params {
++ int itfnum;
++ int encap;
++ int sndbuf;
++ int payload;
++ char *astr; /* temporary */
++ struct atm_qos reqqos;
++};
++
+
+ int lastsock, lastitf;
+
+
+-void fatal(const char *str, int i)
++void fatal(const char *str, int err)
+ {
+- syslog (LOG_ERR,"Fatal: %s",str);
++ syslog (LOG_ERR,"Fatal: %s; %s", str, strerror(err));
+ exit(-2);
+ };
+
+
+ void exitFunc(void)
+ {
+- syslog (LOG_NOTICE,"Daemon terminated\n");
++ syslog (LOG_NOTICE,"Daemon terminated");
+ }
+
+
+ void int_signal(int dummy)
+ {
+- syslog (LOG_INFO,"Killed by a signal\n");
++ syslog (LOG_INFO,"Killed by a signal");
+ exit(0);
+ }
+
+@@ -58,7 +71,7 @@
+
+ if (num < 0) return -1;
+
+- snprintf(name, 20, "/var/run/nas%d.pid", num);
++ snprintf(name, 32, "/var/run/br2684ctl-nas%d.pid", num);
+ pidfile = fopen(name, "w");
+ if (pidfile == NULL) return -1;
+ fprintf(pidfile, "%d", getpid());
+@@ -67,9 +80,9 @@
+ return 0;
+ }
+
+-int create_br(char *nstr)
++int create_br(int itfnum, int payload)
+ {
+- int num, err;
++ int err;
+
+ if(lastsock<0) {
+ lastsock = socket(PF_ATMPVC, SOCK_DGRAM, ATM_AAL5);
+@@ -78,31 +91,36 @@
+ syslog(LOG_ERR, "socket creation failed: %s",strerror(errno));
+ } else {
+ /* create the device with ioctl: */
+- num=atoi(nstr);
+- if( num>=0 && num<1234567890){
++ if( itfnum>=0 && itfnum<1234567890){
+ struct atm_newif_br2684 ni;
+ ni.backend_num = ATM_BACKEND_BR2684;
+ ni.media = BR2684_MEDIA_ETHERNET;
++#ifdef BR2684_FLAG_ROUTED
++ if (payload == 0)
++ ni.media |= BR2684_FLAG_ROUTED;
++#endif
+ ni.mtu = 1500;
+- sprintf(ni.ifname, "nas%d", num);
++ sprintf(ni.ifname, "nas%d", itfnum);
+ err=ioctl (lastsock, ATM_NEWBACKENDIF, &ni);
+
+ if (err == 0)
+- syslog(LOG_NOTICE, "Interface \"%s\" created sucessfully\n",ni.ifname);
++ syslog(LOG_NOTICE, "Interface \"%s\" created sucessfully",ni.ifname);
+ else
+- syslog(LOG_INFO, "Interface \"%s\" could not be created, reason: %s\n",
++ syslog(LOG_INFO, "Interface \"%s\" could not be created, reason: %s",
+ ni.ifname,
+ strerror(errno));
+- lastitf=num; /* even if we didn't create, because existed, assign_vcc wil want to know it! */
++ lastitf=itfnum; /* even if we didn't create, because existed,
++ assign_vcc wil want to know it! */
+ } else {
+- syslog(LOG_ERR,"err: strange interface number %d", num );
++ syslog(LOG_ERR,"err: strange interface number %d", itfnum );
+ }
+ }
+ return 0;
+ }
+
+
+-int assign_vcc(char *astr, int encap, int bufsize, struct atm_qos qos)
++int assign_vcc(char *astr, int encap, int payload,
++ int bufsize, struct atm_qos qos)
+ {
+ int err;
+ struct sockaddr_atmpvc addr;
+@@ -112,21 +130,17 @@
+ memset(&addr, 0, sizeof(addr));
+ err=text2atm(astr,(struct sockaddr *)(&addr), sizeof(addr), T2A_PVC);
+ if (err!=0)
+- syslog(LOG_ERR,"Could not parse ATM parameters (error=%d)\n",err);
++ syslog(LOG_ERR,"Could not parse ATM parameters (error=%d)",err);
+
+-#if 0
+- addr.sap_family = AF_ATMPVC;
+- addr.sap_addr.itf = itf;
+- addr.sap_addr.vpi = 0;
+- addr.sap_addr.vci = vci;
+-#endif
+- syslog(LOG_NOTICE,"Communicating over ATM %d.%d.%d, encapsulation: %s\n", addr.sap_addr.itf,
++ syslog(LOG_NOTICE,"Communicating over ATM %d.%d.%d, encapsulation: %s",
++ addr.sap_addr.itf,
+ addr.sap_addr.vpi,
+ addr.sap_addr.vci,
+ encap?"VC mux":"LLC");
+
+ if ((fd = socket(PF_ATMPVC, SOCK_DGRAM, ATM_AAL5)) < 0)
+- syslog(LOG_ERR,"failed to create socket %d, reason: %s", errno,strerror(errno));
++ syslog(LOG_ERR,"failed to create socket %d, reason: %s",
++ errno,strerror(errno));
+
+ if (qos.aal == 0) {
+ qos.aal = ATM_AAL5;
+@@ -137,7 +151,7 @@
+ }
+
+ if ( (err=setsockopt(fd,SOL_SOCKET,SO_SNDBUF, &bufsize ,sizeof(bufsize))) )
+- syslog(LOG_ERR,"setsockopt SO_SNDBUF: (%d) %s\n",err, strerror(err));
++ syslog(LOG_ERR,"setsockopt SO_SNDBUF: (%d) %s",err, strerror(err));
+
+ if (setsockopt(fd, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0)
+ syslog(LOG_ERR,"setsockopt SO_ATMQOS %d", errno);
+@@ -145,7 +159,7 @@
+ err = connect(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_atmpvc));
+
+ if (err < 0)
+- fatal("failed to connect on socket", err);
++ fatal("failed to connect on socket", errno);
+
+ /* attach the vcc to device: */
+
+@@ -169,10 +183,30 @@
+ return fd ;
+ }
+
++void start_interface(struct br2684_params* params)
++{
++ if (params->astr==NULL) {
++ syslog(LOG_ERR, "Required ATM parameters not specified.");
++ exit(1);
++ }
++
++ create_br(params->itfnum, params->payload);
++ assign_vcc(params->astr, params->encap, params->payload, params->sndbuf,
++ params->reqqos);
++}
++
+
+ void usage(char *s)
+ {
+- printf("usage: %s [-b] [[-c number] [-e 0|1] [-s sndbuf] [-q qos] [-a [itf.]vpi.vci]*]*\n", s);
++ printf("usage: %s [-b] [[-c number] [-e 0|1] [-s sndbuf] [-q qos] [-p 0|1] "
++ "[-a [itf.]vpi.vci]*]*\n"
++ " -b = run in background (daemonize)\n"
++ " -c <num> = use interface nas<num>\n"
++ " -e 0|1 = encapsulation (0=LLC, 1=VC Mux)\n"
++ " -p 0|1 = payload type (0=routed,1=bridged)\n"
++ " -s <num> = set sndbuf (send buffer) size (default 8192)\n"
++ " -a [itf.]vpi.vci = ATM interface no, VPI, VCI\n",
++ s);
+ exit(1);
+ }
+
+@@ -180,47 +214,63 @@
+
+ int main (int argc, char **argv)
+ {
+- int c, background=0, encap=0, sndbuf=8192;
+- struct atm_qos reqqos;
+- int itfnum;
++ int c, background=0;
++
++ struct br2684_params params;
++ params.itfnum=-1;
++ params.encap=0;
++ params.sndbuf=8192;
++ params.payload=1;
++ params.astr=NULL;
++ memset(&params.reqqos, 0, sizeof(params.reqqos));
++
+ lastsock=-1;
+ lastitf=0;
+
+ /* st qos to 0 */
+- memset(&reqqos, 0, sizeof(reqqos));
+
+ openlog (LOG_NAME,LOG_OPTION,LOG_FACILITY);
+ if (argc>1)
+- while ((c = getopt(argc, argv,"q:a:bc:e:s:?h")) !=EOF)
++ while ((c = getopt(argc, argv,"q:a:bc:e:s:p:?h")) !=EOF)
+ switch (c) {
+ case 'q':
+ printf ("optarg : %s",optarg);
+- if (text2qos(optarg,&reqqos,0)) fprintf(stderr,"QOS parameter invalid\n");
++ if (text2qos(optarg,&params.reqqos,0))
++ fprintf(stderr,"QOS parameter invalid\n");
+ break;
+ case 'a':
+- assign_vcc(optarg, encap, sndbuf, reqqos);
++ params.astr=optarg;
+ break;
+ case 'b':
+ background=1;
+ break;
+ case 'c':
+- create_br(optarg);
+- itfnum = atoi(optarg);
++ /* temporary, to make it work with multiple interfaces: */
++ if (params.itfnum>=0) start_interface(&params);
++ params.itfnum= atoi(optarg);
+ break;
+ case 'e':
+- encap=(atoi(optarg));
+- if(encap<0){
+- syslog (LOG_ERR, "invalid encapsulation: %s:\n",optarg);
+- encap=0;
++ params.encap=(atoi(optarg));
++ if(params.encap<0){
++ syslog (LOG_ERR, "invalid encapsulation: %s:",optarg);
++ params.encap=0;
+ }
+ break;
+ case 's':
+- sndbuf=(atoi(optarg));
+- if(sndbuf<0){
+- syslog(LOG_ERR, "Invalid sndbuf: %s, using size of 8192 instead\n",optarg);
+- sndbuf=8192;
++ params.sndbuf=(atoi(optarg));
++ if(params.sndbuf<0){
++ syslog(LOG_ERR, "Invalid sndbuf: %s, using size of 8192 instead",
++ optarg);
++ params.sndbuf=8192;
+ }
+ break;
++ case 'p': /* payload type: routed (0) or bridged (1) */
++#ifdef BR2684_FLAG_ROUTED
++ params.payload = atoi(optarg);
++ break;
++#else
++ syslog(LOG_ERR, "payload option not supported.");
++#endif
+ case '?':
+ case 'h':
+ default:
+@@ -231,6 +281,8 @@
+
+ if (argc != optind) usage(argv[0]);
+
++ start_interface(&params);
++
+ if(lastsock>=0) close(lastsock);
+
+ if (background) {
+@@ -268,11 +275,11 @@
+
+ }
+
+- create_pidfile(itfnum);
++ create_pidfile(params.itfnum);
+ signal(SIGINT, int_signal);
+ signal(SIGTERM, int_signal);
+
+- syslog (LOG_INFO, "RFC 1483/2684 bridge daemon started\n");
++ syslog (LOG_INFO, "RFC 1483/2684 bridge daemon started");
+ atexit (exitFunc);
+
+ while (1) pause(); /* to keep the sockets... */