summaryrefslogtreecommitdiff
path: root/ipacm/src/IPACM_Netlink.cpp
diff options
context:
space:
mode:
authorSkylar Chang <chiaweic@codeaurora.org>2015-10-27 12:21:18 -0700
committerSkylar Chang <chiaweic@codeaurora.org>2015-10-29 16:59:22 -0700
commit37e0de9d0171aa99ccfc13221f63e6eccd24374c (patch)
tree2a1f21c38f828868678b6309725ebffce96065fa /ipacm/src/IPACM_Netlink.cpp
parent195d0070e8379786474285b5da8d04aee2c4bd24 (diff)
downloadipacfg-mgr-37e0de9d0171aa99ccfc13221f63e6eccd24374c.tar.gz
IPACM: change src mac to bridge0
In SW-exception, the src mac of the DL traffic to wifi-client will use bridge0's mac when device is in bridge mode however in IPA-HW path, the src mac of the DL traffic will use netdev's mac instead. This failed in layer2 security check with some special applications. The fix is to make src mac consistent in both SW-exception/IPA-HW cases. Change-Id: I2f248e2f3c265acfbecdeedac58e7e8dac36fec9
Diffstat (limited to 'ipacm/src/IPACM_Netlink.cpp')
-rw-r--r--ipacm/src/IPACM_Netlink.cpp37
1 files changed, 25 insertions, 12 deletions
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index a343e24..30295b1 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -1376,13 +1376,13 @@ static int ipa_nl_decode_nlmsg
IPACMDBG("\n GOT RTM_NEWNEIGH event (%s) ip %d\n",dev_name,msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
}
- /* insert to command queue */
+ /* insert to command queue */
data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
if(data_all == NULL)
- {
+ {
IPACMERR("unable to allocate memory for event data_all\n");
return IPACM_FAILURE;
- }
+ }
memset(data_all, 0, sizeof(ipacm_event_data_all));
if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6)
@@ -1390,11 +1390,11 @@ static int ipa_nl_decode_nlmsg
IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
- data_all->ipv6_addr[0]=ntohl(data_all->ipv6_addr[0]);
- data_all->ipv6_addr[1]=ntohl(data_all->ipv6_addr[1]);
- data_all->ipv6_addr[2]=ntohl(data_all->ipv6_addr[2]);
- data_all->ipv6_addr[3]=ntohl(data_all->ipv6_addr[3]);
- data_all->iptype = IPA_IP_v6;
+ data_all->ipv6_addr[0]=ntohl(data_all->ipv6_addr[0]);
+ data_all->ipv6_addr[1]=ntohl(data_all->ipv6_addr[1]);
+ data_all->ipv6_addr[2]=ntohl(data_all->ipv6_addr[2]);
+ data_all->ipv6_addr[3]=ntohl(data_all->ipv6_addr[3]);
+ data_all->iptype = IPA_IP_v6;
}
else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET)
{
@@ -1420,13 +1420,26 @@ static int ipa_nl_decode_nlmsg
memcpy(data_all->mac_addr,
msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data,
sizeof(data_all->mac_addr));
- evt_data.event = IPA_NEW_NEIGH_EVENT;
- data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex;
-
- IPACMDBG_H("posting IPA_NEW_NEIGH_EVENT (%s):index:%d ip-family: %d\n",
+ data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex;
+ /* Add support to replace src-mac as bridge0 mac */
+ if((msg_ptr->nl_neigh_info.metainfo.ndm_family == AF_BRIDGE) &&
+ (msg_ptr->nl_neigh_info.metainfo.ndm_state == NUD_PERMANENT))
+ {
+ /* Posting IPA_BRIDGE_LINK_UP_EVENT event */
+ evt_data.event = IPA_BRIDGE_LINK_UP_EVENT;
+ IPACMDBG_H("posting IPA_BRIDGE_LINK_UP_EVENT (%s):index:%d \n",
+ dev_name,
+ data_all->if_index);
+ }
+ else
+ {
+ /* Posting new_neigh events for all LAN/WAN clients */
+ evt_data.event = IPA_NEW_NEIGH_EVENT;
+ IPACMDBG_H("posting IPA_NEW_NEIGH_EVENT (%s):index:%d ip-family: %d\n",
dev_name,
data_all->if_index,
msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
+ }
evt_data.evt_data = data_all;
IPACM_EvtDispatcher::PostEvt(&evt_data);
/* finish command queue */