Example #2 |
DEVELOPER |
This topic contains further example that demonstrates the using Task/Function parameters and P4API parameter passing:
Suppose you have a PROIV Function that takes three parameters:
Name |
Type |
Size |
Array/Number of Elements |
Purpose |
FParam1 |
Numeric |
10 |
Scalar, not array |
Account number |
FParam2 |
Alpha |
20 |
4 elements |
Address lines |
FParam3 |
Alpha |
20 |
Scalar, not array |
Name |
Assume you define a Task with that function as the only member function. Corresponding Task parameters that match those function parameters could be:
Name |
Type |
Size |
Array |
T_Param1 |
N |
10 |
<blank> |
T_Param2 |
A |
20 |
4 |
T_Param3 |
A |
20 |
<blank> |
If you want to invoke that task using P4API calls, you might send the following strings as the sParams parameter in a p4ExecTask() call:
Delimiter separated list stream format to invoke task with parameters using a comma as the delimiter (sParamFormat set to 'D,' in the p4ExecTask() call):
T_Param1=12345,T_Param2()=(1 Main Street,Anytown,Anywhere,AnyCountry),T_Param3=John Smith
Length-Prefixed Stream Format using same data. As all elements of the Address array are being passed, the short form can be used.
<0x00><0x08>T_Param1<0x00><0x05>12345<0x00><0x0a>T_Param2()<0x00><0x04><0x00><0x30>
<0x00><0x0d>1 Main Street<0x00><0x07>Anytown<0x00><0x08>Anywhere
<0x00><0x0a>AnyCountry<0x00><0x08>T_Param3<0x00><0x0a>John Smith
Section |
Reason |
<0x00><0x08>T_Param1 |
The number of bytes in the literal 'T_Param1 'is eight. Represented as two hex bytes with that value. Followed by the name of the Task parameter defined in the Task definition. |
<0x00><0x05>12345 |
The number of bytes in the literal '12345' is five. Represented as two hex bytes with that value. Followed by the value of the T_Param1 parameter. |
<0x00><0x0a>T_Param2() |
The number of bytes in the literal 'T_Param2()' is ten. Represented as two hex bytes with that value. Followed by the name of the Task parameter defined in the Task definition. |
<0x00><0x04> |
The number of array elements being passed (four), represented as two hex bytes with that value. |
<0x00><0x2e> |
The number of bytes from this point (not including these two characters) to the end of the last T_Param2 data element. This totals 48 characters. Represent this total as two hex bytes. To accumulate the total, count 2 for these two hex bytes, add two for the length count of the first element (the two bytes <0x00> and <0x0d>), add thirteen for the number of bytes in the literal '1 Main Street', and so on, with the final accumulation being ten bytes for the literal 'AnyCountry'. |
<0x00><0x0d>1 Main Street |
Details of the first element of the T_Param2() array. The number of bytes in the literal '1 Main Street' is 13. Represented as two hex bytes with this value. Followed by the value of the first element. |
<0x00><0x07>Anytown |
Details of the second element of the T_Param2() array. The number of bytes in the literal 'Anytown' is seven. Represented as two hex bytes with this value. Followed by the value of the second element. |
This sequence is repeated for the third and fourth elements of the T_Param2() array |
|
<0x00><0x08>T_Param3 |
The number of bytes in the literal 'T_Param3' is eight. Represented as two hex bytes with that value. Followed by the name of the Task parameter defined in the Task definition. |
<0x00><0x0a>John Smith |
The number of bytes in the literal 'John Smith' is ten. Represented as two hex bytes with that value. Followed by the value of the T_Param3 parameter |
Length-Prefixed Stream Format using same data but with the fourth element of the Address not being sent. The short form can be used only if a null value is supplied for the fourth element:
<0x00><0x08>T_Param1<0x05>12345<0x00><0x0a>T_Param2()<0x00><0x04><0x00><0x24>
<0x00><0x0d>1 Main Street<0x00><0x07>Anytown<0x00><0x08>Anywhere
<0x00><0x00><0x00><0x0a>John Smith
The explanation for Example 2C is similar to the previous explanation, with these new elements:
Section |
Reason |
<0x00><0x04>
|
The number of elements in the array (four) being passed, expressed as two hex bytes with that value. |
<0x00><0x24>
|
The count of bytes (36, in decimal) to the end of the last byte of the last element of the T_Param2() array, not including these two size bytes. Represented as two hex bytes with this value. |
<0x00><0x00> |
Shows that there is a parameter of zero length in that position. The last NUL character is the last byte of the last element in the T_Param2() array. |
Length-Prefixed Stream Format using same data but with the fourth element of the Address not being sent. The alternative to the stream shown in Example 2C is to pass name-and-value information for each element. Note this can be used to only send specific elements, leaving other, non-specified, elements set to null.
<0x00><0x08>T_Param1<0x05>12345<0x00><0x0b>T_Param2(1)
<0x00><0x0d>1 Main Street<0x00><0x0b>T_Param2(2)<0x00><0x07>Anytown
<0x00><0x0b>T_Param2(3)<0x00><0x08>Anywhere
<0x00><0x08>T_Param3<0x00><0x0a>John Smith
Delimiter separated list stream format using the same data, with parameters using a comma as the delimiter (sParamFormat set to 'D,' in the p4ExecTask() call):
T_Param1=12345,T_Param2(1)=1 Main Street,T_Param2(2)=Anytown,T_Param2(3)=Anywhere,
T_Param3=John Smith
Another way of doing Example 2E. As the T_Param2() elements being passed are consecutive elements beginning with the first, you can use:
T_Param1=12345,T_Param2()=(1 Main Street,Anytown,Anywhere),T_Param3=John Smith
And the fourth element will be set to null.
Topic ID: 540054