The described embodiments relate generally to the outputting of packets from a network flow processor integrated circuit, and to related methods and structures.
A high-speed network flow processor integrated circuit, for speed and throughput and cost reasons, generally does not buffer all packets that pass through the integrated circuit. Rather, the payloads of at least some packets are buffered temporarily in external memory, and when the packet is to be output from the integrated circuit then the packet is assembled on the integrated circuit, and is then output from the integrated circuit. Methods and structures are sought for improving this merging and packet outputting process.
An amount of packet information (for example, a packet) is stored in split fashion such that a “first part” of the packet information is stored in a first device (for example, in internal memory in a network flow processor integrated circuit) and a “second part” of the packet information is stored in a second device (for example, in external memory external to the network flow processor integrated circuit). The first part may, for example, include an ingress packet descriptor, a packet modifier script code, and a packet header of a packet. The second part may, for example, be packet payload of the packet.
A novel split packet transmission DMA engine receives an egress packet descriptor. The egress packet descriptor is compact and small and does not contain any address identifying where the second part is stored, but the egress packet descriptor does contain information about the first part. In one example, the egress packet descriptor contains a relatively small packet number (Packet Portion Identifier or “PPI”) that in turn is usable by a packet engine in the first device to obtain a longer address indicating where the first part is stored in the first device. The PPI is not an address.
In response to receiving the egress packet descriptor, the DMA engine uses the information (in the egress packet descriptor) about the first part to cause a part (for example, the first eight bytes) of the first part to be read from the first device and to be transferred across a bus to the DMA engine. In one example, the bus is a CPP (Command/Push/Pull) bus. There is address information in a predetermined location at the beginning of the first part that indicates where the second part is stored. The DMA engine extracts this address information from the predetermined location, and uses the extracted address information to cause the second part to be read and transferred from the second device across the bus to the DMA engine. The second part is read out of the second device and is transferred across the bus in a plurality of reads and bus transactions. In addition, a part of the first part is read out of the first device and is transferred across the bus in a plurality of memory reads and bus transactions. This part of the first part may be the packet modifier script code and the packet header. As a result, the part of the first part (for example, the script code and the packet header) and the second part (for example, the packet payload) are received onto the DMA engine via the same bus and are stored together in a buffer memory within the DMA engine.
When both the part of the first part and the second part are stored together in the buffer memory in the DMA engine such that the entire amount of packet information is stored in the buffer memory in a single contiguous block of memory locations, then the part of the first part and the second part are transferred, piece by piece, in order, to an egress device. In this way, in one example, the script code, the packet header, and the packet payload are transferred in order into the egress device.
The DMA engine does not include any processor that fetches and executes instructions, but rather the DMA engine is a small amount of dedicated digital logic that serves as a general-purpose bus-accessible data mover resource. In response to being supplied with just a single egress packet descriptor, the DMA engine automatically causes the reading of the appropriate parts of the first and second parts, the merging of the part of the first part and the second part in the buffer memory, and the outputting of the resulting assembled amount of packet information to the egress device.
To set up the merging of the part of the “first part” and the “second part” by the novel split packet transmission DMA engine, an appropriate “first part” is loaded into the first device and an appropriate “second part” is loaded into the second device. The first part is set up to include information at its beginning that indicates where the second part is stored in the second device. This set up may be done by, or under the direction of, another device on the bus (for example, a processor) that communicates with the DMA engine via the bus. To initiate operation of the DMA engine on the first and second parts, the other device causes an appropriate egress packet descriptor to be supplied to the DMA engine.
The DMA engine is similarly usable to merge and output split packets where the second parts of these split packets are stored in an on-chip internal memory (such as for fast-path packets) as opposed to in external memory (such as for exception packets). If the “second part” of a packet is to be stored in an on-chip internal memory, then the first eight bytes of the “first part” are set up such that the address information points to the on-chip internal memory.
Further details and embodiments and methods and techniques are described in the detailed description below. This summary does not purport to define the invention. The invention is defined by the claims.
The accompanying drawings, where like numerals indicate like components, illustrate embodiments of the invention.
Reference will now be made in detail to background examples and some embodiments of the invention, examples of which are illustrated in the accompanying drawings.
In addition to the first peripheral area of I/O blocks, the NFP integrated circuit 150 also includes a second tiling area of islands 187-211. Each of these islands is either a full rectangular shape, or is half the size of the full rectangular shape. For example, the island 192 is a full island. The island 197 is a half island. The functional circuits in the various islands of this second tiling area are interconnected by: 1) a configurable mesh Command/Push/Pull (CPP) data bus, 2) a configurable mesh control bus, and 3) a configurable mesh event bus. Each such mesh bus extends over the two-dimensional space of islands with a regular grid or “mesh” pattern. In the case of the CPP data bus, as described in further detail below, functional circuitry in one island can use the CPP data bus to send a command to functional circuitry in another island, to read data from functional circuitry in another island, or to write data to functional circuitry in another island.
In addition to the second tiling area, there is a third area of larger sized blocks 212-216. The mesh bus structures do not extend into or over any of these larger blocks. The functional circuitry of a larger sized block may connect by direct dedicated connections to an interface island within the tiling area and through this interface island achieve connectivity to the mesh buses and other islands.
In the operational example of
In one example, the ingress NBI island 209 examines the header portion and from that determines whether the packet is an exception packet or whether the packet is a fast-path packet. If the packet is an exception packet, then the ingress NBI island 209 determines a first storage strategy to be used to store the packet so that relatively involved exception processing can be performed efficiently, whereas if the packet is a fast-path packet then the ingress NBI island determines a second storage strategy to be used to store the packet for more efficient transmission of the packet from the NFP integrated circuit 150. The ingress NBI island 209 examines a packet header, performs packet preclassification, determines that the packet is a fast-path packet, and determines that the header portion of the packet should pass to ME (MicroEngine) island 203. The header portion of the packet is therefore communicated across the configurable mesh CPP data bus from ingress NBI island 209 to ME island 203. The ME island 203 determines header modification and queuing strategy for the packet based on the packet flow (derived from packet header and contents) and the ME island 203 informs egress NBI island 200 of these.
In this simplified example being described, the payload portions of fast-path packets are placed into internal SRAM (Static Random Access Memory) MU block 215 and the payload portions of exception packets are placed into external DRAM 185 and 186. I-MU half island 205 is an interface island through which all information passing into, and out of, internal SRAM MU block 215 passes. The functional circuitry within half island 205 serves as the interface and control circuitry for the SRAM within block 215. Accordingly, the payload portion of the incoming fast-path packet is communicated from ingress NBI island 209, across the configurable mesh CPP data bus to I-MU control island 205, and from I-MU control island 205, to the interface circuitry in block 215, and to the internal SRAM circuitry of block 215. The internal SRAM of block 215 stores the payload portions so that they can be accessed for flow determination by the ME island 203.
In addition, a preclassifier in the ingress NBI island 209 determines that the payload portions for others of the packets should be stored in external DRAM 185 and 186. For example, the payload portions for exception packets are stored in external DRAM 185 and 186. E-MU Interface island 206, IP block 216, and DDR PHY I/O blocks 166 and 167 serve as the interface and control for external DRAM integrated circuits 185 and 186. The payload portions of the exception packets are therefore communicated across the configurable mesh CPP data bus from ingress NBI island 209, to E-MU interface and control island 206, to external MU SRAM block 216, to 32-bit DDR PHY I/O blocks 166 and 167, and to the external DRAM integrated circuits 185 and 186.
At this point in the operational example, the packet header portions and their associated payload portions are stored in different places. The payload portions of fast-path packets are stored in internal SRAM in MU block 215, whereas the payload portions of exception packets are stored in external memories 185 and 186.
ME island 203 informs egress NBI island 200 where the packet headers and the packet payloads can be found and provides the egress NBI island 200 with an egress packet descriptor for each packet. Egress NBI island 200 places packet descriptors for packets to be output into the correct order. The egress packet descriptor indicates a queuing strategy to be used on the packet. For each packet that is then scheduled to be transmitted, the novel split packet transmission DMA engine 267 in the egress NBI island 200 uses the egress packet descriptor to read the “first part” of the packet information (including the header portion and any header modification), and to read the “second part” of the packet information (the payload portion), and to assemble the packet to be transmitted in a buffer memory in the split packet transmission DMA engine. A packet modifier of the egress NBI island 200 then performs packet modification on the packet, and the resulting modified packet then passes from egress NBI island 200 and to egress MAC island 207. Egress MAC island 207 buffers the packets, and converts them into symbols. The symbols are then delivered by dedicated conductors from the egress MAC island 207 to three SerDes circuits 171-173 and out of the IB-NFP integrated circuit 150. The SerDes circuits 171-173 together can provide 120 gigabits per second of communication throughput out of the integrated circuit.
In the case of an exception packet, the preclassification user metadata and buffer pool number indicate to the DMA engine 230 that the frame is an exception frame and this causes a first buffer pool and a first different buffer list to be used, whereas in the case of a fast-path frame the preclassification user metadata and buffer pool number indicate to the DMA engine that the frame is a fast-path frame and this causes a second buffer pool and a second buffer list to be used. CPP bus interface 232 is a CPP bus interface through which the configurable mesh CPP data bus 226 is accessed. Arrow 233 represents frames (packets) and their associated ingress packet descriptors that are DMA transferred out of the ingress NBI island 209 by DMA engine 230 and through CCP bus interface 232.
After the picoengine pool 227 in the ingress NBI island 209 has done its analysis and generated its preclassification results for a packet, the ingress NBI island 209 then DMA transfers the frame header (packet header) and associated ingress packet descriptor (including the preclassification results) across the CPP configurable mesh data bus 226 and into a CTM 234 (Cluster Target Memory) in the ME island 203. Within the ME island 203, one or more microengines (MEs) then perform further processing on the header and preclassification results as explained in further detail in U.S. patent application Ser. No. 13/399,888, entitled “Island-Based Network Flow Processor Integrated Circuit”, filed Feb. 17, 2012, now U.S. Pat. No. 9,237,095, by Stark et al. (all the subject matter of which is hereby incorporated by reference).
In the ME island of
As described in further detail below, this DMA engine 267 receives such an egress packet descriptor, and based on the information in the egress packet descriptor, operates with master interface 450 to transfer a part of the “first part” of the packet information and the “second part” of the packet information across CPP data bus and DB interface 268 and into the buffer memory 280 in the DMA engine 267. Once the script code and the complete packet is in the buffer memory 280, then the script code and the packet is moved 32-byte piece at a time, buffer by buffer, into FIFO 269. As a result, each entry in FIFO 269 includes a script code portion 270, the header portion 271 of the packet, and the payload portion 272 of the packet.
Information passes out of FIFO 269 and into the packet modifier 273 in ordered 32-byte chunks. The script code 270 at the beginning of the packet (as the packet and script code are stored in the FIFO 269) was added by the microengine in the ME island. As a result of the lookup performed at the direction of the microengine, a packet policy was determined, and part of this packet policy is an indication of what of the packet header to change and how to change it before the packet is transmitted. The packet modifier 273 receives a packet in 32-byte chunks from FIFO 269. As each 32-byte chunk passes through the packet modifier 273, it can increase in size due to the insertion of bits, or it can decrease in size due to the deleting of bits. The chunks pass through the pipeline in sequence, one after the other. The resulting modified chunks as they come out of the pipeline are aggregated at the end of the packet modifier 273 into larger 256-byte portions of a packet, referred to here as minipackets. A minipacket includes a number of chunks, along with associated out-of-band control information. The out-of-band control information indicates how the data of the minipacket can be assembled with the data of other minipackets to reform the overall modified packet. In this way, the resulting modified packet is output from the egress NBI island 200 as a sequence of 256-byte minipackets across dedicated connections 274 to egress MAC island 207. Reference numeral 275 identifies one such minipacket. For additional detailed information on the structure and operation of the egress NBI island 200, see: U.S. patent application Ser. No. 13/941,494, entitled “Script-Controlled Egress Packet Modifier”, filed on Jul. 14, 2013, now U.S. Pat. No. 9,124,644, by Chirag P. Patel et al. (all the subject matter of which is hereby incorporated by reference).
CCP Data Bus Operation: Operation of the Command/Push/Pull data bus is described below in connection with
The bus transaction value in this case is a write command to write data into functional circuitry in another island. The functional circuitry that receives the bus transaction value and the data to be written is referred to as the “target” of the write operation. The write command is said to be “posted” by the master circuit onto the command mesh. As indicated in
A final destination island may have more than one potential target circuit. The 4-bit target field of payload portion indicates which one of these targets in the destination island it is that is the target of the command. The 5-bit action field of the payload portion indicates that the command is a write. The 14-bit data reference field is a reference usable by the master circuit to determine where in the master the data is to be found. The address field indicates an address in the target where the data is to be written. The length field indicates the amount of data.
In a next step (step 1002) in the method 1000 of
The master circuit receives the pull-id from the pull-id mesh and uses the content of the data reference field of the pull-id to find the data. In the overall write operation, the master circuit knows the data it is trying to write into the target circuit. The data reference value that is returned with the pull-id is used by the master circuit as a flag to match the returning pull-id with the write operation the master circuit had previously initiated.
The master circuit responds by sending (step 1004) the identified data to the target across one of the data meshes data0 or data1 as a “pull” data bus transaction value. The term “pull” means that the data of the operation passes from the master to the target. The term “push” means that the data of the operation passes from the target to the master. The format of the “pull” data bus transaction value sent in this sending of data is also as indicated in
The target receives the read command (step 2002) and examines the payload portion of the command. From the action field of the command payload portion the target circuit determines that it is to perform a read action. To carry out this action, the target circuit uses the address field and the length field to obtain the data requested. The target then pushes (step 2003) the obtained data back to the master circuit across data mesh data1 or data0. To push the data, the target circuit outputs a push bus transaction value onto the data1 or data0 mesh.
Split Packet Transmission Data Engine Operation:
In a first step (step 101), the novel DMA engine 267 receives an egress packet descriptor from the scheduler 263. As described above, this egress packet descriptor is supplied to the DMA engine 267 as a result of a “packet ready” CPP bus command sent from the CTM 234 in the ME island 203 to the DMA engine 267 in the egress NBI island 200. The egress packet descriptor includes, among other parts not set forth here: 1) a packet portion identifier (PPI) that identifies a packet, 2) the island number that identifies the CTM where the header portion (as part of the “first part” of the packet information) is stored, 3) a number indicating how long the entire packet is, 4) a script code offset value (indicating the offset between the beginning of the “first part” and the beginning of the packet modifier script code), 5) a two-bit code indicating how big the “first part” is (either 256B, or 512B, or 1 KB or 2 KB), 6) a number indicating the length of the payload portion of the packet, 7) a sequence number of the packet in the flow, 8) an indication of which queue the packet belongs to (result of the packet policy), 9) an indication of where the packet is to be sent (a result of the packet policy), 10) user metadata indicating what kind of packet it is.
As described in further detail in U.S. patent application Ser. No. 14/464,692, entitled “PPI Allocation Request And Response For Accessing A Memory System”, filed Aug. 20, 2014, now U.S. Pat. No. 9,559,988, by Salma Mirza et al. (the entire contents of which is incorporated herein by reference), the CTM 234 includes a packet engine. The packet engine stores each header portion in the CTM in association with a PPI. As mentioned above, the header portion is stored as part of the “first part” of the packet information of the packet. The PPI is a nine-bit number that the packet engine allocates for use in identifying the packet. Once the packet engine is no longer storing and handling the header portion for a given packet, then the PPI number is de-allocated, and can then be allocated for use with another packet. The PPI mentioned above as being contained in the egress packet descriptor is one such PPI that the packet engine in the CTM has allocated to, and associated with, the header portion of the packet as it is stored in the CTM.
Next, the DMA engine allocates (step 102) a 6-bit context number to the packet (to the egress packet descriptor), to allocate one of sixty-four contexts. This allocation is similar to the allocation of PPIs as performed by the packet engine, except in this case the DMA engine 267 is allocating a context number to the packet associated with the egress packet descriptor. In addition, the DMA engine allocates (step 103) a set of contiguously numbered buffer numbers to the context number. Within the DMA engine 267 there is a 16K byte buffer memory 280 as mentioned above. This buffer memory 280 is made up of 128 buffers, where each buffer is 128 bytes long. Each such 128-byte buffer has an associated number. The numbers of the buffers are sequential numbers, and the buffers as located in the buffer memory are adjacent each other in the same order. The buffers denoted buffer#1, buffer#2, buffer#3 are physically located in the buffer memory adjacent one another in the order of: the buffer identified by number buffer#1, the buffer identified by the buffer number buffer#2, the buffer identified by the buffer number buffer#3, and so forth. The number of buffers allocated to a context number is determined by the DMA engine from the 2-bit code in the egress packet descriptor that indicates the length of the “first part” and from the number that indicates the length of the payload portion. Only sequentially numbered buffers are allocated.
Next (step 104), the DMA engine 267 responds to the “packet ready” CPP command by issuing an initial pull-id to the CTM 234 where the first part of the packet information is stored. This pull-id is to read the first eight bytes of the ingress packet descriptor from the beginning of the “first part” of the packet information in the CTM. The pull-id includes the PPI and an offset value, where the offset value is zero because the very first eight bytes of the “first part” is to be read. The pull-id does not include an actual address where the “first part” is stored, but rather the pull-id includes the PPI (as obtained from the egress packet descriptor) and the island number of the CTM (as obtained from the egress packet descriptor). The pull-id is communicated across the pull-id mesh to the CTM 234. The CTM 234 receives the pull-id, and the packet engine within the CTM 234 uses the PPI to perform a PPI-to-address translation to obtain an address in the memory of the CTM where the header portion is stored. The CTM 234 the uses this address to read the first eight bytes of the “first part” out of the CTM's memory, and then returns those first eight bytes back to the DMA engine 267 across the data mesh of the CPP bus. The DMA engine 267 receives (step 105) the first eight bytes of the “first part”, which is the first eight bytes of the ingress packet descriptor as placed there by an microengine (ME). These first eight bytes are not loaded into buffer memory 280 in the DMA engine, but rather are stored elsewhere. At a predetermined location in these first eight bytes is: 1) the starting address of the “second part” of the packet information (the payload portion) where it is stored in external DRAM memory, and 2) the island number of the memory control unit that interfaces with the external DRAM memory.
The DMA engine extracts this starting address and island number information, and uses that information to issue (step 106) bulk engine read CPP commands to the bulk engine in the E-MU control island 206 for the external memory 185 and 186 where the payload portion (the “second part” of the packet information) is stored. The DMA engine determines from the length information in the egress packet descriptor how many such bulk engine read commands to issue, and it also handles updating the address of each successive bulk engine read command so that 128-byte portion, by 128-byte portion, is read out of the external memory by the bulk engine and is sent by the bulk engine back to the DMA engine. Each bulk engine read command includes a context number and an associated buffer number. The context number and buffer number are returned with the push data. A buffer number indicates to the DMA engine where the push data returned by the bulk engine is to be stored in the DMA engine's buffer memory 280.
Each 128-byte amount of push data as returned from the external memory is received (step 107) along with the context number and a buffer number. The DMA engine 267 uses the buffer number to write the data into the indicated buffer in the buffer memory.
The DMA engine also issues additional pull-ids (in response to the initial “packet ready” command) on the pull-id mesh of the CPP data bus. Each of these pull-ids is to have the CTM 234 return the next 128-byte piece of a part of the “first part” to the DMA engine 267, where the 128-byte piece of data will be received onto the DMA engine 267 via the data mesh of the CPP data bus. Each of these pull-ids includes the same PPI number, and an offset. The offset indicates which particular piece of the “first part”, as identified by the PPI, is to be returned. The DMA engine handles incrementing the offset values of the pull-ids as the pull-ids are output from the DMA engine. The very last pull-id (to read the very last piece of the “first part”) contains a field indicating that the pull-id is the last pull-id for the “packet ready” command. These additional pull-ids have offsets such that the part of the “first part” is transferred from the CTM 234 to the DMA engine 267. The part of the “first part” may, for example, be the script code and the packet header portion. Bytes of the “first part” that precede the script code are not transferred as a result of these additional pull-ids.
Each 128-byte amount of the pull data as returned from the CTM 234 due to one of these additional pull-ids is received (step 109) onto the DMA engine along with a buffer number. The data is received via the data mesh of the CPP bus. The DMA engine 267 uses the buffer number to write the data into the appropriate buffer in the buffer memory 280 in the DMA engine 267. In this way the script code and the packet header portion (from the “first part”) are transferred from the CTM 234 and into the buffer memory 280. Bytes of the “first part” that precede the script code are not written into the buffer memory 280.
Although the data transfers (due to bulk engine read commands) from the external memory into the DMA engine are shown in
The DMA engine detects when all the buffers allocated to the context number of the packet have been filled with data. The DMA engine then starts outputting (step 110) the contents of the buffers in sequential order (according to buffer number) for that context number. The content of each buffer is supplied to the FIFO 269 at the input of the packet modifier 273 in the egress NBI island 200 of
DMA engine 267 includes a packet ready command decoder 310, a packet acceptance circuit 311, a context information maintenance circuit 312, an external memory pointer registers maintenance circuit 313, a pull-id generator circuit 314, a bulk engine read command generator circuit 315, four push/pull data interface circuits 316-319, a memory address pointer decode and write queue circuit 320, the buffer memory 280, a read out buffer content controller 321, and FIFOs 322-324. The packet acceptance circuit 311 includes a context list maintenance circuit 325 and a buffer list maintenance circuit 326. The context list maintenance circuit 325 records whether each of the sixty-four context numbers has been allocated or not, and if it has been allocated then the circuit also records the PPI to which it has been allocated. The circuit 325 also handles allocating context numbers and de-allocating context numbers. The DMA engine 267 can be processing up to sixty-four packets at any given time, where each packet that is being processed is allocated one of the sixty-four context numbers. The buffer list maintenance circuit 326 records whether each of the 128 buffers (in buffer memory 280) has been allocated or not, and if it has been allocated then the circuit also records the context number to which it has been allocated. When an egress packet descriptor is first received via lines 266 onto the DMA engine 267, the unallocated context numbers as recorded in circuit 325 are examined and the one of those unallocated context numbers whose context number is the lowest is allocated to the PPI of the packet egress packet descriptor.
Also, a set of buffer numbers is allocated to the context number. Length information in the egress packet descriptor (the two-bit value indicating the size of the “first part” and the value indicating the length of the payload portion of the packet) are used by circuit 326 to determine the number of buffers needed to store the packet, and the circuit 326 checks all unallocated buffer numbers and picks the set of contiguously numbered unallocated buffer numbers that together are large enough to store the packet. These buffer numbers and then recorded in circuit 326 as being allocated to the context number. The circuit 326 in this way handles allocating buffer numbers.
The context information maintenance circuit 312 maintains information for each of the sixty-four contexts, including the PPI associated with the packet that is being assembled in the context, the CTM number where the header portion is stored, and a value indicating the total length of the packet. Once the egress packet descriptor has been received and a context number has been allocated and a set of buffers has been allocated, then the circuit 312 causes the pull-id generator circuit 314 to issue a first pull-id (in response to the “packet ready” command) to read the first eight bytes of the “first part”. This first pull-id is a short and preferably fast pull-id as compared to later-issued pull-ids. When the first eight bytes of the very beginning of the “first part” is returned to the DMA engine 267 via the data mesh of the CPP bus, the information passes through the push/pull data interface circuits 316-319 to the circuit 320. The circuit 320 extracts the address information indicating where the second part is stored. This address information includes an island number (of the control block for the memory) and a memory address. For each of the sixty-four contexts being handled, the external memory pointer registers circuit 313 maintains the last address in external address for which the DMA engine has issued a bulk engine read command. Accordingly, in response to receiving the first eight bytes of the “first part”, the initial address information is therefore written into circuit 313 for the context of the egress packet descriptor. The returned eight bytes of data for this first pull-id is not written into buffer memory 280. The circuit 312 uses the address information to cause the bulk engine read generator circuit 315 to issue a first bulk engine read command onto the CPP data bus to read the first piece of “second part”. Each such bulk engine read command includes the context number and the buffer number of a buffer into which the return data shall be stored. When the data is returned via the push-pull data interface circuits 316-319, the circuit 320 extracts the context number and buffer number from the beginning of the data, and writes the remainder of the data into the appropriate buffer in the buffer memory 280. The external memory pointer registers circuit 313 causes multiple such bulk engine read commands to be issued via the bulk engine read generator circuit 315 and FIFO 323, and as each successive bulk engine read command is output the address (pointer) to read is incremented under the control of the external memory pointer registers circuit 313.
Likewise, the context information circuit 312 causes the pull-id generator circuit 314 to issue additional pull-ids onto the pull-id mesh of the CPP data bus (in response to the “packet ready” command), with each successive pull-id having the same PPI number, but with each successive pull-id having a different offset value. The offset values of these pull-ids are incremented under the control the context information circuit 312 so that each pull-id results in a different piece of the “first part” being returned to the DMA engine. Enough pull-ids are generated in this way so as to read the part of the “first part” from the CTM into the DMA engine. This part of the first part starts at the script code and includes the script code and the packet header. The external memory pointer registers circuit 313 causes the last of these pull-ids to include a field that indicates that it is the last pull-id for the associated “packet ready” command. Each corresponding amount of data as returned (in response to one of these pull-ids) has a context number and a buffer number, and the circuit 320 extracts these values from the incoming data and uses them to write the remainder of the data into the appropriate buffer in buffer memory 280. In this way using these additional pull-ids, the script code and the packet header are loaded into buffer memory 280. Bytes of the “first part” before the script code are not loaded into the buffer memory 280.
When all the allocated buffers for the context have been filled, then the read out buffer content controller 321 reads the contents of the allocated buffer (allocated to that context number) with the smallest buffer number and supplies the data to the FIFO 269 via lines 309. When all the data of a buffer has been read out of the buffer memory, then the read out buffer content controller 321 alerts the packet acceptance circuit 311 of the buffer number via lines 327. The packet acceptance circuit 311 responds by de-allocating (“freeing”) that buffer number. The contents of buffers are read out of the buffer memory, buffer by buffer, in order of buffer number. When all the buffer numbers allocated to the context have been read and their data supplied via lines 309 to FIFO 269, then the read out buffer content controller 321 alerts the packet acceptance circuit 311 of the context number via lines 328. The packet acceptance circuit 311 responds by de-allocating (“freeing”) that context number.
Although the split packet transmission DMA engine 267 is described above as performing merging operations for one CTM, in a typical usage in the IB-NFP a single split packet transmission DMA engine merges packet information for multiple different CTMs. Multiple different CTMs can cause egress packet descriptors to be supplied to the same split packet transmission DMA engine.
In one example, the split packet transmission DMA engine 267 is implemented by describing the function of each block of
Although certain specific embodiments are described above for instructional purposes, the teachings of this patent document have general applicability and are not limited to the specific embodiments described above. In some examples, the DMA engine is configurable so that the specific amount of the “first part” that is transferred into the buffer memory is configurable. All of the “first part” is transferred into the buffer memory in some configurations, whereas only a part of the “first part” is transferred into buffer memory in other configurations. In some examples, all of the “first part” and all of the “second part” are stored in the buffer memory, but only a configurable amount of these is read out of the buffer memory and is supplied to the egress device. Accordingly, various modifications, adaptations, and combinations of various features of the described embodiments can be practiced without departing from the scope of the invention as set forth in the claims.
Number | Name | Date | Kind |
---|---|---|---|
6172990 | Deb | Jan 2001 | B1 |
20040010545 | Pandya | Jan 2004 | A1 |
20130215792 | Stark | Aug 2013 | A1 |
20140177629 | Manula | Jun 2014 | A1 |