94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* address.c - functions to query ESI and local ATM address from kernel */
 | 
						|
 | 
						|
/*
 | 
						|
 * Marko Kiiskila carnil@cs.tut.fi 
 | 
						|
 * 
 | 
						|
 * Copyright (c) 1996
 | 
						|
 * Tampere University of Technology - Telecommunications Laboratory
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify and distribute this
 | 
						|
 * software and its documentation is hereby granted,
 | 
						|
 * provided that both the copyright notice and this
 | 
						|
 * permission notice appear in all copies of the software,
 | 
						|
 * derivative works or modified versions, and any portions
 | 
						|
 * thereof, that both notices appear in supporting
 | 
						|
 * documentation, and that the use of this software is
 | 
						|
 * acknowledged in any publications resulting from using
 | 
						|
 * the software.
 | 
						|
 * 
 | 
						|
 * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 | 
						|
 * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 | 
						|
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
 | 
						|
 * SOFTWARE.
 | 
						|
 * 
 | 
						|
 */
 | 
						|
 | 
						|
/*  Copyright (C) 1999  Heikki Vatiainen hessu@cs.tut.fi */
 | 
						|
 | 
						|
#include <sys/ioctl.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
#include <atm.h>
 | 
						|
#include <linux/atmdev.h>
 | 
						|
#include <atmd.h>
 | 
						|
 | 
						|
#include "address.h"
 | 
						|
 | 
						|
#define COMPONENT "address.c"
 | 
						|
 | 
						|
/* Gets End System Identifier (MAC address) from kernel
 | 
						|
 * Returns < 0 for error
 | 
						|
 */
 | 
						|
int addr_getesi(unsigned char *mac_addr, int phys_itf)
 | 
						|
{
 | 
						|
        int fd, retval;
 | 
						|
        struct atmif_sioc req;
 | 
						|
        
 | 
						|
        fd = socket(PF_ATMSVC, SOCK_DGRAM, 0);
 | 
						|
        if (fd < 0) {
 | 
						|
                diag(COMPONENT, DIAG_ERROR, "addr_getesi: socket: %s\n",
 | 
						|
                     strerror(errno));
 | 
						|
                return -1;
 | 
						|
        }
 | 
						|
        req.number = phys_itf;
 | 
						|
        req.arg = mac_addr;
 | 
						|
        req.length = ESI_LEN;
 | 
						|
        retval = ioctl(fd, ATM_GETESI, &req);
 | 
						|
        if (retval < 0) diag(COMPONENT, DIAG_ERROR, "ioctl ATM_GETESI: %s\n",
 | 
						|
                             strerror(errno));
 | 
						|
        close(fd);
 | 
						|
 | 
						|
        return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* Gets one of our ATM addresses from kernel. Useful for binding listen sockets.
 | 
						|
 * Returns < 0 for error
 | 
						|
 */
 | 
						|
#define MAX_LOCAL_ADDRS 32
 | 
						|
int get_listenaddr(unsigned char *atm_addr, int phys_itf)
 | 
						|
{
 | 
						|
        int fd, retval;
 | 
						|
        struct atmif_sioc req;
 | 
						|
        struct sockaddr_atmsvc listen_addr[MAX_LOCAL_ADDRS];
 | 
						|
        
 | 
						|
        fd = socket(PF_ATMSVC, SOCK_DGRAM, 0);
 | 
						|
        if (fd < 0) {
 | 
						|
                diag(COMPONENT, DIAG_ERROR, "get_listenaddr: socket: %s\n",
 | 
						|
                     strerror(errno));
 | 
						|
                return -1;
 | 
						|
        }
 | 
						|
        req.number = phys_itf;
 | 
						|
        req.arg = listen_addr;
 | 
						|
        req.length = sizeof(listen_addr);
 | 
						|
        retval = ioctl(fd, ATM_GETADDR, &req);
 | 
						|
        if (retval < 0) diag(COMPONENT, DIAG_ERROR, "ioctl ATM_GETADDR: %s\n",
 | 
						|
                             strerror(errno));
 | 
						|
        close(fd);
 | 
						|
 | 
						|
        memcpy(atm_addr, listen_addr[0].sas_addr.prv, ATM_ESA_LEN);
 | 
						|
 | 
						|
        return retval;
 | 
						|
}
 |