| 138 | } |
| 139 | |
| 140 | std::string Packet::Dump() { |
| 141 | std::ostringstream dump; |
| 142 | Packet *pkt; |
| 143 | uint32_t dump_len = total_len(); |
| 144 | uint32_t nb_segs; |
| 145 | uint32_t len; |
| 146 | |
| 147 | dump << "refcnt chain: "; |
| 148 | for (pkt = this; pkt; pkt = pkt->next_) { |
| 149 | dump << pkt->refcnt_ << ' '; |
| 150 | } |
| 151 | dump << std::endl; |
| 152 | |
| 153 | dump << "pool chain: "; |
| 154 | for (pkt = this; pkt; pkt = pkt->next_) { |
| 155 | int i; |
| 156 | |
| 157 | dump << pkt->pool_ << "("; |
| 158 | |
| 159 | for (i = 0; i < RTE_MAX_NUMA_NODES; i++) { |
| 160 | if (pframe_pool[i] == pkt->pool_) { |
| 161 | dump << "P" << i; |
| 162 | } |
| 163 | } |
| 164 | dump << ") "; |
| 165 | } |
| 166 | dump << std::endl; |
| 167 | |
| 168 | dump << "dump packet at " << this << ", phys=" << buf_physaddr_ |
| 169 | << ", buf_len=" << buf_len_ << std::endl; |
| 170 | dump << " pkt_len=" << pkt_len_ << ", ol_flags=" << std::hex |
| 171 | << mbuf_.ol_flags << ", nb_segs=" << std::dec << nb_segs_ |
| 172 | << ", in_port=" << mbuf_.port << std::endl; |
| 173 | |
| 174 | nb_segs = nb_segs_; |
| 175 | pkt = this; |
| 176 | while (pkt && nb_segs != 0) { |
| 177 | __rte_mbuf_sanity_check(&pkt->mbuf_, 0); |
| 178 | |
| 179 | dump << " segment at " << pkt << ", data=" << pkt->head_data() |
| 180 | << ", data_len=" << std::dec << unsigned{data_len_} << std::endl; |
| 181 | |
| 182 | len = total_len(); |
| 183 | if (len > data_len_) { |
| 184 | len = data_len_; |
| 185 | } |
| 186 | |
| 187 | if (len != 0) { |
| 188 | dump << HexDump(head_data(), len); |
| 189 | } |
| 190 | |
| 191 | dump_len -= len; |
| 192 | pkt = pkt->next_; |
| 193 | nb_segs--; |
| 194 | } |
| 195 | |
| 196 | return dump.str(); |
| 197 | } |