guehdr
__be32 pflags = *(__be32 *)((void *)&guehdr[1] +
static inline int validate_gue_flags(struct guehdr *guehdr, size_t optlen)
__be16 flags = guehdr->flags;
guehdr->flags |= GUE_FLAG_PRIV;
return guehdr;
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
skb_remcsum_process(skb, (void *)guehdr + hdrlen,
return guehdr;
struct guehdr *guehdr;
len = sizeof(struct udphdr) + sizeof(struct guehdr);
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
switch (guehdr->version) {
switch (((struct iphdr *)guehdr)->version) {
static int gue_control_message(struct sk_buff *skb, struct guehdr *guehdr)
if (guehdr->control)
optlen = guehdr->hlen << 2;
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
if (validate_gue_flags(guehdr, optlen))
if (guehdr->proto_ctype == IPPROTO_UDP ||
guehdr->proto_ctype == IPPROTO_UDPLITE)
ret = gue_err_proto_handler(guehdr->proto_ctype, skb, info);
struct guehdr *guehdr;
len = sizeof(struct udphdr) + sizeof(struct guehdr);
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
switch (guehdr->version) {
switch (((struct iphdr *)guehdr)->version) {
optlen = guehdr->hlen << 2;
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
if (validate_gue_flags(guehdr, optlen))
hdrlen = sizeof(struct guehdr) + optlen;
data = &guehdr[1];
if (guehdr->flags & GUE_FLAG_PRIV) {
guehdr = gue_remcsum(skb, guehdr, data + doffset,
hdrlen, guehdr->proto_ctype,
if (!guehdr)
data = &guehdr[1];
if (unlikely(guehdr->control))
return gue_control_message(skb, guehdr);
proto_ctype = guehdr->proto_ctype;
static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off,
struct guehdr *guehdr, void *data,
return guehdr;
guehdr = skb_gro_remcsum_process(skb, (void *)guehdr, off, hdrlen,
return guehdr;
struct guehdr *guehdr;
len = off + sizeof(*guehdr);
guehdr = skb_gro_header(skb, len, off);
if (unlikely(!guehdr))
switch (guehdr->version) {
switch (((struct iphdr *)guehdr)->version) {
optlen = guehdr->hlen << 2;
guehdr = skb_gro_header_slow(skb, len, off);
if (unlikely(!guehdr))
if (unlikely(guehdr->control) || guehdr->version != 0 ||
validate_gue_flags(guehdr, optlen))
hdrlen = sizeof(*guehdr) + optlen;
skb_gro_postpull_rcsum(skb, guehdr, hdrlen);
data = &guehdr[1];
if (guehdr->flags & GUE_FLAG_PRIV) {
guehdr = gue_gro_remcsum(skb, off, guehdr,
if (!guehdr)
data = &guehdr[1];
const struct guehdr *guehdr2;
guehdr2 = (struct guehdr *)(p->data + off);
if (guehdr->word != guehdr2->word) {
if (guehdr->hlen && memcmp(&guehdr[1], &guehdr2[1],
guehdr->hlen << 2)) {
proto = guehdr->proto_ctype;
struct guehdr *guehdr = (struct guehdr *)(skb->data + nhoff);
switch (guehdr->version) {
proto = guehdr->proto_ctype;
guehlen = sizeof(*guehdr) + (guehdr->hlen << 2);
switch (((struct iphdr *)guehdr)->version) {
static struct guehdr *gue_remcsum(struct sk_buff *skb, struct guehdr *guehdr,
len = sizeof(struct udphdr) + sizeof(struct guehdr);
struct guehdr *guehdr;
hdrlen = sizeof(struct guehdr) + optlen;
guehdr = (struct guehdr *)skb->data;
guehdr->control = 0;
guehdr->version = 0;
guehdr->hlen = optlen >> 2;
guehdr->flags = 0;
guehdr->proto_ctype = *protocol;
data = &guehdr[1];
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
switch (guehdr->version) {
switch (((struct iphdr *)guehdr)->version) {
if (guehdr->control)
optlen = guehdr->hlen << 2;
guehdr = (struct guehdr *)&udp_hdr(skb)[1];
if (validate_gue_flags(guehdr, optlen))
if (guehdr->proto_ctype == IPPROTO_UDP ||
guehdr->proto_ctype == IPPROTO_UDPLITE)
ret = gue6_err_proto_handler(guehdr->proto_ctype, skb,
struct guehdr *guehdr;
len = sizeof(struct udphdr) + sizeof(struct guehdr);
struct guehdr _gueh, *gueh;
return sizeof(struct udphdr) + sizeof(struct guehdr) +
struct guehdr *gueh; /* Our new GUE header */
hdrlen = sizeof(struct guehdr) + optlen;
gueh = (struct guehdr *)skb->data;
gue_hdrlen = sizeof(struct guehdr) + gue_optlen;
gue_hdrlen = sizeof(struct guehdr) + gue_optlen;
mtu -= sizeof(struct udphdr) + sizeof(struct guehdr);
mtu -= sizeof(struct udphdr) + sizeof(struct guehdr);
(sizeof(struct guehdr) / sizeof(uint32_t)) + hop_count;
struct guehdr *gueh = header;
ol4_len = sizeof(struct udphdr) + sizeof(struct guehdr);
sizeof(struct guehdr),
sizeof(struct guehdr) + il3_len + il4_len +
struct guehdr gue;