CN115866106B - 多网卡绑定的冗余网络通信系统数据处理方法 - Google Patents
多网卡绑定的冗余网络通信系统数据处理方法 Download PDFInfo
- Publication number
- CN115866106B CN115866106B CN202310138673.2A CN202310138673A CN115866106B CN 115866106 B CN115866106 B CN 115866106B CN 202310138673 A CN202310138673 A CN 202310138673A CN 115866106 B CN115866106 B CN 115866106B
- Authority
- CN
- China
- Prior art keywords
- message
- link
- address
- gateway
- network
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D30/00—Reducing energy consumption in communication networks
- Y02D30/50—Reducing energy consumption in communication networks in wire-line communication networks, e.g. low power modes or reduced link rate
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
多网卡绑定的冗余网络通信系统数据处理方法,针对多网卡绑定在广播模式下,系统接收报文存在重复报文的场景,在bonding驱动中增加接收报文去重模块,实时监测当前网络链路的接收报文,针对接收报文中的源IP地址建立链路表,根据网卡接收报文的时间戳来维护链路表状态并进行接收链路的选择,只接收值班链路进来的网络报文,备用链路收到的网络报文则直接丢弃。针对跨局域网的网络架构,发送报文目的MAC地址和对应链路上的网关地址不匹配的问题,根据指定的网关IP地址识别到网关回复的ARP报文,从这个报文中获取当前链路上网关的MAC地址,在发送报文时根据报文目的MAC地址识别到发送给网关的报文,并进行目的MAC地址的修正。
Description
技术领域
本发明涉及多网卡绑定的冗余网络通信系统数据处理方法,具体涉及多网卡绑定在广播模式,对接收报文进行去重处理及对发送报文目的MAC地址进行修正的冗余网络通信系统数据处理方法。
背景技术
在电力、能源和金融等安全关键行业,对网络传输的可靠性要求比较高,网络拓扑通常会采用冗余网络架构,并配合冗余网络协议(PRP、HSR)或者多网卡绑定的方式提供冗余网络通信。其中多网卡绑定是指将多个物理网卡绑定到同一个虚拟的网络接口上,使用同一个IP地址对外通信,并且可通过参数设置不同的绑定模式,在实际应用中比较广泛。
在Linux系统中由内核bonding模块提供多网卡绑定功能,可支持端口聚合、负载均衡、主备模式和广播模式等7种绑定模式,其中广播模式(broadcast)下发送端会将数据包复制成多份,分别从绑定的各个物理网卡发送出去,接收端也会将所有物理网卡上收到的数据包都接收进来。这种模式有较好的容错机制,当某一个网络链路上出现故障也不会丢包,而且不需要交换机额外的配置,比较适用于对网络可靠性要求比较高的场景。但是这种广播模式在实际应用中可能存在一些问题,在接收端从各个物理网卡上会收到重复的网络报文,而在bonding模块中并没有去除重复报文的处理,直接交给了上层协议栈处理。TCP协议对每一帧报文都进行了编号排序,在内核协议栈会去除重复报文,而对于UDP或者ICMP协议的报文,协议栈无法区分重复报文,继续往上送给应用程序处理,因此这种模式下应用程序会收到重复的报文,给报文接收处理带来一些问题。
另外针对跨局域网的冗余网络架构,链路中间需要配置网关进行报文转发。而有的网关MAC地址固定不可更改,因此不同链路上的网关MAC地址会不一致,但是在广播模式发送端只会复制完全一样的报文从不同的物理网卡上发送出去,导致发送报文的目的MAC地址和实际链路上的网关MAC地址不匹配,实际发送报文无法传输到对应网关。
因此针对多网卡绑定在广播模式下,需要解决接收端报文重复的问题,以及链路中有网关时发送报文目的MAC地址不匹配的问题。
中国发明专利“一种基于Linux系统的冗余以太网接口”(专利号CN205610658U)。该专利提出了一种包括以太网接口芯片、网卡底层驱动和bonding冗余处理模块的冗余以太网接口,仅针对bonding模块采用主备模式(active-backup)提供冗余功能,而且只有在子接口(slave)故障时才能切换到其他子接口上去,没有考虑复杂网络链路下的故障情况。
中国发明专利“一种并行冗余网络中的报文去重方法、系统及存储介质”专利号(CN113726486A)。该专利仅针对并行冗余网络协议(PRP)提出了一种报文去重方法,以及在网络抖动有乱序报文产生时的处理算法,该方法并未涉及在多网卡绑定在广播模式下的报文去重问题。
中国发明专利“一种网卡绑定状态下动态接收负载均衡的方法”(专利号CN101610283A)。该专利针对bonding模块采用负载均衡模式(Adaptive load balancing)的情况提出了网卡接收负载动态均衡的方法,在检测到网卡的接收流量不均衡时,通过向客户端发送arp reply包的方式令某些客户端更改其arp地址表,从而改变客户端到服务器每个网卡的流量分布。
中国发明专利“一种基于网卡绑定的提高链路稳定性的方法”(专利号CN114039907A)。该专利针对网卡绑定在主备模式下,对目标IP地址发送PING包,通过监测绑定网口的丢包率来执行主备链路的切换,从而提高网络链路的稳定性。
因此,目前现有的关于冗余网络系统数据处理方案中,并没有一种是专门针对多网卡绑定在广播模式下的接收报文重复问题以及发送报文目的MAC和网关不匹配问题。
发明内容
为解决已有技术存在的不足,本发明提供了一种多网卡绑定的冗余网络通信系统数据处理方法,通过在回调函数bond_handle_frame中增加处理逻辑实现对接收报文的去重处理,包括如下步骤:
步骤S1:从某个slave接口接收报文,判断接收报文的类型是否为IP类型的报文,如果不是则正常接收报文,如果是则进一步解析报文的IP头部获取源IP地址,根据这个源IP地址去查找当前已有的链路表中是否有记录这个IP地址;
步骤S2:如果有查找到这个IP地址,则以当前的系统时间更新链路表中与此IP地址和当前slave接口所对应的链路的时间戳,并根据此IP地址和当前slave接口所对应的链路的状态决定丢弃报文或者正常接收;
步骤S3:如果没有查找到这个IP地址,则新建一个针对此IP和当前slave接口所对应的链路表项,之后再查找链路表中其他slave接口是否有记录此IP地址,如果有且对应的时间戳未超时则将新建的链路状态置为备用链路并丢弃该报文,如果没有,或者尽管有但是其对应的时间戳已超时则将新建的链路设置为值班链路,报文正常接收。
其中,还通过在bond_handle_frame函数及bond_xmit_broadcast函数中增加相应的逻辑实现完成发送报文目的MAC地址的校正,解决发送报文目的MAC地址与对应链路网关MAC地址不匹配的问题。
其中,先配置链路网关MAC的IP地址,再在bond_handle_frame函数中增加的逻辑实现步骤,其逻辑实现步骤包括:
步骤S4:判断接收报文的类型是否为ARP包,否则正常接收报文,是则进一步解析报文中的源IP地址;
步骤S5:判断所解析的源IP地址与所配置的网关IP地址是否一致,如果不一致则正常接收报文,如果一致则从此报文的字段中获取到网关的MAC地址,并将所获取到的网关的MAC地址保存在列表gateway_list中;
步骤S6:针对所有所接收的报文,重复步骤S4-S5。
其中,bond_xmit_broadcast函数中增加的逻辑实现步骤包括:判断发送报文目的MAC是否在保存的gateway_list列表中,如果在列表中在复制报文后将报文的目的MAC地址替换为当前要发送此报文的slave接口所在链路对应的网关MAC地址,如果不在则直接将报文从相应的slave接口上发送出去。
本发明提供的多网卡绑定的冗余网络通信系统数据处理方法,可以有效解决在广播模式的接收报文重复的问题,实现底层网络冗余传输,上层应用无感知的优点。另外针对跨局域网的网络架构,本方法可以有效解决在广播模式下发送报文目的MAC地址和网关MAC地址不匹配的问题,拓展了多网卡绑定广播模式的应用场景。
附图说明
图1是本发明的基多网卡绑定在广播模式下的冗余网络系统拓扑图。
图2是本发明所述的基于Linux多网卡绑定在广播模式下的网络报文自动去重流程图。
图3是本发明的多网卡绑定在广播模式下发送报文目的MAC地址自动修正流程图中驱动收包函数实现逻辑过程。
图4是本发明的多网卡绑定在广播模式下发送报文目的MAC地址自动修正流程图中驱动发包函数实现逻辑过程。
具体实施方式
为了对本发明的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本发明的技术方案及其产生的有益效果。
本发明的技术任务是针对Linux系统多网卡绑定在广播模式下的接收报文重复问题,提供一种去除接收重复报文的解决方法。本发明进一步的技术任务是针对跨局域网的网络架构,多网卡绑定在广播模式下的发送报文目的MAC地址和对应链路网关的MAC地址不匹配问题,分别在bonding驱动的接收报文和发送报文处理逻辑上进行相应的修改,从而提供一种自动学习当前链路网关的MAC地址并修正发送报文的目的MAC地址的解决方法。
本发明的总体思路在于:针对多网卡绑定在广播模式下,系统接收报文存在重复报文的场景,在bonding驱动中增加接收报文去重模块,实时监测当前网络链路的接收报文,与本机通信的对端IP地址可能存在多个网络链路,针对接收报文中的源IP地址建立链路表,根据网卡接收报文的时间戳来维护链路表状态并进行接收链路的选择,即系统只接收值班链路进来的网络报文,备用链路收到的网络报文则直接丢弃,从而实现广播模式下的网络报文自动去重处理。
进一步针对跨局域网的网络架构,多网卡绑定在广播模式下的发送报文目的MAC地址和对应链路上的网关地址不匹配,网络报文无法正确传输到对应网关的场景,在bonding驱动中增加发送报文修正模块,根据指定的网关IP地址识别到网关回复的ARP报文,从这个报文中获取当前链路上网关的MAC地址,在处理发送报文时根据报文目的MAC地址识别到发送给网关的报文,并将对应报文的目的MAC地址修正为本链路实际网关的地址。
图1是本发明的基多网卡绑定在广播模式下的冗余网络系统拓扑图,如图1所示,本实例中服务器均配置多个网卡,且将其中两个网卡绑定在广播模式,分别将这两个网卡连接到对应的交换机上,组成两个冗余的网络A网和B网,上级和下级局域网之间通过独立的多条链路相连,且链路中间分别配置有网关。
本发明下文中所提到的“链路表”中涉及到多个链路表项,每个链路表项对应一个链路,每个链路表项涉及到的字段内容如下表:
上表中,以报文从上向下传递为例,最上层的四个服务器每个对应一个源IP地址,每个服务器可通过绑定的多个slave接口进行网络报文发送和接收,对于接收报文的服务器而言,源IP地址和slave接口确定后,相应的链路确定,也即,一个IP地址可能对应多个链路。
图2是本发明的多网卡绑定在广播模式下的网络报文自动去重流程图:Linux系统bonding驱动给每个绑定的子网络接口(slave)上注册了rx_handler回调函数bond_handle_frame,slave接口收到的报文都需要先经过此回调函数的处理再转给虚拟的主网络接口(master)。本发明的报文去重方法即在bond_handle_frame函数中增加对应的逻辑处理实现。本方法针对每个与本机通信的对端IP地址建立对应的链路表项,链路表项记录对端IP地址(即报文中的源IP地址)、接收报文的slave接口、链路状态和对应的时间戳,而本机可以从不同的slave接口(对应不同的网络链路)上接收到同一个IP地址发来的报文,即同一个IP地址可能会存在多个链路表项,因此本方法选定其中一个作为值班链路,其余的作为备用链路。具体的,在从某个slave接口接收报文进来时,先判断接收报文的类型是否为IP类型的报文,如果不是则正常接收报文,如果是则进一步解析报文的IP头部获取源IP地址,根据这个源IP地址去查找当前已有的链路表中是否有记录这个IP地址。
如果有查找到这个IP地址,则以当前的系统时间更新链路表中与此IP地址和当前slave接口所对应的链路的时间戳,并根据此链路的状态决定丢弃报文或者正常接收,具体的,判断链路的状态是否属于值班链路,如果属于则正常接收报文,如果不属于则丢弃报文。
如果没有则新建一个针对此IP和接收此报文的slave接口所对应的链路表项,之后再查找链路表中其他slave接口(在图2实施例中每个IP地址对应两个slave接口)是否有记录此IP地址,如果有且时间戳未超时则将新建的链路状态置为备用链路并丢弃该报文,如果没有,或者尽管有但是其对应的时间戳已超时则将新建的链路设置为值班链路,报文正常接收。
另外再增加一个定时任务,周期去遍历链路表中所有记录的IP地址所对应的链路状态(包括该IP地址下的值班链路和备用链路),如果某个IP的值班链路的时间戳超时了,而此IP对应的备用链路时间戳未超时,则将此IP的值班链路切换到备用链路上来。
在本实施例中,发送和接收端的IP均只对应两条链路A和B,在A链路为值班链路但时间戳超,而B链路时间戳未超时时,可将A链路及B链路的状态对换。
当然,在实际使用时,也可设置多条:假设有A、B、C、D四条链路,A链路是值班链路,其它三条链路是备用链路,如果A链路超时了,其它三条链路都未超时,可以把A链路变成备用链路,B链路、C链路及D链路中可选时间戳最近链路的作为值班链路。图3是本发明的多网卡绑定在广播模式下发送报文目的MAC地址自动修正流程图。
如图3所示,bonding驱动通过在系统下注册sysfs接口的方式提供参数配置,用户需要先将对应网关的IP地址配置到此接口中,之后再识别网关回复的ARP报文并学习当前链路上网关的MAC地址。网关MAC地址学习也是在bond_handle_frame函数中增加逻辑处理来实现,首先判断接收报文的类型是否为ARP包,否则正常接收报文,是则进一步解析报文中的源IP地址,并判断此IP地址和上一步骤中所配置的网关IP地址是否一致,如果一致则说明是网关回复的ARP报文,则进一步从此报文的字段中获取到网关的MAC地址,并将从各个链路上获取的网关MAC地址保存在列表(gateway_list)中,如果不一致则正常接收报文。
如图4所示,bonding驱动在广播模式下的报文发送是通过调用bond_xmit_broadcast函数,在每个slave接口上复制一份,并将复制的报文从对应的slave接口发送出去,因此,修正发送给网关的报文目的MAC地址是在bond_xmit_broadcast函数中增加对应的逻辑处理实现,首先判断发送报文目的MAC是否在上一步骤中保存的gateway_list列表中,如果在列表中说明是发送给网关的报文,则进一步在复制报文后将报文的目的MAC地址替换为当前要发送此报文的slave接口所在链路对应的网关MAC地址(即图1中A网或B网上相应网络链路所对应的网关MAC地址),实现对发送报文目的MAC地址修正,如果不在则直接将报文从绑定的网络子接口上发送出去。
本发明基于Linux系统多网卡绑定的冗余网络通信系统数据处理方法,在多网卡绑定在广播模式下接收报文时根据报文的源IP地址建立链路表,根据报文时间戳来更新和切换链路状态,进一步根据当前链路状态判断是否丢弃或者接收报文。在对发送报文目的MAC地址进行修正时,首先根据网关IP地址学习到网关的MAC地址,再对发送给网关的报文目的MAC地址进行修正。
本发明通过在bonding驱动中应用本发明提出的数据处理方法,可以有效解决在广播模式的接收报文重复的问题,实现底层网络冗余传输,上层应用无感知的优点。另外针对跨局域网的网络架构,本方法可以有效解决在广播模式下发送报文目的MAC地址和网关MAC地址不匹配的问题,拓展了多网卡绑定广播模式的应用场景。
虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。
Claims (2)
1.多网卡绑定的冗余网络通信系统数据处理方法,其特征在于:通过在回调函数bond_handle_frame中增加处理逻辑实现对接收报文的去重处理,包括如下步骤:
步骤S1:从某个slave接口接收报文,判断接收报文的类型是否为IP类型的报文,如果不是则正常接收报文,如果是则进一步解析报文的IP头部获取源IP地址,根据这个源IP地址去查找当前已有的链路表中是否有记录这个IP地址;
步骤S2:如果有查找到这个IP地址,则以当前的系统时间更新链路表中与此IP地址和当前slave接口所对应的链路的时间戳,并根据此IP地址和当前slave接口所对应的链路的状态决定丢弃报文或者正常接收;
步骤S3:如果没有查找到这个IP地址,则新建一个针对此IP和当前slave接口所对应的链路表项,之后再查找链路表中其他slave接口是否有记录此IP地址,如果有且对应的时间戳未超时则将新建的链路状态置为备用链路并丢弃该报文,如果没有,或者尽管有但是其对应的时间戳已超时则将新建的链路设置为值班链路,报文正常接收。
2.如权利要求1所述的多网卡绑定的冗余网络通信系统数据处理方法,其特征在于:还通过在bond_handle_frame函数及bond_xmit_broadcast函数中增加相应的逻辑实现完成发送报文目的MAC地址的校正,解决发送报文目的MAC地址与对应链路网关MAC地址不匹配的问题;
先配置链路网关MAC的IP地址,再在bond_handle_frame函数中增加的逻辑实现步骤,其逻辑实现步骤包括:
步骤S4:判断接收报文的类型是否为ARP包,否则正常接收报文,是则进一步解析报文中的源IP地址;
步骤S5:判断所解析的源IP地址与所配置的网关IP地址是否一致,如果不一致则正常接收报文,如果一致则从此报文的字段中获取到网关的MAC地址,并将所获取到的网关的MAC地址保存在列表gateway_list中;
步骤S6:针对所有所接收的报文,重复步骤S4-S5;
bond_xmit_broadcast函数中增加的逻辑实现步骤包括:判断发送报文目的MAC是否在保存的gateway_list列表中,如果在列表中在复制报文后将报文的目的MAC地址替换为当前要发送此报文的slave接口所在链路对应的网关MAC地址,如果不在则直接将报文从相应的slave接口上发送出去。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310138673.2A CN115866106B (zh) | 2023-02-21 | 2023-02-21 | 多网卡绑定的冗余网络通信系统数据处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310138673.2A CN115866106B (zh) | 2023-02-21 | 2023-02-21 | 多网卡绑定的冗余网络通信系统数据处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115866106A CN115866106A (zh) | 2023-03-28 |
CN115866106B true CN115866106B (zh) | 2023-06-02 |
Family
ID=85658449
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310138673.2A Active CN115866106B (zh) | 2023-02-21 | 2023-02-21 | 多网卡绑定的冗余网络通信系统数据处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115866106B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116170391A (zh) * | 2023-04-23 | 2023-05-26 | 北京凝思软件股份有限公司 | 基于冗余方式实现网络高可用的方法、系统、介质和设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101404568A (zh) * | 2008-11-17 | 2009-04-08 | 国电南瑞科技股份有限公司 | 双网卡热备冗余方法 |
CN105790902A (zh) * | 2014-12-22 | 2016-07-20 | 研祥智能科技股份有限公司 | 冗余网卡切换的实现方法和系统 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106936655A (zh) * | 2015-12-30 | 2017-07-07 | 阿里巴巴集团控股有限公司 | 链路检测方法、装置及网络设备、控制器 |
CN108259271A (zh) * | 2018-02-01 | 2018-07-06 | 天津天地伟业信息系统集成有限公司 | 一种多网卡绑定后通过arp检测链路状态的方法 |
CN112769905B (zh) * | 2020-12-25 | 2023-03-31 | 麒麟软件有限公司 | 一种基于numa架构的飞腾平台下高性能网卡性能优化方法 |
CN115314388B (zh) * | 2022-08-03 | 2023-11-21 | 中国船舶集团有限公司第七一六研究所 | 一种基于Bond机制的PRP协议实现方法 |
-
2023
- 2023-02-21 CN CN202310138673.2A patent/CN115866106B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101404568A (zh) * | 2008-11-17 | 2009-04-08 | 国电南瑞科技股份有限公司 | 双网卡热备冗余方法 |
CN105790902A (zh) * | 2014-12-22 | 2016-07-20 | 研祥智能科技股份有限公司 | 冗余网卡切换的实现方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN115866106A (zh) | 2023-03-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP7358538B2 (ja) | パケットを転送するための方法およびネットワークデバイス | |
EP2109962B1 (en) | Triple-tier anycast addressing | |
US10887119B2 (en) | Multicasting within distributed control plane of a switch | |
US6163543A (en) | Port aggregation protocol | |
US7590756B2 (en) | Method and system for transferring data in a communications network using redundant communication paths | |
CN101557317B (zh) | 双机热备组网中实现会话主动备份的系统、设备及方法 | |
EP2369782B1 (en) | Multicasting within a distributed control plane of a switch | |
EP2252013A1 (en) | Method and apparatus for maintaining port state tables in a forwarding plane of a network element | |
EP2252014A1 (en) | Method and apparatus for providing fast reroute of a unicast packet within a network element to an available port associated with a multi-link trunk | |
US8861338B2 (en) | Routed split multilink trunking for IPv6 | |
US10382329B1 (en) | Source MAC access controls in a virtual redundant router protocol environment | |
CN110944068B (zh) | 从重复网络地址自动恢复的方法、网络设备及其存储介质 | |
CN115866106B (zh) | 多网卡绑定的冗余网络通信系统数据处理方法 | |
US9401865B2 (en) | Network appliance redundancy system, control apparatus, network appliance redundancy method and program | |
EP2252016A1 (en) | Method and apparatus for locally implementing port selection via synchronized port state databases maintained by the forwarding plane of a network element | |
Rahman et al. | Performance Evaluation of First Hop Redundancy Protocols | |
US8432789B2 (en) | Split multi-link trunking (SMLT) hold-down timer for internet protocol (IP) multicast | |
JP4633723B2 (ja) | ネットワークシステム、送信側スイッチ装置、受信側スイッチ装置および両用スイッチ装置 | |
CN114666269A (zh) | 一种基于ip子网的vlan的报文转发方法、装置、设备及介质 | |
CN116614436A (zh) | 一种流量转发方法、装置、系统及主备交换机 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |