UBool AffixPatternIterator::nextToken() { int32_t tlen = tokens->length(); if (nextTokenIndex == tlen) { return FALSE; } ++nextTokenIndex; const UChar *tokenBuffer = tokens->getBuffer(); if (UNPACK_TOKEN(tokenBuffer[nextTokenIndex - 1]) == AffixPattern::kLiteral) { while (nextTokenIndex < tlen && UNPACK_LONG(tokenBuffer[nextTokenIndex])) { ++nextTokenIndex; } lastLiteralLength = 0; int32_t i = nextTokenIndex - 1; for (; UNPACK_LONG(tokenBuffer[i]); --i) { lastLiteralLength <<= 8; lastLiteralLength |= UNPACK_LENGTH(tokenBuffer[i]); } lastLiteralLength <<= 8; lastLiteralLength |= UNPACK_LENGTH(tokenBuffer[i]); nextLiteralIndex += lastLiteralLength; } return TRUE; }
bcm_rx_t ab_echo_cb(cpudb_key_t src_key, int client_id, bcm_pkt_t *pkt, uint8 *payload, int payload_len, void *cookie) { uint16 depth; int async_free; uint32 pkt_flags; bcm_rx_t rv = BCM_RX_HANDLED; int offset = 0; int mode; int len; CallbackOptions *options = (CallbackOptions *)cookie; if (payload == NULL) { /* Just use first segment for string */ if (pkt == NULL) { cli_out("CT echo error: payload and pkt both NULL, cli %d\n", client_id); return BCM_RX_NOT_HANDLED; } payload = pkt->pkt_data[1].data; len = pkt->pkt_data[1].len; cli_out("CT echo warning: \n"); cli_out(" Segmented packet; segmentation not maintained on echo\n"); } else { len = payload_len; } UNPACK_SHORT(payload, depth); offset += sizeof(uint16); UNPACK_LONG(payload + offset, pkt_flags); offset += sizeof(uint32); async_free = pkt_flags & CTE_FLAGS_ASYNC_FREE; mode = client_id - ECHO_BASE_CLI_ID; if (mode < 0 || mode > 4) { cli_out("CT echo error: Bad client id: %d\n", client_id); return BCM_RX_NOT_HANDLED; } if (sal_strlen((char *)&payload[offset]) > len) { cli_out("CT echo error: Unterminated string in first segment\n"); return BCM_RX_HANDLED; } if (_shr_crc32(~0, payload, len) != _SHR_CRC32_CORRECT) { cli_out("CT echo error: Echo payload CRC failure.\n"); } if (options->verbose) { cli_out("%s echo request from " CPUDB_KEY_FMT ": %s\n", cte_mode_list[mode], CPUDB_KEY_DISP(src_key), &payload[offset]); cli_out(" Depth %d, flags 0x%x, len %d. (total %d)\n", depth, pkt_flags, len - offset, payload_len); } if (depth > 0) { /* Return echo: one less depth, clear async flag */ pkt_flags &= ~CTE_FLAGS_ASYNC_FREE; pkt_flags &= ~CTE_FLAGS_CRC_REGEN; _send_echo_pkt(client_id, payload, len, depth - 1, pkt_flags, mode, options->verbose, src_key, NULL); } if (async_free) { rv = BCM_RX_HANDLED_OWNED; sal_dpc(echo_free_buf, payload, pkt, NULL, NULL, NULL); } else { rv = BCM_RX_HANDLED; } return rv; }