[qca-nss-sfe] Read br-lan mac address from source mac rule
Change-Id: I9fc9b712836cb0260baef40e17273fc3ce72d5aa
Signed-off-by: Ratheesh Kannoth <quic_rkannoth@quicinc.com>
diff --git a/sfe_ipv4.c b/sfe_ipv4.c
index 5da6615..55d687f 100644
--- a/sfe_ipv4.c
+++ b/sfe_ipv4.c
@@ -1046,8 +1046,6 @@
original_cm->xmit_dev = dest_dev;
original_cm->xmit_dev_mtu = msg->conn_rule.return_mtu;
- memcpy(original_cm->xmit_src_mac, dest_dev->dev_addr, ETH_ALEN);
- memcpy(original_cm->xmit_dest_mac, msg->conn_rule.return_mac, ETH_ALEN);
original_cm->connection = c;
original_cm->counter_match = reply_cm;
original_cm->flags = 0;
@@ -1077,6 +1075,20 @@
* For the non-arp interface, we don't write L2 HDR.
*/
if (!(dest_dev->flags & IFF_NOARP)) {
+
+ /*
+ * Check whether the rule has configured a specific source MAC address to use.
+ * This is needed when virtual L3 interfaces such as br-lan, macvlan, vlan are used during egress
+ */
+ if ((msg->valid_flags & SFE_RULE_CREATE_SRC_MAC_VALID) &&
+ (msg->src_mac_rule.mac_valid_flags & SFE_SRC_MAC_RETURN_VALID)) {
+ ether_addr_copy((u8 *)original_cm->xmit_src_mac, (u8 *)msg->src_mac_rule.return_src_mac);
+ } else {
+ ether_addr_copy((u8 *)original_cm->xmit_src_mac, (u8 *)dest_dev->dev_addr);
+ }
+
+ ether_addr_copy((u8 *)original_cm->xmit_dest_mac, (u8 *)msg->conn_rule.return_mac);
+
original_cm->flags |= SFE_IPV4_CONNECTION_MATCH_FLAG_WRITE_L2_HDR;
/*
@@ -1112,8 +1124,7 @@
reply_cm->xmit_dev = src_dev;
reply_cm->xmit_dev_mtu = msg->conn_rule.flow_mtu;
- memcpy(reply_cm->xmit_src_mac, src_dev->dev_addr, ETH_ALEN);
- memcpy(reply_cm->xmit_dest_mac, msg->conn_rule.flow_mac, ETH_ALEN);
+
reply_cm->connection = c;
reply_cm->counter_match = original_cm;
reply_cm->flags = 0;
@@ -1141,6 +1152,19 @@
* For the non-arp interface, we don't write L2 HDR.
*/
if (!(src_dev->flags & IFF_NOARP)) {
+
+ /*
+ * Check whether the rule has configured a specific source MAC address to use.
+ * This is needed when virtual L3 interfaces such as br-lan, macvlan, vlan are used during egress
+ */
+ if ((msg->valid_flags & SFE_RULE_CREATE_SRC_MAC_VALID) &&
+ (msg->src_mac_rule.mac_valid_flags & SFE_SRC_MAC_FLOW_VALID)) {
+ ether_addr_copy((u8 *)reply_cm->xmit_src_mac, (u8 *)msg->src_mac_rule.flow_src_mac);
+ } else {
+ ether_addr_copy((u8 *)reply_cm->xmit_src_mac, (u8 *)src_dev->dev_addr);
+ }
+ ether_addr_copy((u8 *)reply_cm->xmit_dest_mac, (u8 *)msg->conn_rule.flow_mac);
+
reply_cm->flags |= SFE_IPV4_CONNECTION_MATCH_FLAG_WRITE_L2_HDR;
/*