From c16781a22f2b13fefb0ad255c98cf1c126fb07ac Mon Sep 17 00:00:00 2001
From: ke hu <ke.hu@iopsys.eu>
Date: Thu, 7 Nov 2019 08:50:52 +0100
Subject: [PATCH] mcast-pa: add zero mac handle to solve duplicated entries
issue
when boot, the multicast entry in ppa has zero mac, replace it when new report comes
---
mcast-pa/src/mcast-pa.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/mcast-pa/src/mcast-pa.c b/mcast-pa/src/mcast-pa.c
index 33a1d61..cc58de0 100644
--- a/mcast-pa/src/mcast-pa.c
+++ b/mcast-pa/src/mcast-pa.c
@@ -679,11 +679,17 @@ mcg_br_entry_show(FILE * f, struct mcg_br_mdb_entry_t *mcge)
if (f == NULL)
return;
if (inet_ntop(AF_INET, &mcge->e.addr.u.ip4, abuf, sizeof (abuf))) {
- fprintf(f, "brdev %s port %s grp %s \n", (char *) ll_index_to_name(mcge->br_ifindex),
- (char *) ll_index_to_name(mcge->e.ifindex), abuf);
+ fprintf(f, "brdev %s port %s grp %s join:%d \n", (char *) ll_index_to_name(mcge->br_ifindex),
+ (char *) ll_index_to_name(mcge->e.ifindex), abuf,mcge->joined);
+ fprintf(f,"mac address:%02x-%02x-%02x-%02x-%02x-%02x\n",mcge->e.src_addr.eth_addr[0],mcge->e.src_addr.eth_addr[1],mcge->e.src_addr.eth_addr[2],
+ mcge->e.src_addr.eth_addr[3],mcge->e.src_addr.eth_addr[4],mcge->e.src_addr.eth_addr[5]);
}
return;
}
+static int is_zero_mac(uint8_t *mac)
+{
+ return !(mac[0] | mac[1] | mac[2] | mac[3] | mac[4] | mac[5]);
+}
/**
* @brief compare bridge entries
@@ -701,11 +707,16 @@ mcg_br_entry_equal(struct br_mdb_entry *ex, struct br_mdb_entry *ey)
if (memcmp(&ex->src_addr.eth_addr, &ey->src_addr.eth_addr, ETH_ALEN) == 0) {
return (1);
}
+ else if(is_zero_mac(ey->src_addr.eth_addr)|| is_zero_mac(ex->src_addr.eth_addr))
+ {
+ return 1;
+ }
}
}
return (0);
}
+
/**
* @brief gets a head instance of mc group
* @details just compares mcgroup
@@ -959,6 +970,7 @@ mcg_br_entry_join(struct mcg_br_mdb_entry_t *head)
struct mcg_br_mdb_entry_t *mcge;
int len = 0;
char src[INET_ADDR_SIZE] = { 0 };
+ char lan_save[MCASTPA_STRING_SIZE]={0};
/**< ip address of video source - head use only */
struct mcastpa_join_leave_t mjl;
int res = 0;
@@ -999,6 +1011,8 @@ mcg_br_entry_join(struct mcg_br_mdb_entry_t *head)
mjl.flags |= MJL_FLAG_UPDATE;
}
}
+ //strtok destory the buffer ,save it first
+ memcpy(lan_save,mjl.lan,MCASTPA_STRING_SIZE);
list_for_each(pos, &head->mcg_entry) {
mcge = (struct mcg_br_mdb_entry_t *) list_entry(pos, struct mcg_br_mdb_entry_t, mcg_entry);
mcg_br_entry_srcmac_set(mcge, &mjl);
@@ -1009,6 +1023,7 @@ mcg_br_entry_join(struct mcg_br_mdb_entry_t *head)
mcge->joined = 1;
syslog(LOG_INFO, "%s:%d join request sent group %s res: %d\n", __FUNCTION__, __LINE__,
group, res);
+ memcpy(mjl.lan,lan_save,MCASTPA_STRING_SIZE);
}
}
}
@@ -1684,7 +1699,7 @@ cache_mdb_entry(struct nlmsghdr *n, int ifindex, struct br_mdb_entry *e)
SPRINT_BUF(abuf);
struct mcg_br_mdb_entry_t *head;
struct mcg_br_mdb_entry_t *mcge;
-
+ int create = 0;
syslog(LOG_INFO, "%s:%d \n", __FUNCTION__, __LINE__);
if (e->state & MDB_PERMANENT)
@@ -1714,9 +1729,14 @@ cache_mdb_entry(struct nlmsghdr *n, int ifindex, struct br_mdb_entry *e)
mcge = mcg_br_entry_get(head, e);
if (mcge == NULL) {
mcge = mcg_br_entry_add(head, e);
+ create = 1;
}
if (mcge != NULL) {
mcge->br_ifindex = ifindex;
+ if(is_zero_mac(mcge->e.src_addr.eth_addr)&& !create)
+ {
+ memcpy(mcge->e.src_addr.eth_addr,e->src_addr.eth_addr,ETH_ALEN);
+ }
}
mcg_br_entry_join(head);
} else {
--
GitLab