aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorBalasubramanian Manoharan <bala.manoharan@linaro.org>2016-01-07 21:55:53 +0530
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:25 +0300
commitc77eb3333fa86768068eac80ad9013cd84a2f273 (patch)
tree6b09a9d2198e6d98ac38c8672b637041c1cae021 /platform
parenta8779116291a868e4e57bb610c1d82d5e737d648 (diff)
linux-generic: classification: implement verify_pmr_dmac
Implements Ethernet destination mac address verification Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org> Reviewed-and-tested-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/include/odp_classification_inlines.h25
1 files changed, 21 insertions, 4 deletions
diff --git a/platform/linux-generic/include/odp_classification_inlines.h b/platform/linux-generic/include/odp_classification_inlines.h
index 5f0b564f7..96cf77ee2 100644
--- a/platform/linux-generic/include/odp_classification_inlines.h
+++ b/platform/linux-generic/include/odp_classification_inlines.h
@@ -154,11 +154,28 @@ static inline int verify_pmr_udp_sport(const uint8_t *pkt_addr,
return 0;
}
-static inline int verify_pmr_dmac(const uint8_t *pkt_addr ODP_UNUSED,
- odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
- pmr_term_value_t *term_value ODP_UNUSED)
+static inline int verify_pmr_dmac(const uint8_t *pkt_addr,
+ odp_packet_hdr_t *pkt_hdr,
+ pmr_term_value_t *term_value)
{
- ODP_UNIMPLEMENTED();
+ uint64_t dmac = 0;
+ uint64_t dmac_be = 0;
+ const odph_ethhdr_t *eth;
+
+ if (!pkt_hdr->input_flags.eth)
+ return 0;
+
+ eth = (const odph_ethhdr_t *)(pkt_addr + pkt_hdr->l2_offset);
+ memcpy(&dmac_be, eth->dst.addr, ODPH_ETHADDR_LEN);
+ dmac = odp_be_to_cpu_64(dmac_be);
+ /* since we are converting a 48 bit ethernet address from BE to cpu
+ format using odp_be_to_cpu_64() the last 16 bits needs to be right
+ shifted */
+ if (dmac_be != dmac)
+ dmac = dmac >> (64 - (ODPH_ETHADDR_LEN * 8));
+
+ if (term_value->val == (dmac & term_value->mask))
+ return 1;
return 0;
}