%% Copyright (c) 2009-2016, Michael Santos %% All rights reserved. %% %% Redistribution and use in source and binary forms, with or without %% modification, are permitted provided that the following conditions %% are met: %% %% Redistributions of source code must retain the above copyright %% notice, this list of conditions and the following disclaimer. %% %% Redistributions in binary form must reproduce the above copyright %% notice, this list of conditions and the following disclaimer in the %% documentation and/or other materials provided with the distribution. %% %% Neither the name of the author nor the names of its contributors %% may be used to endorse or promote products derived from this software %% without specific prior written permission. %% %% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS %% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT %% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS %% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE %% COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, %% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, %% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; %% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER %% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT %% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN %% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE %% POSSIBILITY OF SUCH DAMAGE. -module(pkt_ether). -include("pkt_ether.hrl"). -export([codec/1, type/1]). type(?ETH_P_IP) -> ipv4; type(?ETH_P_IPV6) -> ipv6; type(?ETH_P_ARP) -> arp; type(?ETH_P_LLDP) -> lldp; %% IEEE 802.3 Ethernet type(EtherType) when EtherType < 16#05DC -> llc; %% 802.1Q Virtual LAN type(?ETH_P_802_1Q) -> '802.1q'; %% 802.1ad (802.1q QinQ) type(?ETH_P_802_1QinQ) -> '802.1qinq'; %% MPLS_ type(?ETH_P_MPLS_UNI) -> mpls; type(?ETH_P_MPLS_MULTI) -> mpls. codec(<>) -> % Len = byte_size(Packet) - 4, % <> = Packet, {#ether{ dhost = Dhost, shost = Shost, type = Type }, Payload}; codec(#ether{ dhost = Dhost, shost = Shost, type = Type }) -> <>.