/*
 * ll_proto.c
 *
 *		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 *
 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/netdevice.h>
#include <linux/if_arp.h>
#include <linux/sockios.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#include "utils.h"


#define __PF(f,n) { ETH_P_##f, #n },
static struct {
	int id;
	char *name;
} llproto_names[] = {
__PF(LOOP,loop)
__PF(PUP,pup)  
#ifdef ETH_P_PUPAT
__PF(PUPAT,pupat)
#endif    
__PF(IP,ip)
__PF(X25,x25)
__PF(ARP,arp)
__PF(BPQ,bpq)
#ifdef ETH_P_IEEEPUP
__PF(IEEEPUP,ieeepup)
#endif  
#ifdef ETH_P_IEEEPUPAT
__PF(IEEEPUPAT,ieeepupat)
#endif  
__PF(DEC,dec)       
__PF(DNA_DL,dna_dl)    
__PF(DNA_RC,dna_rc)    
__PF(DNA_RT,dna_rt)    
__PF(LAT,lat)       
__PF(DIAG,diag)      
__PF(CUST,cust)      
__PF(SCA,sca)       
__PF(RARP,rarp)      
__PF(ATALK,atalk)     
__PF(AARP,aarp)      
__PF(IPX,ipx)       
__PF(IPV6,ipv6)      
#ifdef ETH_P_PPP_DISC
__PF(PPP_DISC,ppp_disc)
#endif      
#ifdef ETH_P_PPP_SES
__PF(PPP_SES,ppp_ses)
#endif      
#ifdef ETH_P_ATMMPOA
__PF(ATMMPOA,atmmpoa)
#endif
#ifdef ETH_P_ATMFATE
__PF(ATMFATE,atmfate)
#endif      

__PF(802_3,802_3)     
__PF(AX25,ax25)      
__PF(ALL,all)       
__PF(802_2,802_2)     
__PF(SNAP,snap)      
__PF(DDCMP,ddcmp)     
__PF(WAN_PPP,wan_ppp)   
__PF(PPP_MP,ppp_mp)    
__PF(LOCALTALK,localtalk) 
__PF(PPPTALK,ppptalk)   
__PF(TR_802_2,tr_802_2)  
__PF(MOBITEX,mobitex)   
__PF(CONTROL,control)   
__PF(IRDA,irda)      
#ifdef ETH_P_ECONET
__PF(ECONET,econet)
#endif      

{ 0x8100, "802.1Q" },
{ ETH_P_IP, "ipv4" },
};
#undef __PF


char * ll_proto_n2a(unsigned short id, char *buf, int len)
{
        int i;

	id = ntohs(id);

        for (i=0; i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) {
                 if (llproto_names[i].id == id)
			return llproto_names[i].name;
	}
        snprintf(buf, len, "[%d]", id);
        return buf;
}

int ll_proto_a2n(unsigned short *id, char *buf)
{
        int i;
        for (i=0; i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) {
                 if (strcasecmp(llproto_names[i].name, buf) == 0) {
			 *id = htons(llproto_names[i].id);
			 return 0;
		 }
	}
	if (get_u16(id, buf, 0))
		return -1;
	*id = htons(*id);
	return 0;
}
