projects
/
project
/
netifd.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e7ac407
)
bridge: set the mac address based on the first active member
author
Felix Fietkau
<nbd@openwrt.org>
Wed, 23 May 2012 14:09:45 +0000
(16:09 +0200)
committer
Felix Fietkau
<nbd@openwrt.org>
Wed, 23 May 2012 14:09:45 +0000
(16:09 +0200)
bridge.c
patch
|
blob
|
history
diff --git
a/bridge.c
b/bridge.c
index
b1b79e8
..
1725162
100644
(file)
--- a/
bridge.c
+++ b/
bridge.c
@@
-84,6
+84,7
@@
struct bridge_state {
bool active;
bool force_active;
bool active;
bool force_active;
+ struct bridge_member *primary_port;
struct vlist_tree members;
int n_present;
};
struct vlist_tree members;
int n_present;
};
@@
-96,6
+97,23
@@
struct bridge_member {
char name[];
};
char name[];
};
+static void
+bridge_reset_primary(struct bridge_state *bst)
+{
+ struct bridge_member *bm;
+
+ bst->primary_port = NULL;
+ vlist_for_each_element(&bst->members, bm, node) {
+ if (!bm->present)
+ continue;
+
+ bst->primary_port = bm;
+ memcpy(bst->dev.settings.macaddr, bm->dev.dev->settings.macaddr, 6);
+ bst->dev.settings.flags |= DEV_OPT_MACADDR;
+ return;
+ }
+}
+
static int
bridge_disable_member(struct bridge_member *bm)
{
static int
bridge_disable_member(struct bridge_member *bm)
{
@@
-145,6
+163,9
@@
bridge_remove_member(struct bridge_member *bm)
if (!bm->present)
return;
if (!bm->present)
return;
+ if (bm == bst->primary_port);
+ bridge_reset_primary(bst);
+
if (bst->dev.active)
bridge_disable_member(bm);
if (bst->dev.active)
bridge_disable_member(bm);
@@
-228,6
+249,7
@@
bridge_set_up(struct bridge_state *bst)
return -ENOENT;
}
return -ENOENT;
}
+ bridge_reset_primary(bst);
ret = bst->set_state(&bst->dev, true);
if (ret < 0)
bridge_set_down(bst);
ret = bst->set_state(&bst->dev, true);
if (ret < 0)
bridge_set_down(bst);