Blame view

include/net/gue.h 3.19 KB
37dd02477   Tom Herbert   gue: Receive side...
1
2
  #ifndef __NET_GUE_H
  #define __NET_GUE_H
5024c33ac   Tom Herbert   gue: Add infrastr...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /* Definitions for the GUE header, standard and private flags, lengths
   * of optional fields are below.
   *
   * Diagram of GUE header:
   *
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |Ver|C|  Hlen   | Proto/ctype   |        Standard flags       |P|
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |                                                               |
   * ~                      Fields (optional)                        ~
   * |                                                               |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |            Private flags (optional, P bit is set)             |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |                                                               |
   * ~                   Private fields (optional)                   ~
   * |                                                               |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   *
   * C bit indicates contol message when set, data message when unset.
   * For a control message, proto/ctype is interpreted as a type of
   * control message. For data messages, proto/ctype is the IP protocol
   * of the next header.
   *
   * P bit indicates private flags field is present. The private flags
   * may refer to options placed after this field.
   */
37dd02477   Tom Herbert   gue: Receive side...
30
31
32
33
  struct guehdr {
  	union {
  		struct {
  #if defined(__LITTLE_ENDIAN_BITFIELD)
5024c33ac   Tom Herbert   gue: Add infrastr...
34
35
36
  			__u8	hlen:5,
  				control:1,
  				version:2;
37dd02477   Tom Herbert   gue: Receive side...
37
  #elif defined (__BIG_ENDIAN_BITFIELD)
5024c33ac   Tom Herbert   gue: Add infrastr...
38
39
40
  			__u8	version:2,
  				control:1,
  				hlen:5;
37dd02477   Tom Herbert   gue: Receive side...
41
42
43
  #else
  #error  "Please fix <asm/byteorder.h>"
  #endif
5024c33ac   Tom Herbert   gue: Add infrastr...
44
  			__u8    proto_ctype;
37dd02477   Tom Herbert   gue: Receive side...
45
46
47
48
49
  			__u16   flags;
  		};
  		__u32 word;
  	};
  };
5024c33ac   Tom Herbert   gue: Add infrastr...
50
51
52
53
54
55
56
57
  /* Standard flags in GUE header */
  
  #define GUE_FLAG_PRIV	htons(1<<0)	/* Private flags are in options */
  #define GUE_LEN_PRIV	4
  
  #define GUE_FLAGS_ALL	(GUE_FLAG_PRIV)
  
  /* Private flags in the private option extension */
c1aa8347e   Tom Herbert   gue: Protocol con...
58
59
60
61
  #define GUE_PFLAG_REMCSUM	htonl(1 << 31)
  #define GUE_PLEN_REMCSUM	4
  
  #define GUE_PFLAGS_ALL	(GUE_PFLAG_REMCSUM)
5024c33ac   Tom Herbert   gue: Add infrastr...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  
  /* Functions to compute options length corresponding to flags.
   * If we ever have a lot of flags this can be potentially be
   * converted to a more optimized algorithm (table lookup
   * for instance).
   */
  static inline size_t guehdr_flags_len(__be16 flags)
  {
  	return ((flags & GUE_FLAG_PRIV) ? GUE_LEN_PRIV : 0);
  }
  
  static inline size_t guehdr_priv_flags_len(__be32 flags)
  {
  	return 0;
  }
  
  /* Validate standard and private flags. Returns non-zero (meaning invalid)
   * if there is an unknown standard or private flags, or the options length for
   * the flags exceeds the options length specific in hlen of the GUE header.
   */
  static inline int validate_gue_flags(struct guehdr *guehdr,
  				     size_t optlen)
  {
  	size_t len;
  	__be32 flags = guehdr->flags;
  
  	if (flags & ~GUE_FLAGS_ALL)
  		return 1;
  
  	len = guehdr_flags_len(flags);
  	if (len > optlen)
  		return 1;
  
  	if (flags & GUE_FLAG_PRIV) {
  		/* Private flags are last four bytes accounted in
  		 * guehdr_flags_len
  		 */
  		flags = *(__be32 *)((void *)&guehdr[1] + len - GUE_LEN_PRIV);
  
  		if (flags & ~GUE_PFLAGS_ALL)
  			return 1;
  
  		len += guehdr_priv_flags_len(flags);
  		if (len > optlen)
  			return 1;
  	}
  
  	return 0;
  }
37dd02477   Tom Herbert   gue: Receive side...
111
  #endif