Move priority frame's exclusive bit from bit #7 to bit #4.

gfe-relnote: v99 only, not protected.
PiperOrigin-RevId: 258589446
Change-Id: I48c9ed6c09135a6e08fdc5df4b70ff7af8aee498
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index 90df506..faffdc9 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -4,6 +4,9 @@
 
 #include "net/third_party/quiche/src/quic/core/http/http_decoder.h"
 
+#include <cstdint>
+
+#include "net/third_party/quiche/src/quic/core/http/http_frames.h"
 #include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h"
@@ -11,17 +14,6 @@
 namespace quic {
 
 namespace {
-
-// Create a mask that sets the last |num_bits| to 1 and the rest to 0.
-inline uint8_t GetMaskFromNumBits(uint8_t num_bits) {
-  return (1u << num_bits) - 1;
-}
-
-// Extract |num_bits| from |flags| offset by |offset|.
-uint8_t ExtractBits(uint8_t flags, uint8_t num_bits, uint8_t offset) {
-  return (flags >> offset) & GetMaskFromNumBits(num_bits);
-}
-
 // Length of the weight field of a priority frame.
 static const size_t kPriorityWeightLength = 1;
 // Length of a priority frame's first byte.
@@ -468,12 +460,11 @@
     return false;
   }
 
-  frame->prioritized_type =
-      static_cast<PriorityElementType>(ExtractBits(flags, 2, 6));
-  frame->dependency_type =
-      static_cast<PriorityElementType>(ExtractBits(flags, 2, 4));
-  // TODO(b/137662729): Update bitmask for exclusive flag.
-  frame->exclusive = flags % 2 == 1;
+  // Assign two most significant bits to prioritized_type.
+  frame->prioritized_type = static_cast<PriorityElementType>((flags >> 6) & 3);
+  // Assign the next two most significant bits to dependency type.
+  frame->dependency_type = static_cast<PriorityElementType>((flags >> 4) & 3);
+  frame->exclusive = flags >> 3 & 1;
   // TODO(b/137359636): Handle partial delivery.
   if (frame->prioritized_type != ROOT_OF_TREE &&
       !reader->ReadVarInt62(&frame->prioritized_element_id)) {
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index 1c245d0..cf32171 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -306,7 +306,7 @@
   std::string input =
       "\x02"   // type (PRIORITY)
       "\x04"   // length
-      "\x01"   // request stream, request stream, exclusive
+      "\x08"   // request stream, request stream, exclusive
       "\x03"   // prioritized_element_id
       "\x04"   // element_dependency_id
       "\xFF";  // weight
@@ -351,7 +351,7 @@
   std::string input2 =
       "\x02"   // type (PRIORITY)
       "\x02"   // length
-      "\xf1"   // root of tree, root of tree, exclusive
+      "\xf8"   // root of tree, root of tree, exclusive
       "\xFF";  // weight
   PriorityFrame frame2;
   frame2.prioritized_type = ROOT_OF_TREE;
diff --git a/quic/core/http/http_encoder.cc b/quic/core/http/http_encoder.cc
index 2b8be8e..2306b8e 100644
--- a/quic/core/http/http_encoder.cc
+++ b/quic/core/http/http_encoder.cc
@@ -45,7 +45,7 @@
 // Length of a priority frame's first byte.
 static const size_t kPriorityFirstByteLength = 1;
 // The bit that indicates Priority frame is exclusive.
-static const uint8_t kPriorityExclusiveBit = 1;
+static const uint8_t kPriorityExclusiveBit = 8;
 
 }  // namespace
 
diff --git a/quic/core/http/http_encoder_test.cc b/quic/core/http/http_encoder_test.cc
index d0696ed..eb5e574 100644
--- a/quic/core/http/http_encoder_test.cc
+++ b/quic/core/http/http_encoder_test.cc
@@ -56,7 +56,7 @@
                    // length
                    0x4,
                    // request stream, request stream, exclusive
-                   0x01,
+                   0x08,
                    // prioritized_element_id
                    0x03,
                    // element_dependency_id
@@ -81,7 +81,7 @@
                     // length
                     0x3,
                     // root of tree, request stream, exclusive
-                    0xc1,
+                    0xc8,
                     // element_dependency_id
                     0x04,
                     // weight
@@ -101,7 +101,7 @@
                     // length
                     0x2,
                     // root of tree, root of tree, exclusive
-                    0xf1,
+                    0xf8,
                     // weight
                     0xff};
   length = encoder_.SerializePriorityFrame(priority3, &buffer);
diff --git a/quic/core/http/http_frames.h b/quic/core/http/http_frames.h
index cf282ee..b84b658 100644
--- a/quic/core/http/http_frames.h
+++ b/quic/core/http/http_frames.h
@@ -5,6 +5,7 @@
 #ifndef QUICHE_QUIC_CORE_HTTP_HTTP_FRAMES_H_
 #define QUICHE_QUIC_CORE_HTTP_HTTP_FRAMES_H_
 
+#include <cstdint>
 #include <map>
 #include <ostream>
 
@@ -48,7 +49,7 @@
 //
 //   The PRIORITY (type=0x02) frame specifies the sender-advised priority
 //   of a stream
-enum PriorityElementType {
+enum PriorityElementType : uint8_t {
   REQUEST_STREAM = 0,
   PUSH_STREAM = 1,
   PLACEHOLDER = 2,