From 8b0e918921882fcf56d9b75acd3b39aa4a76169b Mon Sep 17 00:00:00 2001 From: Daruwalla, Sharookh P Date: Wed, 6 Apr 2011 08:48:13 -0700 Subject: [PATCH 44/51] lldpad: get() functions for Local and Remote MAC addresses Implements logic to extract the remote peer's MAC address from the rx frame and store it in l2_packet_data's remote_mac_addr field. Removes get_san_mac_addr(). Instead uses l2_packet_get_own_src_addr() Signed-off-by: John Fastabend Signed-off-by: Petr Sabata --- lldp/l2_packet.h | 3 +++ lldp/l2_packet_linux.c | 18 +++++++++++++++++- lldp/rx.c | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lldp/l2_packet.h b/lldp/l2_packet.h index 0bdacf1..7c88a5c 100644 --- a/lldp/l2_packet.h +++ b/lldp/l2_packet.h @@ -130,6 +130,9 @@ int l2_packet_get_own_src_addr(struct l2_packet_data *l2, u8 *addr); */ int l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr); +void get_remote_peer_mac_addr(struct port *port); +void l2_packet_get_remote_addr(struct l2_packet_data *l2, u8 *addr); + /** * l2_packet_send - Send a packet * @l2: Pointer to internal l2_packet data from l2_packet_init() diff --git a/lldp/l2_packet_linux.c b/lldp/l2_packet_linux.c index 01e2b9c..b01d2c1 100644 --- a/lldp/l2_packet_linux.c +++ b/lldp/l2_packet_linux.c @@ -52,6 +52,7 @@ struct l2_packet_data { u8 perm_mac_addr[ETH_ALEN]; u8 curr_mac_addr[ETH_ALEN]; u8 san_mac_addr[ETH_ALEN]; + u8 remote_mac_addr[ETH_ALEN]; void (*rx_callback)(void *ctx, unsigned int ifindex, const u8 *buf, size_t len); void *rx_callback_ctx; @@ -80,13 +81,28 @@ int l2_packet_get_own_src_addr(struct l2_packet_data *l2, u8 *addr) return 0; } + +/* + * Extracts the remote peer's MAC address from the rx frame and + * puts it in the l2_packet_data + */ +void get_remote_peer_mac_addr(struct port *port) +{ + int offset = ETH_ALEN; /* points to remote MAC address in RX frame */ + memcpy(port->l2->remote_mac_addr, &port->rx.framein[offset], ETH_ALEN); +} + +void l2_packet_get_remote_addr(struct l2_packet_data *l2, u8 *addr) +{ + memcpy(addr, l2->remote_mac_addr, ETH_ALEN); +} + int l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr) { memcpy(addr, l2->perm_mac_addr, ETH_ALEN); return 0; } - int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, const u8 *buf, size_t len) { diff --git a/lldp/rx.c b/lldp/rx.c index 5dd40c3..2b904b7 100644 --- a/lldp/rx.c +++ b/lldp/rx.c @@ -153,7 +153,7 @@ void rxProcessFrame(struct port * port) return; } memset(port->rx.manifest,0, sizeof(rxmanifest)); - + get_remote_peer_mac_addr(port); tlv_offset = sizeof(struct l2_ethhdr); /* Points to 1st TLV */ do { -- 1.7.4.4