Linux内核IP Queue机制的分析(三)——ip_queue内核模块的分析(2)

2020-05-25 00:00:00 函数 用户 模块 报文 数据结构

三、ip_queue代码分析
ip_queue模块的代码较为简单,包含ip_queue.h和ip_queue.c。我们将分别该两个源文件进行分析。
(一)数据结构的定义
ip_queue模块的数据结构定义在头文件ip_queue.h中,主要定义了用于在内核态和用户态传输数据的相关数据结构。其代码如下:

  1. /*
  2. * This is a module which is used for queueing IPv4 packets and
  3. * communicating with userspace via netlink.
  4. *
  5. * (C) 2000 James Morris, this code is GPL.
  6. */
  7. #ifndef _IP_QUEUE_H
  8. #define _IP_QUEUE_H

  9. #ifdef __KERNEL__
  10. #ifdef DEBUG_IPQ
  11. #define QDEBUG(x...) printk(KERN_DEBUG ## x)
  12. #else
  13. #define QDEBUG(x...)
  14. #endif  /* DEBUG_IPQ */
  15. #else
  16. #include <net/if.h>
  17. #endif        /* ! __KERNEL__ */

  18. /* 内核态发送到用户态的消息的数据结构*/
  19. typedef struct ipq_packet_msg {
  20.         unsigned long packet_id;        /* ID of queued packet */
  21.         unsigned long mark;                /* Netfilter mark value */
  22.         long timestamp_sec;                /* Packet arrival time (seconds) */
  23.         long timestamp_usec;                /* Packet arrvial time (+useconds) */
  24.         unsigned int hook;                /* Netfilter hook we rode in on */
  25.         char indev_name[IFNAMSIZ];        /* Name of incoming interface */
  26.         char outdev_name[IFNAMSIZ];        /* Name of outgoing interface */
  27.         unsigned short hw_protocol;        /* Hardware protocol (network order) */
  28.         unsigned short hw_type;                /* Hardware type */
  29.         unsigned char hw_addrlen;        /* Hardware address length */
  30.         unsigned char hw_addr[8];        /* Hardware address */
  31.         size_t data_len;                /* Length of packet data */
  32.         unsigned char payload[0];        /* Optional packet data */
  33. } ipq_packet_msg_t;

  34. /* 用户态发送到内核态的模式消息 */
  35. typedef struct ipq_mode_msg {
  36.         unsigned char value;                /* Requested mode */
  37.         size_t range;                        /* Optional range of packet requested */
  38. } ipq_mode_msg_t;

  39. /* 用户态发送到内核态的断言消息 */
  40. typedef struct ipq_verdict_msg {
  41.         unsigned int value;                /* Verdict to hand to netfilter */
  42.         unsigned long id;                /* Packet ID for this verdict */
  43.         size_t data_len;                /* Length of replacement data */
  44.         unsigned char payload[0];        /* Optional replacement packet */
  45. } ipq_verdict_msg_t;

  46. /*统一封装起来的用户态发内核态的信息的数据结构*/
  47. typedef struct ipq_peer_msg {
  48.         union {
  49.                 ipq_verdict_msg_t verdict;
  50.                 ipq_mode_msg_t mode;
  51.         } msg;
  52. } ipq_peer_msg_t;

  53. /* 报文传输的模式*/
  54. enum {
  55.         IPQ_COPY_NONE,                /* Initial mode, packets are dropped */
  56.         IPQ_COPY_META,                /* Copy metadata */
  57.         IPQ_COPY_PACKET                /* Copy metadata + packet (range) */
  58. };
  59. #define IPQ_COPY_MAX IPQ_COPY_PACKET

  60. /* IP Queue消息的类型 */
  61. #define IPQM_BASE        0x10        /* standard netlink messages below this */
  62. #define IPQM_MODE        (IPQM_BASE + 1)                /* Mode request from peer */
  63. #define IPQM_VERDICT        (IPQM_BASE + 2)                /* Verdict from peer */ 
  64. #define IPQM_PACKET        (IPQM_BASE + 3)                /* Packet from kernel */
  65. #define IPQM_MAX        (IPQM_BASE + 4)

  66. #endif /*_IP_QUEUE_H*/

相关文章