1 /** @file
2   Mtftp6 option parse functions declaration.
3 
4   Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
5 
6   SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #ifndef __EFI_MTFTP6_OPTION_H__
11 #define __EFI_MTFTP6_OPTION_H__
12 
13 #include <Uefi.h>
14 
15 #include <Protocol/ServiceBinding.h>
16 
17 #include <Library/NetLib.h>
18 #include <Library/UdpIoLib.h>
19 #include <Library/BaseMemoryLib.h>
20 #include <Library/MemoryAllocationLib.h>
21 #include <Library/UefiRuntimeServicesTableLib.h>
22 
23 #define MTFTP6_SUPPORTED_OPTIONS_NUM  5
24 #define MTFTP6_OPCODE_LEN             2
25 #define MTFTP6_ERRCODE_LEN            2
26 #define MTFTP6_BLKNO_LEN              2
27 #define MTFTP6_DATA_HEAD_LEN          4
28 
29 //
30 // The bit map definition for Mtftp6 extension options.
31 //
32 #define MTFTP6_OPT_BLKSIZE_BIT        0x01
33 #define MTFTP6_OPT_TIMEOUT_BIT        0x02
34 #define MTFTP6_OPT_TSIZE_BIT          0x04
35 #define MTFTP6_OPT_MCAST_BIT          0x08
36 #define MTFTP6_OPT_WINDOWSIZE_BIT     0X10
37 
38 extern CHAR8 *mMtftp6SupportedOptions[MTFTP6_SUPPORTED_OPTIONS_NUM];
39 
40 typedef struct {
41   UINT16                    BlkSize;
42   UINT16                    WindowSize;
43   UINT8                     Timeout;
44   UINT32                    Tsize;
45   EFI_IPv6_ADDRESS          McastIp;
46   UINT16                    McastPort;
47   BOOLEAN                   IsMaster;
48   UINT32                    BitMap;
49 } MTFTP6_EXT_OPTION_INFO;
50 
51 /**
52   Parse the Ascii string of multi-cast option.
53 
54   @param[in]  Str           The pointer to the Ascii string of multi-cast option.
55   @param[in]  ExtInfo       The pointer to the option information to be filled.
56 
57   @retval EFI_SUCCESS            Parse the multicast option successfully.
58   @retval EFI_INVALID_PARAMETER  The string is malformatted.
59 
60 **/
61 EFI_STATUS
62 Mtftp6ParseMcastOption (
63   IN UINT8                  *Str,
64   IN MTFTP6_EXT_OPTION_INFO *ExtInfo
65   );
66 
67 
68 /**
69   Parse the MTFTP6 extension options.
70 
71   @param[in]  Options       The pointer to the extension options list.
72   @param[in]  Count         The num of the extension options.
73   @param[in]  IsRequest     If FALSE, the extension options is included
74                             by a request packet.
75   @param[in]  Operation     The current performed operation.
76   @param[in]  ExtInfo       The pointer to the option information to be filled.
77 
78   @retval EFI_SUCCESS            Parse the multicast option successfully.
79   @retval EFI_INVALID_PARAMETER  There is one option is malformatted at least.
80   @retval EFI_UNSUPPORTED        There is one option is not supported at least.
81 
82 **/
83 EFI_STATUS
84 Mtftp6ParseExtensionOption (
85   IN EFI_MTFTP6_OPTION        *Options,
86   IN UINT32                   Count,
87   IN BOOLEAN                  IsRequest,
88   IN UINT16                   Operation,
89   IN MTFTP6_EXT_OPTION_INFO   *ExtInfo
90   );
91 
92 
93 /**
94   Go through the packet to fill the options array with the start
95   addresses of each MTFTP option name/value pair.
96 
97   @param[in]      Packet                 The packet to be checked.
98   @param[in]      PacketLen              The length of the packet.
99   @param[in, out] Count                  The num of the Options on input.
100                                          The actual one on output.
101   @param[in]      Options                The option array to be filled
102                                          it's optional.
103 
104   @retval EFI_SUCCESS            The packet has been parsed successfully.
105   @retval EFI_INVALID_PARAMETER  The packet is malformatted
106   @retval EFI_BUFFER_TOO_SMALL   The Options array is too small
107   @retval EFI_PROTOCOL_ERROR     An unexpected MTFTPv6 packet was received.
108 
109 **/
110 EFI_STATUS
111 Mtftp6ParsePacketOption (
112   IN     EFI_MTFTP6_PACKET     *Packet,
113   IN     UINT32                PacketLen,
114   IN OUT UINT32                *Count,
115   IN     EFI_MTFTP6_OPTION     *Options          OPTIONAL
116   );
117 
118 
119 /**
120   Go through the packet, generate option list array and fill it
121   by the result of parse options.
122 
123   @param[in]      Packet                 The packet to be checked.
124   @param[in]      PacketLen              The length of the packet.
125   @param[in, out] OptionCount            The num of the Options on input.
126                                          The actual one on output.
127   @param[out]     OptionList             The option list array to be generated
128                                          and filled. It is optional.
129 
130   @retval EFI_SUCCESS            The packet has been parsed successfully.
131   @retval EFI_INVALID_PARAMETER  The packet is malformatted.
132   @retval EFI_PROTOCOL_ERROR     An option is malformatted.
133   @retval EFI_NOT_FOUND          The packet has no options.
134   @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory for the array.
135   @retval EFI_BUFFER_TOO_SMALL   The size of option list array is too small.
136 
137 **/
138 EFI_STATUS
139 Mtftp6ParseStart (
140   IN     EFI_MTFTP6_PACKET      *Packet,
141   IN     UINT32                 PacketLen,
142   IN OUT UINT32                 *OptionCount,
143      OUT EFI_MTFTP6_OPTION      **OptionList          OPTIONAL
144   );
145 
146 #endif
147