Blame view

tools/gen_ethaddr_crc.c 1.67 KB
c25f01a63   oliver@schinagl.nl   tools: Add tool t...
1
2
3
4
5
6
7
8
  /*
   * (C) Copyright 2016
   * Olliver Schinagl <oliver@schinagl.nl>
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  
  #include <ctype.h>
d2bf1152c   Masahiro Yamada   tools: include ne...
9
  #include <stdbool.h>
c25f01a63   oliver@schinagl.nl   tools: Add tool t...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  #include <stdint.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <u-boot/crc.h>
  
  #define ARP_HLEN 6 /* Length of hardware address */
  #define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1) /* with separators */
  #define ARP_HLEN_LAZY (ARP_HLEN * 2) /* separatorless hardware address length */
  
  uint8_t nibble_to_hex(const char *nibble, bool lo)
  {
  	return (strtol(nibble, NULL, 16) << (lo ? 0 : 4)) & (lo ? 0x0f : 0xf0);
  }
  
  int process_mac(const char *mac_address)
  {
  	uint8_t ethaddr[ARP_HLEN + 1] = { 0x00 };
  	uint_fast8_t i = 0;
  
  	while (*mac_address != '\0') {
  		char nibble[2] = { 0x00, '
  ' }; /* for strtol */
  
  		nibble[0] = *mac_address++;
  		if (isxdigit(nibble[0])) {
  			if (isupper(nibble[0]))
  				nibble[0] = tolower(nibble[0]);
  			ethaddr[i >> 1] |= nibble_to_hex(nibble, (i % 2) != 0);
  			i++;
  		}
  	}
  
  	for (i = 0; i < ARP_HLEN; i++)
  		printf("%.2x", ethaddr[i]);
  	printf("%.2x
  ", crc8(0, ethaddr, ARP_HLEN));
  
  	return 0;
  }
  
  void print_usage(char *cmdname)
  {
  	printf("Usage: %s <mac_address>
  ", cmdname);
  	puts("<mac_address> may be with or without separators.");
  	puts("Valid seperators are ':' and '-'.");
  	puts("<mac_address> digits are in base 16.
  ");
  }
  
  int main(int argc, char *argv[])
  {
  	if (argc < 2) {
  		print_usage(argv[0]);
  		return 1;
  	}
  
  	if (!((strlen(argv[1]) == ARP_HLEN_ASCII) || (strlen(argv[1]) == ARP_HLEN_LAZY))) {
  		puts("The MAC address is not valid.
  ");
  		print_usage(argv[0]);
  		return 1;
  	}
  
  	if (process_mac(argv[1])) {
  		puts("Failed to calculate the MAC's checksum.");
  		return 1;
  	}
  
  	return 0;
  }