source: src/router/services/services/bridgetools.c @ 18434

Last change on this file since 18434 was 18434, checked in by BrainSlayer, 16 months ago

must use brctl to enable stp, the kernel will call bridge-stp then

File size: 4.6 KB
Line 
1/*
2 * bridgetools.c
3 *
4 * Copyright (C) 2007 Sebastian Gottschall <gottschall@dd-wrt.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 *
20 * $Id:
21 */
22#include <stdlib.h>
23#include <bcmnvram.h>
24#include <shutils.h>
25#include <utils.h>
26#include <syslog.h>
27#ifdef HAVE_MICRO
28
29int brctl_main(int argc, char **argv)
30{
31        if (argc == 1) {
32                fprintf(stderr, "try to be professional!\n");
33                return -1;
34        }
35        br_init();
36        if (!strcmp(argv[1], "addif")) {
37                if (ifexists(argv[3]))
38                        br_add_interface(argv[2], argv[3]);
39        }
40        if (!strcmp(argv[1], "delif")) {
41                if (ifexists(argv[3]))
42                        br_del_interface(argv[2], argv[3]);
43        }
44        if (!strcmp(argv[1], "addbr")) {
45                br_add_bridge(argv[2]);
46        }
47        if (!strcmp(argv[1], "stp")) {
48                br_set_stp_state(argv[2], atoi(argv[3]));
49        }
50        if (!strcmp(argv[1], "delbr")) {
51                if (!ifexists(argv[2]))
52                        return -1;
53                br_del_bridge(argv[2]);
54        }
55        if (!strcmp(argv[1], "show")) {
56                br_cmd_show();
57        }
58        br_shutdown();
59}
60#else
61
62#ifdef HAVE_MSTP
63
64int br_set_stp_state(const char *br, int stp_state)
65{
66        if (!ifexists(br))
67                return -1;
68        if (stp_state == 1) {
69                // syslog (LOG_INFO, "stp is set to on\n");
70                return eval("brctl", "stp", br, "1");
71        } else {
72                // syslog (LOG_INFO, "stp is set to off\n");
73                return eval("brctl", "stp", br, "0");
74        }
75}
76
77int br_set_port_prio(const char *br, char *port, char *prio)
78{
79        if (!ifexists(br))
80                return -1;
81        return eval("mstpctl", "settreeportprio", br, port, "0", prio);
82}
83
84int br_set_bridge_prio(const char *br, char *prio)
85{
86        if (!ifexists(br))
87                return -1;
88        return eval("mstpctl", "settreeprio", br, "0", prio);
89}
90
91int br_set_bridge_forward_delay(const char *br, int sec)
92{
93        char delay[32];
94
95        sprintf(delay, "%d", sec);
96        return eval("mstpctl", "setfdelay", br, delay);
97
98}
99#else
100int br_set_bridge_forward_delay(const char *br, int sec)
101{
102        char delay[32];
103
104        sprintf(delay, "%d", sec);
105        return eval("brctl", "setfd", br, delay);
106}
107
108int br_set_stp_state(const char *br, int stp_state)
109{
110        if (!ifexists(br))
111                return -1;
112        if (stp_state == 1) {
113                // syslog (LOG_INFO, "stp is set to on\n");
114                return eval("brctl", "stp", br, "1");
115        } else {
116                // syslog (LOG_INFO, "stp is set to off\n");
117                return eval("brctl", "stp", br, "0");
118        }
119}
120
121int br_set_port_prio(const char *br, char *port, char *prio)
122{
123        if (!ifexists(br))
124                return -1;
125        return eval("brctl", "setportprio", br, port, prio);
126}
127
128int br_set_bridge_prio(const char *br, char *prio)
129{
130        if (!ifexists(br))
131                return -1;
132        return eval("brctl", "setbridgeprio", br, prio);
133}
134
135#endif
136int br_add_bridge(const char *brname)
137{
138        dd_syslog(LOG_INFO, "bridge added successfully\n");
139        char ipaddr[32];
140
141        sprintf(ipaddr, "%s_ipaddr", brname);
142        char netmask[32];
143
144        sprintf(netmask, "%s_netmask", brname);
145        int ret = eval("brctl", "addbr", brname);
146
147        if (nvram_get(ipaddr) && nvram_get(netmask)
148            && !nvram_match(ipaddr, "0.0.0.0")
149            && !nvram_match(netmask, "0.0.0.0")) {
150                eval("ifconfig", brname, nvram_safe_get(ipaddr), "netmask",
151                     nvram_safe_get(netmask), "mtu", getBridgeMTU(brname),
152                     "up");
153        } else
154                eval("ifconfig", brname, "mtu", getBridgeMTU(brname));
155        return ret;
156}
157
158int br_del_bridge(const char *brname)
159{
160        if (!ifexists(brname))
161                return -1;
162        dd_syslog(LOG_INFO, "bridge deleted successfully\n");
163        return eval("brctl", "delbr", brname);
164}
165
166int br_add_interface(const char *br, const char *dev)
167{
168        if (!ifexists(dev))
169                return -1;
170        char ipaddr[32];
171
172        sprintf(ipaddr, "%s_ipaddr", dev);
173        char netmask[32];
174
175        sprintf(netmask, "%s_netmask", dev);
176
177        eval("ifconfig", dev, "0.0.0.0");
178        if (strncmp(dev, "ath", 3) != 0) {      // this is not an ethernet driver
179                eval("ifconfig", dev, "down");  //fixup for some ethernet drivers
180        }
181        eval("ifconfig", dev, "mtu", getBridgeMTU(br));
182        if (strncmp(dev, "ath", 3) != 0) {      // this is not an ethernet driver
183                eval("ifconfig", dev, "up");
184        }
185
186        dd_syslog(LOG_INFO, "interface added successfully\n");
187        return eval("brctl", "addif", br, dev);
188}
189
190int br_del_interface(const char *br, const char *dev)
191{
192        if (!ifexists(dev))
193                return -1;
194        dd_syslog(LOG_INFO, "interface deleted successfully\n");
195        return eval("brctl", "delif", br, dev);
196}
197
198#endif
Note: See TracBrowser for help on using the repository browser.