usb_moded-mac.c 3.04 KB
Newer Older
1
/**
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 * @file usb_moded-mac.c
 *
 * Copyright (C) 2013-2018 Jolla. All rights reserved.
 *
 * @author: Philippe De Swert <philippe.deswert@jollamobile.com>
 * @author: Simo Piiroinen <simo.piiroinen@jollamobile.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Lesser GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 */
23

24 25 26
#include <stdio.h>
#include "usb_moded-mac.h"
#include "usb_moded-log.h"
27

28 29 30
/* ========================================================================= *
 * Prototypes
 * ========================================================================= */
31

32
/* -- mac -- */
33

34 35 36
static void  mac_random_ether_addr  (unsigned char *addr);
void         mac_generate_random_mac(void);
char        *mac_read_mac           (void);
37

38 39 40
/* ========================================================================= *
 * Functions
 * ========================================================================= */
41

42
static void mac_random_ether_addr(unsigned char *addr)
43
{
44 45
    FILE *random;
    size_t count = 0;
46

47 48 49
    random = fopen("/dev/urandom", "r");
    count = fread(addr, 1, 6, random);
    fclose(random);
50

51 52 53 54 55 56 57
    if(count > 0 )
    {
        addr [0] &= 0xfe;       /* clear multicast bit */
        addr [0] |= 0x02;       /* set local assignment bit (IEEE802) */
    }
    else
        log_warning("MAC generation failed!\n");
58 59
}

60
void mac_generate_random_mac (void)
61
{
62 63 64 65 66 67 68 69 70 71 72 73 74 75
    unsigned char addr[6];
    int i;
    FILE *g_ether;

    log_debug("Getting random usb ethernet mac\n");
    mac_random_ether_addr(addr);

    g_ether = fopen("/etc/modprobe.d/g_ether.conf", "w");
    if(!g_ether)
    {
        log_warning("Failed to write mac address to /etc/modprobe.d/g_ether.conf\n");
        return;
    }
    fprintf(g_ether, "options g_ether host_addr=");
76

77 78 79 80 81 82
    for(i=0; i<5; i++)
    {
        fprintf(g_ether, "%02x:",addr[i]);
    }
    fprintf(g_ether, "%02x\n",addr[i]);
    fclose(g_ether);
83
}
84

85
char * mac_read_mac(void)
86
{
87 88 89 90
    FILE *g_ether;
    char *mac = NULL, *ret = NULL;
    size_t read = 0;
    int test = 0;
91

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
    g_ether = fopen("/etc/modprobe.d/g_ether.conf", "r");
    if(!g_ether)
    {
        log_warning("Failed to read mac address from /etc/modprobe.d/g_ether.conf\n");
        return(NULL);
    }
    test = fseek(g_ether, 26, SEEK_SET);
    if(test == -1)
    {
        fclose(g_ether);
        return 0;
    }
    mac = malloc(sizeof(char) *17);
    if(mac)
        read = fread(mac, 1, 17, g_ether);
    if(read == 17)
        ret = strndup(mac,17);
    else
        ret = 0;
111

112 113 114
    free(mac);
    fclose(g_ether);
    return(ret);
115
}