본문 바로가기

리눅스 커널/네트워크

(15)
Ethernet & ARP Header 첫번째는 이더넷 헤더이다. #include struct ethhdr { unsigned charh_dest[ETH_ALEN];/* destination eth addr*/ unsigned charh_source[ETH_ALEN];/* source ether addr*/ __be16h_proto;/* packet type ID field*/ } __attribute__((packed)); h_dest: 도착지 MAC주소 h_source: 출발지 MAC주소 h_proto: 상위 계층 헤더의 프로토콜 다음은 ARP 헤더이다. #include struct arphdr { __be16ar_hrd;/* format of hardware address*/ __be16ar_pro;/* format of protocol..
IP & ICMP Header 먼저 IP헤더이다. #include struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8version:4, ihl:4; #else #error"Please fix " #endif __u8tos; __be16tot_len; __be16id; __be16frag_off; __u8ttl; __u8protocol; __sum16check; __be32saddr; __be32daddr; /*The options start here. */ }; ihl: ip헤더의 길이, 4바이트 단위 (ex, 5 -> 20바이트, 옵션 포함 시 최대 15 -> 60바이트 까지..
TCP & UDP Header C에서 구현한 TCP 헤더 #include struct tcphdr { __be16source; __be16dest; __be32seq; __be32ack_seq; #if defined(__LITTLE_ENDIAN_BITFIELD) __u16res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1; #elif defined(__BIG_ENDIAN_BITFIELD) __u16doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1; #else #error"Adjust your defines" #endif __be16window; __sum16check; __be16ur..
ioctl - socket ioctl 호출 시 file descriptor, command, args 가 필요한데, 일반적인 eth0 장치에 대해서는 세번째 인자로 아래의 자료구조를 사용하며, struct ifreq { #define IFHWADDRLEN6 union { charifrn_name[IFNAMSIZ];/* if name, e.g. "en0" */ } ifr_ifrn; union { structsockaddr ifru_addr; structsockaddr ifru_dstaddr; structsockaddr ifru_broadaddr; structsockaddr ifru_netmask; struct sockaddr ifru_hwaddr; shortifru_flags; intifru_ivalue; intifru_mtu; s..
struct net_device example #include #include #include #include char * if_name = NULL; module_param(if_name, charp, 0644); static int print_info(void) { struct net_device * dev = dev_get_by_name(&init_net, if_name); struct in_ifaddr * addrs = NULL; struct wireless_dev * wdev = NULL; if (!dev) return -1; printk("-----net_device info-----\n"); printk("name: %s\n", dev->name); //interface name printk("ifindex: %d\n", dev->ifi..