CN112732226B - 一种sdn网络编程方法、装置以及可读计算机存储介质 - Google Patents
一种sdn网络编程方法、装置以及可读计算机存储介质 Download PDFInfo
- Publication number
- CN112732226B CN112732226B CN202011589082.XA CN202011589082A CN112732226B CN 112732226 B CN112732226 B CN 112732226B CN 202011589082 A CN202011589082 A CN 202011589082A CN 112732226 B CN112732226 B CN 112732226B
- Authority
- CN
- China
- Prior art keywords
- function module
- network function
- network
- module
- sdn
- 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
- 238000000034 method Methods 0.000 title claims abstract description 39
- 238000004590 computer program Methods 0.000 claims 2
- 230000000153 supplemental effect Effects 0.000 claims 2
- 230000006870 function Effects 0.000 description 99
- 230000008569 process Effects 0.000 description 7
- 238000010586 diagram Methods 0.000 description 5
- 230000009471 action Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 101001121408 Homo sapiens L-amino-acid oxidase Proteins 0.000 description 1
- 102100026388 L-amino-acid oxidase Human genes 0.000 description 1
- 101100012902 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) FIG2 gene Proteins 0.000 description 1
- 101100233916 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) KAR5 gene Proteins 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000006855 networking Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种SDN网络编程方法、装置以及可读计算机存储介质,其中,SDN网络编程方法包括:确定网络功能模块的细粒度;确定第一网络功能模块与第二网络功能模块是否符合连接关系,若符合,则第一网络功能模块与第二网络功能模块连接;所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针;该SDN网络编程方法将网络应用抽象成多个模块组合方式来完成,模块与模块间的组合方式通过模块内置的查找表来指定,以此通过动态修改查找表的内容,来灵活选择下一个处理数据包的模块,从而支持网络应用的在线更新,避免业务流的中断。
Description
技术领域
本发明涉及软件定义网络技术领域,特别涉及一种SDN网络编程方法、装置以及可读计算机存储介质。
背景技术
网络已经成为现代社会的基础设施。传统网络将控制逻辑固化于分布式的网络设备之中,控制管理困难、设备臃肿僵化。软件定义网络(SDN)采用了数据平面与控制平面相分离的开放式系统架构,将底层网络设备进行统一抽象,以match+action流水线的形式进行数据包的处理。远程控制器则通过统一的南向编程接口(如OpenFlow)来控制、管理整个网络。
然而,早期的SDN网络应用主要是基于开源控制器NOX/POX上进行开发部署,而NOX与POX对外提供的编程接口相对比较底层,其编程过程类似于直接对网络设备上的流表进行操作。因此,网络开发人员在进行SDN网络应用开发的同时往往需要兼顾应用的控制逻辑和对底层设备流表的操作,这无疑对整个开发过程带来了极大的困难与挑战,因此,SDN网络编程并不简单。
为了降低SDN网络编程的复杂性,普林斯顿大学Jennifer Rexford等教授利用模块化的思想提出了SDN组合编程方法与编程框架,该框架将细粒度、功能相对独立的网络功能独立成单独的模块,并通过定义不同的“组合算子”将网络功能模块进行逻辑串接,从而构建功能相对更为复杂的网络应用,最后网络应用会编译成match+action的规则部署到底层网络设备。而所谓的“组合算子”描述了不同功能模块之间的逻辑关系,主要为二目运算符,包括并行、串行及重载三种算子。其中,并行算子保证两个网络功能模块可并行地处理网络数据包;串行算子使得网络数据包被前一个网络功能模块处理,然后再被后一个模块处理,因此前一个模块对数据包的操作会直接影响后一个模块对数据包的处理;重载算子保证数据包在无法被前一个网络功能模块处理时,就会让后一个模块进行处理,否则直接跳过后一个模块。
SDN的模块化编程框架极大降低了网络编程的难度,同时加速了网络应用的创新与部署周期。
在现有技术中,网络功能模块之间的逻辑关系(有向边)在网络编程系统框架启动前就已经通过配置文件固化确定,在运行过程中无法更改。这即是说网络应用所对应的数据转发流图的形状在运行过程中无法改动。因此,这直接导致了单个复杂网络应用无法进行在线修改或者升级(即动态改变转发流图)。
发明内容
为了解决上述问题,本发明提供一种支持网络应用的在线更新,避免业务流的中断的SDN网络编程方法以及装置。
为了实现上述目的,本发明一方面提供一种SDN网络编程方法,包括:
确定网络功能模块的细粒度;其中所述网络功能模块包括至少一个输入槽位和至少一个输出槽位;
确定第一网络功能模块与第二网络功能模块是否符合连接关系,若符合,则第一网络功能模块与第二网络功能模块连接,否则拒绝连接;;
所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;
所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针。
可选的,所述确定网络功能模块的细粒度,进一步包括:
将网络接口实例化为两个功能模块;
将协议层的协议实例化为一个或者多个功能模块;
将补充功能实例化为一个或者多个功能模块。
可选的,所述网络接口包括物理接口和虚拟接口。
可选的,所述网络功能模块的输入槽位和输出槽位的数量在所述网络功能模块初始化时确定。
可选的,所述输出槽位和输入槽位用于填充指向对端网络功能模块和对端端口。
可选的,在所述的第一网络功能模块与第一网络功能模块连接,之前还包括:判断所述第一网络功能模块与第一网络功能模块对应的输入槽位和输出槽位是否为空,若有其中一个不为空,则拒绝连接。
可选的,确定第一网络功能模块与第二网络功能模块是否符合连接关系,进一步包括:根据第一网络功能模块自生的判断逻辑确定下一出口是否为第二网络功能模块或者通过控制面下发的路由表项确定下一出口是否为第二网络功能模块。
另一方面,本发明还提供一种SDN网络编程装置,包括:
第一确定单元,用于确定网络功能模块的细粒度;其中所述网络功能模块包括至少一个输入槽位和至少一个输出槽位;
第二确定单元,用于确定第一网络功能模块与第二网络功能模块是否符合连接关系;
第一记录单元,用于所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;
第二记录单元,用于所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针。
在上述SDN网络编程装置中,可选的,所述第一确定单元包括:
第一实例化模块,用于将网络接口实例化为两个功能模块;
第二实例化模块,用于将协议层的协议实例化为一个或者多个功能模块;
第三实例化模块,用于将补充功能实例化为一个或者多个功能模块。
在上述SDN网络编程装置中,可选的,所述网络接口包括物理接口和虚拟接口。
本发明相对于现有技术的有益效果是:SDN网络应用被抽象成不同功能模块按照一定的串联方式组合而成,单个功能模块完成数据包的处理后需要根据组合逻辑选择后续的功能模块来继续处理数据包。本发明对于数据包后续模块的选择采用了查表的方式来进行,即根据查表的结果选择后续的功能模块,通过调用该模块的指针从而继续进行数据包的处理。模块中的表的内容可以通过开放的接口被远程控制器进行实时修改,从而支持网络应用的在线更新,避免业务流的中断。
附图说明
图1是本发明中一种SDN网络编程方法的流程图;
图2是IPv6的功能模块转发图;
图3是连接器的示意图;
图4是连接器的全局配置;
图5是本发明中一种SDN网络编程装置的结构图;
图6是本发明中第一确定单元的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参照图1,本实施例提供一种SDN网络编程方法,包括以下步骤:
S10:确定网络功能模块的细粒度;其中所述网络功能模块包括至少一个输入槽位和至少一个输出槽位;
作为一个独立的操作和逻辑处理过程,网络功能模块大小的划分对整个转发有向图的拓扑结构和实现方式有着十分明显的影响。网络功能模块粒度划分的越大,内部包含的操作数目和逻辑过程也就越多,其灵活性与可编程性也就越差。而功能模块越小,则影响系统的性能。
本实施例的模块划分规则如下:每一个网络接口(物理的或者虚拟的)实例化两个网络功能模块Interface-Input和Interface Output;二层、三层、四层相关的协议,每个协议都实例化一个或者多个功能模块,如Ethernet-Input、IPv4、IPv6、ARP、ICMP和ICMP6等;三层转发标准之外的补充功能也实例化为单个或者多个功能模块,如IOAM、NAT64等。一个典型的IPv6的功能模块转发图如图2所示。该转发系统有3个dpdk驱动的物理接口,每个接口有两个功能模块与其对应dpdk-input和dpdk-output,其实现用户态的网卡读取和发送驱动。Dpdk-input连接的是ethernet-input,主要完成MAC检查,VLAN处理等功能。Ethernet-input下一跳是ip6-forward,这个是实现IP6协议的三层功能模块,功能有单播与多播检测、路由查找、更新二、三层头部的功能,接着ip6-forward有三个出口,分别连接到每个物理接口的dpdk-ouput。
S20:确定第一网络功能模块与第二网络功能模块是否符合连接关系,若符合,则第一网络功能模块与第二网络功能模块连接;
逻辑上讲,一个网络功能模块可定义为多个输入/输出端口的逻辑处理块。两个网络功能模块的连接被视为输入与输出端口之间的连接。原则上,哪个输入端口连接到哪个输入端口是不受限制的,但这可能出现不符合处理逻辑的情况出现。因此需要一个指导性模板,告诉操作者,该网络功能模块的每个输入/输出端口代表什么含义以及可以连接的对端的输出/输入端口是什么。前者由网络功能模块开发者负责解释,后者则由模板编写者根据已有网络知识,进行约束声明。
当某个网络功能模块执行针对该数据包的所有操作后,会进入到路径决策阶段,即确定下一个模块是谁。该决策可以根据两方面决定:第一个方面是网络功能模块自身的判断逻辑,网络功能模块根据数据包的信息和自身逻辑,就能判断下一出口是哪个,如根据二层报头Type字段,直接确定出口。第二个方面是功能模块通过外部的辅助策略才能进行完整的路径决策行为,即需要通过控制面下发的路由表项,才能决定使用该网络功能模块的哪个出口。
S30:所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;
S40:所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针。
网络功能模块的某一类型的接口可定义为一个连接器,连接器上面有许多空槽,可以填充指向对端功能模块和对端端口。连接器的槽数在功能模块初始化时确定。如图3所示,在本实施中,第一网络功能模块和第二网络功能模块的连接操作流程是:第一网络功能模块的输出选择某一个空闲的槽位,记录下后功能模块的对象指针和对应的输出槽位,即<Next_FB,In_Slot>二元组。而第二网络功能模块的输入槽位同样记录下第一网络功能模块的<Prev_FB,Out_Slot>二元组。所以在连接之前,必须判断两个连接器对应的槽位是否为空,如果有一个不为空,则拒绝连接。
如图4所示,当第一网络功能模块确定与第二网络功能模块连接时,即第一网络功能模块的输出端口确定好,第一网络功能模块便从对应的输出槽位找到指向第二网络功能模块和入端口对应的二元组,调用第二网络功能模块的数据包处理函数,而指向数据包的指针和入端口都作为处理函数的参数传进去。
如图5所示,本实施例还提供一种SDN网络编程装置,包括:
第一确定单元100,用于确定网络功能模块的细粒度;其中所述网络功能模块包括至少一个输入槽位和至少一个输出槽位;具体的确定方法在上述SDN网络编程方法的步骤S10中已经详细阐述,故在此就不再赘述。
第二确定单元200,用于确定第一网络功能模块与第二网络功能模块是否符合连接关系;具体的确定方法在上述SDN网络编程方法的步骤S20中已经详细阐述,故在此就不再赘述。
第一记录单元300,用于所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;具体的确定方法在上述SDN网络编程方法的步骤S30中已经详细阐述,故在此就不再赘述。
第二记录单元400,用于所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针;具体的记录方法在上述SDN网络编程方法的步骤S40中已经详细阐述,故在此就不再赘述。
另外,如图6所示,第一确定单元100包括:
第一实例化模块101,用于将网络接口实例化为两个功能模块;
第二实例化模块102,用于将协议层的协议实例化为一个或者多个功能模块;
第三实例化模块103,用于将补充功能实例化为一个或者多个功能模块。
另外,本发明实施例还提供一种计算机可读存储介质,其中,该计算机可读存储介质可存储有程序,该程序执行时包括上述方法实施例中记载的任何一种SDN网络编程方法的部分或全部步骤。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储器包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储器中,存储器可以包括:闪存盘、只读存储器(英文:Read-Only Memory,简称:ROM)、随机存取器(英文:Random Access Memory,简称:RAM)、磁盘或光盘等。
以上参照附图描述了根据本发明的实施例的用于实现服务链的方法的示例性流程图。应指出的是,以上描述中包括的大量细节仅是对本发明的示例性说明,而不是对本发明的限制。在本发明的其他实施例中,该方法可具有更多、更少或不同的步骤,且各步骤之间的顺序、包含、功能等关系可以与所描述和图示的不同。
Claims (9)
1.一种SDN网络编程方法,其特征在于,包括:
确定网络功能模块的细粒度;其中所述网络功能模块包括至少一个输入槽位和至少一个输出槽位;所述确定网络功能模块的细粒度,包括:将网络接口实例化为两个功能模块;
将协议层的协议实例化为一个或者多个功能模块;将补充功能实例化为一个或者多个功能模块;
确定第一网络功能模块与第二网络功能模块是否符合连接关系,若符合,则第一网络功能模块与第二网络功能模块连接,否则拒绝连接;
所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;
所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针。
2.根据权利要求1所述的SDN网络编程方法,其特征在于:所述网络接口包括物理接口和虚拟接口。
3.根据权利要求1所述的SDN网络编程方法,其特征在于:所述网络功能模块的输入槽位和输出槽位的数量在所述网络功能模块初始化时确定。
4.根据权利要求1所述的SDN网络编程方法,其特征在于:所述输出槽位和输入槽位用于填充指向对端网络功能模块和对端端口。
5.根据权利要求1所述的SDN网络编程方法,其特征在于,在所述的第一网络功能模块与第一网络功能模块连接,之前还包括:判断所述第一网络功能模块与第一网络功能模块对应的输入槽位和输出槽位是否为空,若有其中一个不为空,则拒绝连接。
6.根据权利要求1所述的SDN网络编程方法,其特征在于,确定第一网络功能模块与第二网络功能模块是否符合连接关系,进一步包括:根据第一网络功能模块自生的判断逻辑确定下一出口是否为第二网络功能模块或者通过控制面下发的路由表项确定下一出口是否为第二网络功能模块。
7.一种SDN网络编程装置,其特征在于,包括:
第一确定单元,用于确定网络功能模块的细粒度;其中所述网络功能模块包括至少一个输入槽位和至少一个输出槽位;所述第一确定单元包括:第一实例化模块,用于将网络接口实例化为两个功能模块;第二实例化模块,用于将协议层的协议实例化为一个或者多个功能模块;第三实例化模块,用于将补充功能实例化为一个或者多个功能模块;
第二确定单元,用于确定第一网络功能模块与第二网络功能模块是否符合连接关系;
第一记录单元,用于所述第一网络功能模块的输出槽位记录所述第二网络功能模块的输入槽位和对象指针;
第二记录单元,用于所述第二网络功能模块的输入槽位记录所述第一网络功能模块的输出槽位和对象指针。
8.根据权利要求7所述的SDN网络编程装置,其特征在于:所述网络接口包括物理接口和虚拟接口。
9.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述的一种SDN网络编程方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011589082.XA CN112732226B (zh) | 2020-12-29 | 2020-12-29 | 一种sdn网络编程方法、装置以及可读计算机存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011589082.XA CN112732226B (zh) | 2020-12-29 | 2020-12-29 | 一种sdn网络编程方法、装置以及可读计算机存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112732226A CN112732226A (zh) | 2021-04-30 |
CN112732226B true CN112732226B (zh) | 2024-07-02 |
Family
ID=75607092
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011589082.XA Active CN112732226B (zh) | 2020-12-29 | 2020-12-29 | 一种sdn网络编程方法、装置以及可读计算机存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112732226B (zh) |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111130910A (zh) * | 2019-12-31 | 2020-05-08 | 上海上实龙创智慧能源科技股份有限公司 | 一种应用于物联网平台的sdn控制器 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9450870B2 (en) * | 2011-11-10 | 2016-09-20 | Brocade Communications Systems, Inc. | System and method for flow management in software-defined networks |
US9419895B2 (en) * | 2013-02-25 | 2016-08-16 | Brocade Communications Systems, Inc. | Techniques for customizing forwarding decisions via a hardware lookup result |
CN104967533B (zh) * | 2015-05-26 | 2018-10-23 | 国网智能电网研究院 | 一种sdn控制器上增加iec 61850配置接口的方法和装置 |
-
2020
- 2020-12-29 CN CN202011589082.XA patent/CN112732226B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111130910A (zh) * | 2019-12-31 | 2020-05-08 | 上海上实龙创智慧能源科技股份有限公司 | 一种应用于物联网平台的sdn控制器 |
Also Published As
Publication number | Publication date |
---|---|
CN112732226A (zh) | 2021-04-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101303718B1 (ko) | 가상 머신 네트워킹을 위한 방법 및 시스템 | |
CN107222353B (zh) | 支持协议无关的软件定义网络虚拟化管理平台 | |
US9413645B1 (en) | Methods and apparatus for accessing route information in a distributed switch | |
CN104618244B (zh) | 一种sdn网络与传统ip网络互通的方法及系统 | |
CN111654493B (zh) | Openstack中拦截指定流量的方法、系统、存储介质及电子设备 | |
CN105407140B (zh) | 一种网络化测试系统的计算资源虚拟化方法 | |
US20080256455A1 (en) | Method for Defining the Physical Configuration of a Communication System | |
CN112671578B (zh) | 一种sriov虚拟化网络配置方法及相关装置 | |
US12131149B1 (en) | Updating method for programmable data plane at runtime, and apparatus | |
CN112166579B (zh) | 提供虚拟化网络功能的多服务器架构集群 | |
US20190199622A1 (en) | Data packet forwarding unit in a data transmission network | |
CN108965000B (zh) | 一种私有云sdn引流实现方法 | |
Moro et al. | Network function decomposition and offloading on heterogeneous networks with programmable data planes | |
CN108886493B (zh) | 一种具有可插拔流管理协议的基于拓扑结构的虚拟交换模型 | |
Abranches et al. | Getting back what was lost in the era of high-speed software packet processing | |
CN112732226B (zh) | 一种sdn网络编程方法、装置以及可读计算机存储介质 | |
EP1293067B1 (en) | Multiprotocol handling arrangement | |
CN113708965B (zh) | 一种高性能构件化的数据包处理系统 | |
CN114079634B (zh) | 一种报文转发方法、装置及计算机可读存储介质 | |
CN107294746B (zh) | 一种部署业务的方法及设备 | |
WO2020029928A1 (zh) | Bgp会话建立、发送接口地址和别名的方法及网络设备 | |
JP2023078080A (ja) | 定義可能なメッセージ負荷暗号化をサポートするデータプレーンのプログラム可能な実現方法 | |
CN108886476A (zh) | 虚拟交换机数据平面和数据平面迁移的多个提供器框架 | |
Talhar et al. | An adaptive approach for controller placement problem in software defined networks | |
Khater et al. | An NFV-Based Framework for Autonomous Deployment of New Protocols in SDN Networks |
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 | ||
CP03 | Change of name, title or address | ||
CP03 | Change of name, title or address |
Address after: No. 9 Mozhou East Road, Nanjing City, Jiangsu Province, 211111 Patentee after: Zijinshan Laboratory Country or region after: China Address before: No. 9 Mozhou East Road, Jiangning Economic Development Zone, Jiangning District, Nanjing City, Jiangsu Province Patentee before: Purple Mountain Laboratories Country or region before: China |