/*
 * 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 <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#include <linux/netdevice.h>
#include <linux/if_arp.h>
#include <linux/sockios.h>

#include "utils.h"
#include "rt_names.h"


#define __PF(f,n) { ETH_P_##f, #n },
static struct {
	int id;
	const 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


const 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;
}
