顯示具有 C 標籤的文章。 顯示所有文章
顯示具有 C 標籤的文章。 顯示所有文章

2013年11月13日 星期三

[Linux][Kernel] MAC_FMT 跟 NIPQUAD_FMT

在寫 kernel module 的時候,我們常常會需要寫到 ip format 的的資料印出來 debug,但是每次都
printfk("%d.%d.%d.%d") 寫到累,後來發現原來這樣寫就可以:
printk(KERN_INFO "br0 ip:"NIPQUAD_FMT"\n", NIPQUAD(br0_in_dev->ifa_list->ifa_address));
然後接著又發現了,原來常用的 ip 有這種簡單的 macro 定義,當然 mac address 也會有:
#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
printk("sa = '"MAC_FMT"' \n", MAC_ARG(mach->h_source));

這是早就發明好的輪子,如果不會用的話,是不是很可惜呢?

2013年7月2日 星期二

[C][source][str2mac]

 #include <stdio.h>  
 #include <limits.h>  
 #include <string.h>  
 #include <stdint.h>  
 int str2mac(char *in, uint8_t *mac)  
 {  
     char c1, c2;  
     int len, i;  
     len = strlen(in);  
     for (i = 0; i < (len / 2); i ++) {  
         c1 = toupper(in[2*i]);  
         c2 = toupper(in[2*i + 1]);  
         if (c1 < '0' || (c1 > '9' && c1 <'A') || c1 > 'F')  
       return 0;  
         if (c2 < '0' || (c2 > '9' && c2 <'A') || c2 > 'F')  
       return 0;  
         c1 = (c1 > '9') ? (c1 - 'A' + 10) : (c1 - '0');  
         c2 = (c2 > '9') ? (c2 - 'A' + 10) : (c2 - '0');  
         mac[i] = c1 << 4 | c2;  
     }  
     return 1;  
 }  
 int main(int argc, char *argv[])  
 {  
     uint8_t mac[6];  
     int i;  
     memset(&mac, 0x0, sizeof(mac));  
     str2mac("0012cf368901", mac);  
     for (i = 0; i < 5; i ++) {  
         printf("%02X:", mac[i]);  
     }  
     printf("\n");  
     return 0;  
 }