diff options
author | Skylar Chang <chiaweic@codeaurora.org> | 2015-10-27 12:21:18 -0700 |
---|---|---|
committer | Skylar Chang <chiaweic@codeaurora.org> | 2015-10-29 16:59:22 -0700 |
commit | 37e0de9d0171aa99ccfc13221f63e6eccd24374c (patch) | |
tree | 2a1f21c38f828868678b6309725ebffce96065fa /ipacm/src/IPACM_Netlink.cpp | |
parent | 195d0070e8379786474285b5da8d04aee2c4bd24 (diff) | |
download | ipacfg-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.cpp | 37 |
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 */ |