172ec7a67SSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause 2*25d0ae62SJun Yang * Copyright 2018-2023 NXP 372ec7a67SSunil Kumar Kori */ 472ec7a67SSunil Kumar Kori 572ec7a67SSunil Kumar Kori #include <rte_mbuf.h> 672ec7a67SSunil Kumar Kori #include <rte_ethdev.h> 772ec7a67SSunil Kumar Kori #include <rte_malloc.h> 872ec7a67SSunil Kumar Kori #include <rte_memcpy.h> 972ec7a67SSunil Kumar Kori #include <rte_string_fns.h> 101acb7f54SDavid Marchand #include <dev_driver.h> 1172ec7a67SSunil Kumar Kori 1272ec7a67SSunil Kumar Kori #include <fslmc_logs.h> 1372ec7a67SSunil Kumar Kori #include <fslmc_vfio.h> 1472ec7a67SSunil Kumar Kori #include <dpaa2_hw_pvt.h> 1572ec7a67SSunil Kumar Kori #include <dpaa2_hw_dpio.h> 1672ec7a67SSunil Kumar Kori #include <dpaa2_hw_mempool.h> 1772ec7a67SSunil Kumar Kori #include <dpaa2_pmd_logs.h> 1872ec7a67SSunil Kumar Kori 1972ec7a67SSunil Kumar Kori #include "dpaa2_ethdev.h" 2072ec7a67SSunil Kumar Kori #include "dpaa2_sparser.h" 2172ec7a67SSunil Kumar Kori #include "base/dpaa2_hw_dpni_annot.h" 2272ec7a67SSunil Kumar Kori #define __STDC_FORMAT_MACROS 2372ec7a67SSunil Kumar Kori #include <stdint.h> 2472ec7a67SSunil Kumar Kori #include <inttypes.h> 2572ec7a67SSunil Kumar Kori 2672ec7a67SSunil Kumar Kori uint8_t wriop_bytecode[] = { 2772ec7a67SSunil Kumar Kori 0x00, 0x04, 0x29, 0x42, 0x03, 0xe0, 0x12, 0x00, 0x29, 0x02, 2872ec7a67SSunil Kumar Kori 0x18, 0x00, 0x87, 0x3c, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00 2972ec7a67SSunil Kumar Kori }; 3072ec7a67SSunil Kumar Kori 3172ec7a67SSunil Kumar Kori struct frame_attr frame_attr_arr[] = { 3272ec7a67SSunil Kumar Kori /* Frame Attribute Flags 1 */ 3372ec7a67SSunil Kumar Kori /* 000 */ {"Routing header present in IPv6 header 2 ", 0, 0x80000000}, 3472ec7a67SSunil Kumar Kori /* 001 */ {"GTP Primed was detected ", 0, 0x40000000}, 3572ec7a67SSunil Kumar Kori /* 002 */ {"VLAN with VID = 0 was detected ", 0, 0x20000000}, 3672ec7a67SSunil Kumar Kori /* 003 */ {"A PTP frame was detected ", 0, 0x10000000}, 3772ec7a67SSunil Kumar Kori /* 004 */ {"VXLAN was parsed ", 0, 0x08000000}, 3872ec7a67SSunil Kumar Kori /* 005 */ {"A VXLAN HXS parsing error was detected ", 0, 0x04000000}, 3972ec7a67SSunil Kumar Kori /* 006 */ {"Ethernet control protocol was detected ", 0, 0x02000000}, 4072ec7a67SSunil Kumar Kori /* 007 */ {"IKE was detected at UDP port 4500 ", 0, 0x01000000}, 4172ec7a67SSunil Kumar Kori /* 008 */ {"Shim Shell Soft Parsing Error ", 0, 0x00800000}, 4272ec7a67SSunil Kumar Kori /* 009 */ {"Parsing Error ", 0, 0x00400000}, 4372ec7a67SSunil Kumar Kori /* 010 */ {"Ethernet MAC Present ", 0, 0x00200000}, 4472ec7a67SSunil Kumar Kori /* 011 */ {"Ethernet Unicast ", 0, 0x00100000}, 4572ec7a67SSunil Kumar Kori /* 012 */ {"Ethernet Multicast ", 0, 0x00080000}, 4672ec7a67SSunil Kumar Kori /* 013 */ {"Ethernet Broadcast ", 0, 0x00040000}, 4772ec7a67SSunil Kumar Kori /* 014 */ {"BPDU frame (MAC DA is 01:80:C2:00:00:00)", 0, 0x00020000}, 4872ec7a67SSunil Kumar Kori /* 015 */ {"FCoE detected (Ether type is 0x8906) ", 0, 0x00010000}, 4972ec7a67SSunil Kumar Kori /* 016 */ {"FIP detected (Ether type is 0x8914) ", 0, 0x00008000}, 5072ec7a67SSunil Kumar Kori /* 017 */ {"Ethernet Parsing Error ", 0, 0x00004000}, 5172ec7a67SSunil Kumar Kori /* 018 */ {"LLC+SNAP Present ", 0, 0x00002000}, 5272ec7a67SSunil Kumar Kori /* 019 */ {"Unknown LLC/OUI ", 0, 0x00001000}, 5372ec7a67SSunil Kumar Kori /* 020 */ {"LLC+SNAP Error ", 0, 0x00000800}, 5472ec7a67SSunil Kumar Kori /* 021 */ {"VLAN 1 Present ", 0, 0x00000400}, 5572ec7a67SSunil Kumar Kori /* 022 */ {"VLAN n Present ", 0, 0x00000200}, 5672ec7a67SSunil Kumar Kori /* 023 */ {"CFI bit in a \"8100\" VLAN tag is set ", 0, 0x00000100}, 5772ec7a67SSunil Kumar Kori /* 024 */ {"VLAN Parsing Error ", 0, 0x00000080}, 5872ec7a67SSunil Kumar Kori /* 025 */ {"PPPoE+PPP Present ", 0, 0x00000040}, 5972ec7a67SSunil Kumar Kori /* 026 */ {"PPPoE+PPP Parsing Error ", 0, 0x00000020}, 6072ec7a67SSunil Kumar Kori /* 027 */ {"MPLS 1 Present ", 0, 0x00000010}, 6172ec7a67SSunil Kumar Kori /* 028 */ {"MPLS n Present ", 0, 0x00000008}, 6272ec7a67SSunil Kumar Kori /* 029 */ {"MPLS Parsing Error ", 0, 0x00000004}, 6372ec7a67SSunil Kumar Kori /* 030 */ {"ARP frame Present (Ethertype 0x0806) ", 0, 0x00000002}, 6472ec7a67SSunil Kumar Kori /* 031 */ {"ARP Parsing Error ", 0, 0x00000001}, 6572ec7a67SSunil Kumar Kori /* Frame Attribute Flags 2 */ 6672ec7a67SSunil Kumar Kori /* 032 */ {"L2 Unknown Protocol ", 1, 0x80000000}, 6772ec7a67SSunil Kumar Kori /* 033 */ {"L2 Soft Parsing Error ", 1, 0x40000000}, 6872ec7a67SSunil Kumar Kori /* 034 */ {"IPv4 1 Present ", 1, 0x20000000}, 6972ec7a67SSunil Kumar Kori /* 035 */ {"IPv4 1 Unicast ", 1, 0x10000000}, 7072ec7a67SSunil Kumar Kori /* 036 */ {"IPv4 1 Multicast ", 1, 0x08000000}, 7172ec7a67SSunil Kumar Kori /* 037 */ {"IPv4 1 Broadcast ", 1, 0x04000000}, 7272ec7a67SSunil Kumar Kori /* 038 */ {"IPv4 n Present ", 1, 0x02000000}, 7372ec7a67SSunil Kumar Kori /* 039 */ {"IPv4 n Unicast ", 1, 0x01000000}, 7472ec7a67SSunil Kumar Kori /* 040 */ {"IPv4 n Multicast ", 1, 0x00800000}, 7572ec7a67SSunil Kumar Kori /* 041 */ {"IPv4 n Broadcast ", 1, 0x00400000}, 7672ec7a67SSunil Kumar Kori /* 042 */ {"IPv6 1 Present ", 1, 0x00200000}, 7772ec7a67SSunil Kumar Kori /* 043 */ {"IPv6 1 Unicast ", 1, 0x00100000}, 7872ec7a67SSunil Kumar Kori /* 044 */ {"IPv6 1 Multicast ", 1, 0x00080000}, 7972ec7a67SSunil Kumar Kori /* 045 */ {"IPv6 n Present ", 1, 0x00040000}, 8072ec7a67SSunil Kumar Kori /* 046 */ {"IPv6 n Unicast ", 1, 0x00020000}, 8172ec7a67SSunil Kumar Kori /* 047 */ {"IPv6 n Multicast ", 1, 0x00010000}, 8272ec7a67SSunil Kumar Kori /* 048 */ {"IP 1 option present ", 1, 0x00008000}, 8372ec7a67SSunil Kumar Kori /* 049 */ {"IP 1 Unknown Protocol ", 1, 0x00004000}, 8472ec7a67SSunil Kumar Kori /* 050 */ {"IP 1 Packet is a fragment ", 1, 0x00002000}, 8572ec7a67SSunil Kumar Kori /* 051 */ {"IP 1 Packet is an initial fragment ", 1, 0x00001000}, 8672ec7a67SSunil Kumar Kori /* 052 */ {"IP 1 Parsing Error ", 1, 0x00000800}, 8772ec7a67SSunil Kumar Kori /* 053 */ {"IP n option present ", 1, 0x00000400}, 8872ec7a67SSunil Kumar Kori /* 054 */ {"IP n Unknown Protocol ", 1, 0x00000200}, 8972ec7a67SSunil Kumar Kori /* 055 */ {"IP n Packet is a fragment ", 1, 0x00000100}, 9072ec7a67SSunil Kumar Kori /* 056 */ {"IP n Packet is an initial fragment ", 1, 0x00000080}, 9172ec7a67SSunil Kumar Kori /* 057 */ {"ICMP detected (IP proto is 1) ", 1, 0x00000040}, 9272ec7a67SSunil Kumar Kori /* 058 */ {"IGMP detected (IP proto is 2) ", 1, 0x00000020}, 9372ec7a67SSunil Kumar Kori /* 059 */ {"ICMPv6 detected (IP proto is 3a) ", 1, 0x00000010}, 9472ec7a67SSunil Kumar Kori /* 060 */ {"UDP Light detected (IP proto is 136) ", 1, 0x00000008}, 9572ec7a67SSunil Kumar Kori /* 061 */ {"IP n Parsing Error ", 1, 0x00000004}, 9672ec7a67SSunil Kumar Kori /* 062 */ {"Min. Encap Present ", 1, 0x00000002}, 9772ec7a67SSunil Kumar Kori /* 063 */ {"Min. Encap S flag set ", 1, 0x00000001}, 9872ec7a67SSunil Kumar Kori /* Frame Attribute Flags 3 */ 9972ec7a67SSunil Kumar Kori /* 064 */ {"Min. Encap Parsing Error ", 2, 0x80000000}, 10072ec7a67SSunil Kumar Kori /* 065 */ {"GRE Present ", 2, 0x40000000}, 10172ec7a67SSunil Kumar Kori /* 066 */ {"GRE R bit set ", 2, 0x20000000}, 10272ec7a67SSunil Kumar Kori /* 067 */ {"GRE Parsing Error ", 2, 0x10000000}, 10372ec7a67SSunil Kumar Kori /* 068 */ {"L3 Unknown Protocol ", 2, 0x08000000}, 10472ec7a67SSunil Kumar Kori /* 069 */ {"L3 Soft Parsing Error ", 2, 0x04000000}, 10572ec7a67SSunil Kumar Kori /* 070 */ {"UDP Present ", 2, 0x02000000}, 10672ec7a67SSunil Kumar Kori /* 071 */ {"UDP Parsing Error ", 2, 0x01000000}, 10772ec7a67SSunil Kumar Kori /* 072 */ {"TCP Present ", 2, 0x00800000}, 10872ec7a67SSunil Kumar Kori /* 073 */ {"TCP options present ", 2, 0x00400000}, 10972ec7a67SSunil Kumar Kori /* 074 */ {"TCP Control bits 6-11 set ", 2, 0x00200000}, 11072ec7a67SSunil Kumar Kori /* 075 */ {"TCP Control bits 3-5 set ", 2, 0x00100000}, 11172ec7a67SSunil Kumar Kori /* 076 */ {"TCP Parsing Error ", 2, 0x00080000}, 11272ec7a67SSunil Kumar Kori /* 077 */ {"IPSec Present ", 2, 0x00040000}, 11372ec7a67SSunil Kumar Kori /* 078 */ {"IPSec ESP found ", 2, 0x00020000}, 11472ec7a67SSunil Kumar Kori /* 079 */ {"IPSec AH found ", 2, 0x00010000}, 11572ec7a67SSunil Kumar Kori /* 080 */ {"IPSec Parsing Error ", 2, 0x00008000}, 11672ec7a67SSunil Kumar Kori /* 081 */ {"SCTP Present ", 2, 0x00004000}, 11772ec7a67SSunil Kumar Kori /* 082 */ {"SCTP Parsing Error ", 2, 0x00002000}, 11872ec7a67SSunil Kumar Kori /* 083 */ {"DCCP Present ", 2, 0x00001000}, 11972ec7a67SSunil Kumar Kori /* 084 */ {"DCCP Parsing Error ", 2, 0x00000800}, 12072ec7a67SSunil Kumar Kori /* 085 */ {"L4 Unknown Protocol ", 2, 0x00000400}, 12172ec7a67SSunil Kumar Kori /* 086 */ {"L4 Soft Parsing Error ", 2, 0x00000200}, 12272ec7a67SSunil Kumar Kori /* 087 */ {"GTP Present ", 2, 0x00000100}, 12372ec7a67SSunil Kumar Kori /* 088 */ {"GTP Parsing Error ", 2, 0x00000080}, 12472ec7a67SSunil Kumar Kori /* 089 */ {"ESP Present ", 2, 0x00000040}, 12572ec7a67SSunil Kumar Kori /* 090 */ {"ESP Parsing Error ", 2, 0x00000020}, 12672ec7a67SSunil Kumar Kori /* 091 */ {"iSCSI detected (Port# 860) ", 2, 0x00000010}, 12772ec7a67SSunil Kumar Kori /* 092 */ {"Capwap-control detected (Port# 5246) ", 2, 0x00000008}, 12872ec7a67SSunil Kumar Kori /* 093 */ {"Capwap-data detected (Port# 5247) ", 2, 0x00000004}, 12972ec7a67SSunil Kumar Kori /* 094 */ {"L5 Soft Parsing Error ", 2, 0x00000002}, 13072ec7a67SSunil Kumar Kori /* 095 */ {"IPv6 Route hdr1 present ", 2, 0x00000001}, 13172ec7a67SSunil Kumar Kori /* 096 */ {NULL, 0, 0x00000000} 13272ec7a67SSunil Kumar Kori }; 13372ec7a67SSunil Kumar Kori 13472ec7a67SSunil Kumar Kori struct frame_attr_ext frame_attr_ext_arr[] = { 13572ec7a67SSunil Kumar Kori /* Frame Attribute Flags Extension */ 13672ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #0 ", 0, 0x8000}, 13772ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #1 ", 0, 0x4000}, 13872ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #2 ", 0, 0x2000}, 13972ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #3 ", 0, 0x1000}, 14072ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #4 ", 0, 0x0800}, 14172ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #5 ", 0, 0x0400}, 14272ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #6 ", 0, 0x0200}, 14372ec7a67SSunil Kumar Kori /* 096 */ {"User defined soft parser bit #7 ", 0, 0x0100}, 14472ec7a67SSunil Kumar Kori /* 097 */ {"Reserved ", 0, 0x00ff}, 14572ec7a67SSunil Kumar Kori /* 112 */ {NULL, 0, 0x0000} 14672ec7a67SSunil Kumar Kori }; 14772ec7a67SSunil Kumar Kori 14872ec7a67SSunil Kumar Kori int dpaa2_eth_load_wriop_soft_parser(struct dpaa2_dev_priv *priv, 14972ec7a67SSunil Kumar Kori enum dpni_soft_sequence_dest dest) 15072ec7a67SSunil Kumar Kori { 15172ec7a67SSunil Kumar Kori struct fsl_mc_io *dpni = priv->hw; 15272ec7a67SSunil Kumar Kori struct dpni_load_ss_cfg cfg; 15372ec7a67SSunil Kumar Kori struct dpni_drv_sparser_param sp_param; 15472ec7a67SSunil Kumar Kori uint8_t *addr; 15572ec7a67SSunil Kumar Kori int ret; 15672ec7a67SSunil Kumar Kori 15772ec7a67SSunil Kumar Kori memset(&sp_param, 0, sizeof(sp_param)); 15872ec7a67SSunil Kumar Kori sp_param.start_pc = priv->ss_offset; 15972ec7a67SSunil Kumar Kori sp_param.byte_code = &wriop_bytecode[0]; 16072ec7a67SSunil Kumar Kori sp_param.size = sizeof(wriop_bytecode); 16172ec7a67SSunil Kumar Kori 16272ec7a67SSunil Kumar Kori cfg.dest = dest; 16372ec7a67SSunil Kumar Kori cfg.ss_offset = sp_param.start_pc; 16472ec7a67SSunil Kumar Kori cfg.ss_size = sp_param.size; 16572ec7a67SSunil Kumar Kori 16672ec7a67SSunil Kumar Kori addr = rte_malloc(NULL, sp_param.size, 64); 16772ec7a67SSunil Kumar Kori if (!addr) { 168f665790aSDavid Marchand DPAA2_PMD_ERR("Memory unavailable for soft parser param"); 16972ec7a67SSunil Kumar Kori return -1; 17072ec7a67SSunil Kumar Kori } 17172ec7a67SSunil Kumar Kori 17272ec7a67SSunil Kumar Kori memcpy(addr, sp_param.byte_code, sp_param.size); 173*25d0ae62SJun Yang cfg.ss_iova = DPAA2_VADDR_TO_IOVA_AND_CHECK(addr, sp_param.size); 174*25d0ae62SJun Yang if (cfg.ss_iova == RTE_BAD_IOVA) { 175*25d0ae62SJun Yang DPAA2_PMD_ERR("No IOMMU map for soft sequence(%p), size=%d", 176*25d0ae62SJun Yang addr, sp_param.size); 177*25d0ae62SJun Yang rte_free(addr); 178*25d0ae62SJun Yang 179*25d0ae62SJun Yang return -ENOBUFS; 180*25d0ae62SJun Yang } 18172ec7a67SSunil Kumar Kori 18272ec7a67SSunil Kumar Kori ret = dpni_load_sw_sequence(dpni, CMD_PRI_LOW, priv->token, &cfg); 18372ec7a67SSunil Kumar Kori if (ret) { 184f665790aSDavid Marchand DPAA2_PMD_ERR("dpni_load_sw_sequence failed"); 18572ec7a67SSunil Kumar Kori rte_free(addr); 18672ec7a67SSunil Kumar Kori return ret; 18772ec7a67SSunil Kumar Kori } 18872ec7a67SSunil Kumar Kori 189*25d0ae62SJun Yang priv->ss_iova = cfg.ss_iova; 19072ec7a67SSunil Kumar Kori priv->ss_offset += sp_param.size; 191a247fcd9SStephen Hemminger DPAA2_PMD_INFO("Soft parser loaded for dpni@%d", priv->hw_id); 19272ec7a67SSunil Kumar Kori 19372ec7a67SSunil Kumar Kori rte_free(addr); 19472ec7a67SSunil Kumar Kori return 0; 19572ec7a67SSunil Kumar Kori } 19672ec7a67SSunil Kumar Kori 19772ec7a67SSunil Kumar Kori int dpaa2_eth_enable_wriop_soft_parser(struct dpaa2_dev_priv *priv, 19872ec7a67SSunil Kumar Kori enum dpni_soft_sequence_dest dest) 19972ec7a67SSunil Kumar Kori { 20072ec7a67SSunil Kumar Kori struct fsl_mc_io *dpni = priv->hw; 20172ec7a67SSunil Kumar Kori struct dpni_enable_ss_cfg cfg; 20272ec7a67SSunil Kumar Kori uint8_t pa[3]; 20372ec7a67SSunil Kumar Kori struct dpni_drv_sparser_param sp_param; 20472ec7a67SSunil Kumar Kori uint8_t *param_addr = NULL; 20572ec7a67SSunil Kumar Kori int ret; 20672ec7a67SSunil Kumar Kori 20772ec7a67SSunil Kumar Kori memset(&sp_param, 0, sizeof(sp_param)); 20872ec7a67SSunil Kumar Kori pa[0] = 32; /* Custom Header Length in bytes */ 20972ec7a67SSunil Kumar Kori sp_param.custom_header_first = 1; 21072ec7a67SSunil Kumar Kori sp_param.param_offset = 32; 21172ec7a67SSunil Kumar Kori sp_param.param_size = 1; 21272ec7a67SSunil Kumar Kori sp_param.start_pc = priv->ss_offset; 21372ec7a67SSunil Kumar Kori sp_param.param_array = (uint8_t *)&pa[0]; 21472ec7a67SSunil Kumar Kori 21572ec7a67SSunil Kumar Kori cfg.dest = dest; 21672ec7a67SSunil Kumar Kori cfg.ss_offset = sp_param.start_pc; 21772ec7a67SSunil Kumar Kori cfg.set_start = sp_param.custom_header_first; 21872ec7a67SSunil Kumar Kori cfg.hxs = (uint16_t)sp_param.link_to_hard_hxs; 21972ec7a67SSunil Kumar Kori cfg.param_offset = sp_param.param_offset; 22072ec7a67SSunil Kumar Kori cfg.param_size = sp_param.param_size; 22172ec7a67SSunil Kumar Kori if (cfg.param_size) { 22272ec7a67SSunil Kumar Kori param_addr = rte_malloc(NULL, cfg.param_size, 64); 22372ec7a67SSunil Kumar Kori if (!param_addr) { 224f665790aSDavid Marchand DPAA2_PMD_ERR("Memory unavailable for soft parser param"); 22572ec7a67SSunil Kumar Kori return -1; 22672ec7a67SSunil Kumar Kori } 22772ec7a67SSunil Kumar Kori 22872ec7a67SSunil Kumar Kori memcpy(param_addr, sp_param.param_array, cfg.param_size); 229*25d0ae62SJun Yang cfg.param_iova = DPAA2_VADDR_TO_IOVA_AND_CHECK(param_addr, 230*25d0ae62SJun Yang cfg.param_size); 231*25d0ae62SJun Yang if (cfg.param_iova == RTE_BAD_IOVA) { 232*25d0ae62SJun Yang DPAA2_PMD_ERR("%s: No IOMMU map for %p, size=%d", 233*25d0ae62SJun Yang __func__, param_addr, cfg.param_size); 234*25d0ae62SJun Yang rte_free(param_addr); 235*25d0ae62SJun Yang 236*25d0ae62SJun Yang return -ENOBUFS; 237*25d0ae62SJun Yang } 23872ec7a67SSunil Kumar Kori priv->ss_param_iova = cfg.param_iova; 23972ec7a67SSunil Kumar Kori } else { 24072ec7a67SSunil Kumar Kori cfg.param_iova = 0; 24172ec7a67SSunil Kumar Kori } 24272ec7a67SSunil Kumar Kori 24372ec7a67SSunil Kumar Kori ret = dpni_enable_sw_sequence(dpni, CMD_PRI_LOW, priv->token, &cfg); 24472ec7a67SSunil Kumar Kori if (ret) { 245*25d0ae62SJun Yang DPAA2_PMD_ERR("Soft parser enabled for dpni@%d failed", 24672ec7a67SSunil Kumar Kori priv->hw_id); 24772ec7a67SSunil Kumar Kori rte_free(param_addr); 24872ec7a67SSunil Kumar Kori return ret; 24972ec7a67SSunil Kumar Kori } 25072ec7a67SSunil Kumar Kori 25172ec7a67SSunil Kumar Kori rte_free(param_addr); 252a247fcd9SStephen Hemminger DPAA2_PMD_INFO("Soft parser enabled for dpni@%d", priv->hw_id); 25372ec7a67SSunil Kumar Kori return 0; 25472ec7a67SSunil Kumar Kori } 255