1b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden/*
2b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden * net/tipc/eth_media.c: Ethernet bearer support for TIPC
3c43072852649d8382b81237ce51195bcec36f24aYOSHIFUJI Hideaki *
438504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy * Copyright (c) 2001-2007, 2013-2014, Ericsson AB
54babbaa8a1ecf1cb76de5e1635417c7472190ef5Ying Xue * Copyright (c) 2005-2008, 2011-2013, Wind River Systems
6b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden * All rights reserved.
7b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden *
89ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * Redistribution and use in source and binary forms, with or without
9b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden * modification, are permitted provided that the following conditions are met:
10b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden *
119ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * 1. Redistributions of source code must retain the above copyright
129ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden *    notice, this list of conditions and the following disclaimer.
139ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * 2. Redistributions in binary form must reproduce the above copyright
149ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden *    notice, this list of conditions and the following disclaimer in the
159ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden *    documentation and/or other materials provided with the distribution.
169ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * 3. Neither the names of the copyright holders nor the names of its
179ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden *    contributors may be used to endorse or promote products derived from
189ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden *    this software without specific prior written permission.
19b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden *
209ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * Alternatively, this software may be distributed under the terms of the
219ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * GNU General Public License ("GPL") version 2 as published by the Free
229ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * Software Foundation.
239ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden *
249ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
259ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
269ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
279ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
289ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
299ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
309ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
319ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
329ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
339ea1fd3c1a15c620d1e3d0aa269d34b705477003Per Liden * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden * POSSIBILITY OF SUCH DAMAGE.
35b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden */
36b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden
37d265fef6ddf9042195aae551e1fde211c2a1588bAllan Stephens#include "core.h"
38d265fef6ddf9042195aae551e1fde211c2a1588bAllan Stephens#include "bearer.h"
39d265fef6ddf9042195aae551e1fde211c2a1588bAllan Stephens
4038504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy#define ETH_ADDR_OFFSET  4  /* MAC addr position inside address field */
414d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens
4238504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy/* Convert Ethernet address (media address format) to string */
4338504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloystatic int tipc_eth_addr2str(struct tipc_media_addr *addr,
4438504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy			     char *strbuf, int bufsz)
45c43072852649d8382b81237ce51195bcec36f24aYOSHIFUJI Hideaki{
4638504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	if (bufsz < 18)	/* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */
47c61b666e260d5cc2e0203b21c689321e6ab0d676Allan Stephens		return 1;
48c61b666e260d5cc2e0203b21c689321e6ab0d676Allan Stephens
4938504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	sprintf(strbuf, "%pM", addr->value);
50c61b666e260d5cc2e0203b21c689321e6ab0d676Allan Stephens	return 0;
51b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden}
52b97bf3fd8f6a16966d4f18983b2c40993ff937d4Per Liden
5338504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy/* Convert from media address format to discovery message addr format */
5438504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloystatic int tipc_eth_addr2msg(char *msg, struct tipc_media_addr *addr)
554d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens{
5638504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	memset(msg, 0, TIPC_MEDIA_ADDR_SIZE);
5738504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	msg[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH;
5838504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	memcpy(msg + ETH_ADDR_OFFSET, addr->value, ETH_ALEN);
594d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens	return 0;
604d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens}
614d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens
6238504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy/* Convert raw mac address format to media addr format */
6338504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloystatic int tipc_eth_raw2addr(struct tipc_bearer *b,
6438504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy			     struct tipc_media_addr *addr,
6538504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy			     char *msg)
664d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens{
6738504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	char bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
684d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens
6938504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	memset(addr, 0, sizeof(*addr));
7038504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	ether_addr_copy(addr->value, msg);
7138504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	addr->media_id = TIPC_MEDIA_TYPE_ETH;
7238504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	addr->broadcast = !memcmp(addr->value, bcast_mac, ETH_ALEN);
734d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens	return 0;
744d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens}
754d163a326fa4868cce1bb75dd95855d40e5497c6Allan Stephens
7638504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy/* Convert discovery msg addr format to Ethernet media addr format */
7738504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloystatic int tipc_eth_msg2addr(struct tipc_bearer *b,
7838504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy			     struct tipc_media_addr *addr,
7938504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy			     char *msg)
8038504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy{
8138504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	/* Skip past preamble: */
8238504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	msg += ETH_ADDR_OFFSET;
8338504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	return tipc_eth_raw2addr(b, addr, msg);
8438504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy}
8538504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy
86e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue/* Ethernet media registration info */
875702dbab687e19792102200b085108f00ab820c9Jon Paul Maloystruct tipc_media eth_media_info = {
88e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.send_msg	= tipc_l2_send_msg,
89e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.enable_media	= tipc_enable_l2_media,
90e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.disable_media	= tipc_disable_l2_media,
91e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.addr2str	= tipc_eth_addr2str,
92e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.addr2msg	= tipc_eth_addr2msg,
93e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.msg2addr	= tipc_eth_msg2addr,
9438504c28a201a80d12a6a0f821fecb331cb1f223Jon Paul Maloy	.raw2addr	= tipc_eth_raw2addr,
95706767da1bd0726d8fbc62e4818cb29193676a74Allan Stephens	.priority	= TIPC_DEF_LINK_PRI,
96706767da1bd0726d8fbc62e4818cb29193676a74Allan Stephens	.tolerance	= TIPC_DEF_LINK_TOL,
97706767da1bd0726d8fbc62e4818cb29193676a74Allan Stephens	.window		= TIPC_DEF_LINK_WIN,
98706767da1bd0726d8fbc62e4818cb29193676a74Allan Stephens	.type_id	= TIPC_MEDIA_TYPE_ETH,
99e4d050cbf7720d8bcc781f4ef557d37ed148a5c4Ying Xue	.hwaddr_len	= ETH_ALEN,
100706767da1bd0726d8fbc62e4818cb29193676a74Allan Stephens	.name		= "eth"
101706767da1bd0726d8fbc62e4818cb29193676a74Allan Stephens};
102