From nobody Thu Oct 2 19:42:06 2025 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B686340D83 for ; Fri, 12 Sep 2025 19:54:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757706849; cv=none; b=QeZ7S+wV5yz44ZGSjrABhK1KvB4W8tGbd5GQFA6pYWJ58q60xvUIZs0EeHinvvnf8YZb+KKNecEbmybk3LoA6XHLfCmc+LCMnxhxzJjCAMijUCvDoRHPn5Mp1vvEeI4f90kW9BNswklZULTsLfTRdoifwO00159TE0VuFCfarHg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757706849; c=relaxed/simple; bh=LDIDm6amXRvxKfZLhIo6Dy6odk1hkniA5SESLkBZmT0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=nLr6h8TvSxexx7GnKUCGYWqaXKF+/WuMYgkCGB+FDq3FJ4g1ygGkStnZ4tk+AA70zr6gTZyEzZ/2fDP9NSSuV5xquzqKSZ64EVuoTJQX0h9OvBDTlpcSroEDDnB/XBi+T2qnTZMt5+ZlNyaKXVt6nw5WeGjG2d4zfg+9n1XTF+0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=U/yFJEa9; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="U/yFJEa9" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-3e249a4d605so2514124f8f.3 for ; Fri, 12 Sep 2025 12:54:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757706845; x=1758311645; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZNO8VaIq1C1v07zJmcrQFMbo3suLUEzGA3AO6uFPvqU=; b=U/yFJEa9QyP6eTJV8mu8QyeVy0eBH+jEjUVCT+MchegCc8Q3g1A+sQd6dT4Jy8NDZT 2Z+0D2tlW+bH44P8TszE7mM2YOPrOS8B+Zp+NDi5KNw7/x+BxMwFk07ExIf6mJHtAAXT OpfAM1HNr52yDYEoePbxyRZ6Wn1cx0INRizGnaqj4q4AfTG1I6gSQQJriIjqOYcPhfO3 wJlLaQp3QhubgXdTfG2DdfYQJlG0akWPEd/1cJi4tPar00JQ5CXpKSRJv/1IivCAwQ2D HYzSWAYPqrLvFwTc1LXEdKlEaSpakaJ+jJSqWFWk5PgN5B5YY2i7BYhyRan4HCqwyTkj p1+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757706845; x=1758311645; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZNO8VaIq1C1v07zJmcrQFMbo3suLUEzGA3AO6uFPvqU=; b=hJkEtqoudwrS6llYr2emHWX5F9pLEddR+tWPgHUNN6ziqaoXyJjy0yvtrn+zuhMi4r zo8poYKc39MUgfEH+405I7F6J8MaLaA9fLFaAPxfdh4/YCvjU8RS/bimdxMUvQGE0R9U z5WbGFivjMvTA2XGTkxvuRBADa01R27Te2Gwyddyoo0IQUW2dhi3x/BrGlI8tBTOvAg1 pJT9dbftYuMUbkoO5btpfr64jQhSjnIoVcNtUBQqjrCUZyrw5CKsID472/4YbdNH+THx qGDqcGMkzFVBxVXV0AGtmx9U2vXG382q11B/b+ZL8ZkKQDTBZpZkB05j8rrvged9373P WLaQ== X-Forwarded-Encrypted: i=1; AJvYcCX65Cvmep4xIOxMoWwUbnoLiOyDsWpg/hujGByP7M5t7kVW3wDW5JNo0483ZJxNLJBy7RgNwbJjv43fndo=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8gzJ5nm+ZgZ7TI9TgyudWUkqI+7WcRlJqL6maPJJ51MTgNdH7 VNcF0z9l+dd6gQfwLAWB5fxM+0u9jvBWB5oOPkiPf8UC9eDHgTe2h5CU X-Gm-Gg: ASbGncv02bLWuxbq+l5p2F4axV7GlUF4IS56VgO/gCV9pW+jKdksUccsf33Dwv22o3h r3fuxTOiKu3U2uYzZAs7ZGH472nahLWiH3e76FXJ7/NQ39KT/5DHEQqqLqYJ1DRX6ViK46dt0Bo 8MdWygdOu6ZOwrLYMQHynyDG2MshdF51kttnc8O5XwWtsLnuIZIWpHICMXxjRqCKEI6lr6qT6ym ibvCuHzgCewNNadgC2xLkQVpMB97QugRezTrzw80pVdKXCERjz0CGgwdATzq3H5W3P0a3WKEb7n rp+mwJpSlJ/ckWC8MjYi0y9wtIksFAmoKOnW/WQ2SkUkGQnqPIdhhF79H6tnTHjiIB+/ihpziBT BF1mKskRb32ZCamHFNr1Z5UEjVMPcImuBShk3t/hnqBjToncZ9TvvyfPsnXYd1g== X-Google-Smtp-Source: AGHT+IGz1qVTn0To3grwW4TfAfgqimwJnbIU2emM/F6SBm49eHIR3hDrHSQxK4zAZ9ajlAEeYcN81g== X-Received: by 2002:a05:6000:208a:b0:3d7:eb95:b1e1 with SMTP id ffacd0b85a97d-3e7659eb4admr2844230f8f.32.1757706844710; Fri, 12 Sep 2025 12:54:04 -0700 (PDT) Received: from yanesskka.. (node-188-187-35-212.domolink.tula.net. [212.35.187.188]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45e017bfd14sm74650375e9.21.2025.09.12.12.54.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 12:54:04 -0700 (PDT) From: Yana Bashlykova To: "David S. Miller" Cc: Yana Bashlykova , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, lvc-project@linuxtesting.org Subject: [PATCH 6.1 09/15] genetlink: add LARGE_GENL stress test family Date: Fri, 12 Sep 2025 22:53:32 +0300 Message-Id: <20250912195339.20635-10-yana2bsh@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250912195339.20635-1-yana2bsh@gmail.com> References: <20250912195339.20635-1-yana2bsh@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Added new test family with 190+ multicast groups to verify: - Handling of large number of multicast groups - Family registration with many groups The family serves as a stress test for Generic Netlink scalability. Signed-off-by: Yana Bashlykova --- .../net-pf-16-proto-16-family-PARALLEL_GENL.c | 468 +++++++++++++++++- 1 file changed, 467 insertions(+), 1 deletion(-) diff --git a/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.= c b/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c index ad4228eda2d5..0023aeaf4d42 100644 --- a/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c +++ b/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c @@ -1,4 +1,16 @@ // SPDX-License-Identifier: GPL-2.0 +/* + * Generic Netlink Test Module + * + * Implements test families for Generic Netlink functionality: + * - TEST_GENL: Basic commands with mutex protection + * - PARALLEL_GENL: Advanced ops with parallel dump support + * - THIRD_GENL: Simple message handling supporting many multicast groups + * - LARGE_GENL: Stress test with 190+ multicast groups + * + * Includes sysfs interfaces for manual testing and validation + * of error cases and edge conditions. + */ =20 #include #include @@ -146,6 +158,7 @@ static struct kobj_attribute my_attr_str_third_genl =3D __ATTR(message, 0664, show_third_genl_message, store_third_genl_message); =20 static DEFINE_MUTEX(genl_mutex); +static DEFINE_MUTEX(sysfs_mutex); =20 #define MY_GENL_FAMILY_NAME "TEST_GENL" #define MY_GENL_VERSION 1 @@ -154,6 +167,8 @@ static DEFINE_MUTEX(genl_mutex); =20 #define THIRD_GENL_FAMILY_NAME "THIRD_GENL" =20 +#define LARGE_GENL_FAMILY_NAME "LARGE_GENL" + #define PATH_GENL_TEST_NUM "/sys/kernel/genl_test/value" #define PATH_GENL_TEST_MES "/sys/kernel/genl_test/message" #define PATH_GENL_TEST_DEV "/sys/kernel/genl_test/some_info" @@ -920,6 +935,410 @@ static const struct genl_ops parallel_genl_ops[] =3D { }, }; =20 +enum my_multicast_many_groups_one { + MCGRP_1, + MCGRP_2, + MCGRP_3, + MCGRP_4, + MCGRP_5, + MCGRP_6, + MCGRP_7, + MCGRP_8, + MCGRP_9, + MCGRP_10, + MCGRP_11, + MCGRP_12, + MCGRP_13, + MCGRP_14, + MCGRP_15, + MCGRP_16, + MCGRP_17, + MCGRP_18, + MCGRP_19, + MCGRP_20, + MCGRP_21, + MCGRP_22, + MCGRP_23, + MCGRP_24, + MCGRP_25, + MCGRP_26, + MCGRP_27, + MCGRP_28, + MCGRP_29, + MCGRP_30, + MCGRP_31, + MCGRP_32, + MCGRP_33, + MCGRP_34, + MCGRP_35, + MCGRP_36, + MCGRP_37, + MCGRP_38, + MCGRP_39, + MCGRP_40, + MCGRP_41, + MCGRP_42, + MCGRP_43, + MCGRP_44, + MCGRP_45, + MCGRP_46, + MCGRP_47, + MCGRP_48, + MCGRP_49, + MCGRP_50, + MCGRP_51, + MCGRP_52, + MCGRP_53, + MCGRP_54, + MCGRP_55, + MCGRP_56, + MCGRP_57, + MCGRP_58, + MCGRP_59, + MCGRP_60, + MCGRP_61, + MCGRP_62, + MCGRP_63, + MCGRP_64, + MCGRP_65, + MCGRP_66, + MCGRP_67, + MCGRP_68, + MCGRP_69, + MCGRP_70, + MCGRP_71, + MCGRP_72, + MCGRP_73, + MCGRP_74, + MCGRP_75, + MCGRP_76, + MCGRP_77, + MCGRP_78, + MCGRP_79, + MCGRP_80, + MCGRP_81, + MCGRP_82, + MCGRP_83, + MCGRP_84, + MCGRP_85, + MCGRP_86, + MCGRP_87, + MCGRP_88, + MCGRP_89, + MCGRP_90, + MCGRP_91, + MCGRP_92, + MCGRP_93, + MCGRP_94, + MCGRP_95, + MCGRP_96, + MCGRP_97, + MCGRP_98, + MCGRP_99, + MCGRP_100, + MCGRP_101, + MCGRP_102, + MCGRP_103, + MCGRP_104, + MCGRP_105, + MCGRP_106, + MCGRP_107, + MCGRP_108, + MCGRP_109, + MCGRP_110, + MCGRP_111, + MCGRP_112, + MCGRP_113, + MCGRP_114, + MCGRP_115, + MCGRP_116, + MCGRP_117, + MCGRP_118, + MCGRP_119, + MCGRP_120, + MCGRP_121, + MCGRP_122, + MCGRP_123, + MCGRP_124, + MCGRP_125, + MCGRP_126, + MCGRP_127, + MCGRP_128, + MCGRP_129, + MCGRP_130, + MCGRP_131, + MCGRP_132, + MCGRP_133, + MCGRP_134, + MCGRP_135, + MCGRP_136, + MCGRP_137, + MCGRP_138, + MCGRP_139, + MCGRP_140, + MCGRP_141, + MCGRP_142, + MCGRP_143, + MCGRP_144, + MCGRP_145, + MCGRP_146, + MCGRP_147, + MCGRP_148, + MCGRP_149, + MCGRP_150, + MCGRP_151, + MCGRP_152, + MCGRP_153, + MCGRP_154, + MCGRP_155, + MCGRP_156, + MCGRP_157, + MCGRP_158, + MCGRP_159, + MCGRP_160, + MCGRP_161, + MCGRP_162, + MCGRP_163, + MCGRP_164, + MCGRP_165, + MCGRP_166, + MCGRP_167, + MCGRP_168, + MCGRP_169, + MCGRP_170, + MCGRP_171, + MCGRP_172, + MCGRP_173, + MCGRP_174, + MCGRP_175, + MCGRP_176, + MCGRP_177, + MCGRP_178, + MCGRP_179, + MCGRP_180, + MCGRP_181, + MCGRP_182, + MCGRP_183, + MCGRP_184, + MCGRP_185, + MCGRP_186, + MCGRP_187, + MCGRP_188, + MCGRP_189, + MCGRP_190, + MCGRP_191, + MCGRP_192, + MCGRP_193, + MCGRP_194, + MCGRP_195, + MCGRP_196, + MCGRP_197, + MCGRP_198, + MCGRP_199, +}; + +static const struct genl_multicast_group genl_many_mcgrps_one[] =3D { + [MCGRP_1] =3D { .name =3D "MCGRP_1", }, + [MCGRP_2] =3D { .name =3D "MCGRP_2", }, + [MCGRP_3] =3D { .name =3D "MCGRP_3", }, + [MCGRP_4] =3D { .name =3D "MCGRP_4", }, + [MCGRP_5] =3D { .name =3D "MCGRP_5", }, + [MCGRP_6] =3D { .name =3D "MCGRP_6", }, + [MCGRP_7] =3D { .name =3D "MCGRP_7", }, + [MCGRP_8] =3D { .name =3D "MCGRP_8", }, + [MCGRP_9] =3D { .name =3D "MCGRP_9", }, + [MCGRP_10] =3D { .name =3D "MCGRP_10", }, + [MCGRP_11] =3D { .name =3D "MCGRP_11", }, + [MCGRP_12] =3D { .name =3D "MCGRP_12", }, + [MCGRP_13] =3D { .name =3D "MCGRP_13", }, + [MCGRP_14] =3D { .name =3D "MCGRP_14", }, + [MCGRP_15] =3D { .name =3D "MCGRP_15", }, + [MCGRP_16] =3D { .name =3D "MCGRP_16", }, + [MCGRP_17] =3D { .name =3D "MCGRP_17", }, + [MCGRP_18] =3D { .name =3D "MCGRP_18", }, + [MCGRP_19] =3D { .name =3D "MCGRP_19", }, + [MCGRP_20] =3D { .name =3D "MCGRP_20", }, + [MCGRP_21] =3D { .name =3D "MCGRP_21", }, + [MCGRP_22] =3D { .name =3D "MCGRP_22", }, + [MCGRP_23] =3D { .name =3D "MCGRP_23", }, + [MCGRP_24] =3D { .name =3D "MCGRP_24", }, + [MCGRP_25] =3D { .name =3D "MCGRP_25", }, + [MCGRP_26] =3D { .name =3D "MCGRP_26", }, + [MCGRP_27] =3D { .name =3D "MCGRP_27", }, + [MCGRP_28] =3D { .name =3D "MCGRP_28", }, + [MCGRP_29] =3D { .name =3D "MCGRP_29", }, + [MCGRP_30] =3D { .name =3D "MCGRP_30", }, + [MCGRP_31] =3D { .name =3D "MCGRP_31", }, + [MCGRP_32] =3D { .name =3D "MCGRP_32", }, + [MCGRP_33] =3D { .name =3D "MCGRP_33", }, + [MCGRP_34] =3D { .name =3D "MCGRP_34", }, + [MCGRP_35] =3D { .name =3D "MCGRP_35", }, + [MCGRP_36] =3D { .name =3D "MCGRP_36", }, + [MCGRP_37] =3D { .name =3D "MCGRP_37", }, + [MCGRP_38] =3D { .name =3D "MCGRP_38", }, + [MCGRP_39] =3D { .name =3D "MCGRP_39", }, + [MCGRP_40] =3D { .name =3D "MCGRP_40", }, + [MCGRP_41] =3D { .name =3D "MCGRP_41", }, + [MCGRP_42] =3D { .name =3D "MCGRP_42", }, + [MCGRP_43] =3D { .name =3D "MCGRP_43", }, + [MCGRP_44] =3D { .name =3D "MCGRP_44", }, + [MCGRP_45] =3D { .name =3D "MCGRP_45", }, + [MCGRP_46] =3D { .name =3D "MCGRP_46", }, + [MCGRP_47] =3D { .name =3D "MCGRP_47", }, + [MCGRP_48] =3D { .name =3D "MCGRP_48", }, + [MCGRP_49] =3D { .name =3D "MCGRP_49", }, + [MCGRP_50] =3D { .name =3D "MCGRP_50", }, + [MCGRP_51] =3D { .name =3D "MCGRP_51", }, + [MCGRP_52] =3D { .name =3D "MCGRP_52", }, + [MCGRP_53] =3D { .name =3D "MCGRP_53", }, + [MCGRP_54] =3D { .name =3D "MCGRP_54", }, + [MCGRP_55] =3D { .name =3D "MCGRP_55", }, + [MCGRP_56] =3D { .name =3D "MCGRP_56", }, + [MCGRP_57] =3D { .name =3D "MCGRP_57", }, + [MCGRP_58] =3D { .name =3D "MCGRP_58", }, + [MCGRP_59] =3D { .name =3D "MCGRP_59", }, + [MCGRP_60] =3D { .name =3D "MCGRP_60", }, + [MCGRP_61] =3D { .name =3D "MCGRP_61", }, + [MCGRP_62] =3D { .name =3D "MCGRP_62", }, + [MCGRP_63] =3D { .name =3D "MCGRP_63", }, + [MCGRP_64] =3D { .name =3D "MCGRP_64", }, + [MCGRP_65] =3D { .name =3D "MCGRP_65", }, + [MCGRP_66] =3D { .name =3D "MCGRP_66", }, + [MCGRP_67] =3D { .name =3D "MCGRP_67", }, + [MCGRP_68] =3D { .name =3D "MCGRP_68", }, + [MCGRP_69] =3D { .name =3D "MCGRP_69", }, + [MCGRP_70] =3D { .name =3D "MCGRP_70", }, + [MCGRP_71] =3D { .name =3D "MCGRP_71", }, + [MCGRP_72] =3D { .name =3D "MCGRP_72", }, + [MCGRP_73] =3D { .name =3D "MCGRP_73", }, + [MCGRP_74] =3D { .name =3D "MCGRP_74", }, + [MCGRP_75] =3D { .name =3D "MCGRP_75", }, + [MCGRP_76] =3D { .name =3D "MCGRP_76", }, + [MCGRP_77] =3D { .name =3D "MCGRP_77", }, + [MCGRP_78] =3D { .name =3D "MCGRP_78", }, + [MCGRP_79] =3D { .name =3D "MCGRP_79", }, + [MCGRP_80] =3D { .name =3D "MCGRP_80", }, + [MCGRP_81] =3D { .name =3D "MCGRP_81", }, + [MCGRP_82] =3D { .name =3D "MCGRP_82", }, + [MCGRP_83] =3D { .name =3D "MCGRP_83", }, + [MCGRP_84] =3D { .name =3D "MCGRP_84", }, + [MCGRP_85] =3D { .name =3D "MCGRP_85", }, + [MCGRP_86] =3D { .name =3D "MCGRP_86", }, + [MCGRP_87] =3D { .name =3D "MCGRP_87", }, + [MCGRP_88] =3D { .name =3D "MCGRP_88", }, + [MCGRP_89] =3D { .name =3D "MCGRP_89", }, + [MCGRP_90] =3D { .name =3D "MCGRP_90", }, + [MCGRP_91] =3D { .name =3D "MCGRP_91", }, + [MCGRP_92] =3D { .name =3D "MCGRP_92", }, + [MCGRP_93] =3D { .name =3D "MCGRP_93", }, + [MCGRP_94] =3D { .name =3D "MCGRP_94", }, + [MCGRP_95] =3D { .name =3D "MCGRP_95", }, + [MCGRP_96] =3D { .name =3D "MCGRP_96", }, + [MCGRP_97] =3D { .name =3D "MCGRP_97", }, + [MCGRP_98] =3D { .name =3D "MCGRP_98", }, + [MCGRP_99] =3D { .name =3D "MCGRP_99", }, + [MCGRP_100] =3D { .name =3D "MCGRP_100", }, + [MCGRP_101] =3D { .name =3D "MCGRP_101", }, + [MCGRP_102] =3D { .name =3D "MCGRP_102", }, + [MCGRP_103] =3D { .name =3D "MCGRP_103", }, + [MCGRP_104] =3D { .name =3D "MCGRP_104", }, + [MCGRP_105] =3D { .name =3D "MCGRP_105", }, + [MCGRP_106] =3D { .name =3D "MCGRP_106", }, + [MCGRP_107] =3D { .name =3D "MCGRP_107", }, + [MCGRP_108] =3D { .name =3D "MCGRP_108", }, + [MCGRP_109] =3D { .name =3D "MCGRP_109", }, + [MCGRP_110] =3D { .name =3D "MCGRP_100", }, + [MCGRP_111] =3D { .name =3D "MCGRP_111", }, + [MCGRP_112] =3D { .name =3D "MCGRP_112", }, + [MCGRP_113] =3D { .name =3D "MCGRP_113", }, + [MCGRP_114] =3D { .name =3D "MCGRP_114", }, + [MCGRP_115] =3D { .name =3D "MCGRP_115", }, + [MCGRP_116] =3D { .name =3D "MCGRP_116", }, + [MCGRP_117] =3D { .name =3D "MCGRP_117", }, + [MCGRP_118] =3D { .name =3D "MCGRP_118", }, + [MCGRP_119] =3D { .name =3D "MCGRP_119", }, + [MCGRP_120] =3D { .name =3D "MCGRP_120", }, + [MCGRP_121] =3D { .name =3D "MCGRP_121", }, + [MCGRP_122] =3D { .name =3D "MCGRP_122", }, + [MCGRP_123] =3D { .name =3D "MCGRP_123", }, + [MCGRP_124] =3D { .name =3D "MCGRP_124", }, + [MCGRP_125] =3D { .name =3D "MCGRP_125", }, + [MCGRP_126] =3D { .name =3D "MCGRP_126", }, + [MCGRP_127] =3D { .name =3D "MCGRP_127", }, + [MCGRP_128] =3D { .name =3D "MCGRP_128", }, + [MCGRP_129] =3D { .name =3D "MCGRP_129", }, + [MCGRP_130] =3D { .name =3D "MCGRP_130", }, + [MCGRP_131] =3D { .name =3D "MCGRP_131", }, + [MCGRP_132] =3D { .name =3D "MCGRP_132", }, + [MCGRP_133] =3D { .name =3D "MCGRP_133", }, + [MCGRP_134] =3D { .name =3D "MCGRP_134", }, + [MCGRP_135] =3D { .name =3D "MCGRP_135", }, + [MCGRP_136] =3D { .name =3D "MCGRP_136", }, + [MCGRP_137] =3D { .name =3D "MCGRP_137", }, + [MCGRP_138] =3D { .name =3D "MCGRP_138", }, + [MCGRP_139] =3D { .name =3D "MCGRP_139", }, + [MCGRP_140] =3D { .name =3D "MCGRP_140", }, + [MCGRP_141] =3D { .name =3D "MCGRP_141", }, + [MCGRP_142] =3D { .name =3D "MCGRP_142", }, + [MCGRP_143] =3D { .name =3D "MCGRP_143", }, + [MCGRP_144] =3D { .name =3D "MCGRP_144", }, + [MCGRP_145] =3D { .name =3D "MCGRP_145", }, + [MCGRP_146] =3D { .name =3D "MCGRP_146", }, + [MCGRP_147] =3D { .name =3D "MCGRP_147", }, + [MCGRP_148] =3D { .name =3D "MCGRP_148", }, + [MCGRP_149] =3D { .name =3D "MCGRP_149", }, + [MCGRP_150] =3D { .name =3D "MCGRP_150", }, + [MCGRP_151] =3D { .name =3D "MCGRP_151", }, + [MCGRP_152] =3D { .name =3D "MCGRP_152", }, + [MCGRP_153] =3D { .name =3D "MCGRP_153", }, + [MCGRP_154] =3D { .name =3D "MCGRP_154", }, + [MCGRP_155] =3D { .name =3D "MCGRP_155", }, + [MCGRP_156] =3D { .name =3D "MCGRP_156", }, + [MCGRP_157] =3D { .name =3D "MCGRP_157", }, + [MCGRP_158] =3D { .name =3D "MCGRP_158", }, + [MCGRP_159] =3D { .name =3D "MCGRP_159", }, + [MCGRP_160] =3D { .name =3D "MCGRP_160", }, + [MCGRP_161] =3D { .name =3D "MCGRP_161", }, + [MCGRP_162] =3D { .name =3D "MCGRP_162", }, + [MCGRP_163] =3D { .name =3D "MCGRP_163", }, + [MCGRP_164] =3D { .name =3D "MCGRP_164", }, + [MCGRP_165] =3D { .name =3D "MCGRP_165", }, + [MCGRP_166] =3D { .name =3D "MCGRP_166", }, + [MCGRP_167] =3D { .name =3D "MCGRP_167", }, + [MCGRP_168] =3D { .name =3D "MCGRP_168", }, + [MCGRP_169] =3D { .name =3D "MCGRP_169", }, + [MCGRP_170] =3D { .name =3D "MCGRP_170", }, + [MCGRP_171] =3D { .name =3D "MCGRP_171", }, + [MCGRP_172] =3D { .name =3D "MCGRP_172", }, + [MCGRP_173] =3D { .name =3D "MCGRP_173", }, + [MCGRP_174] =3D { .name =3D "MCGRP_174", }, + [MCGRP_175] =3D { .name =3D "MCGRP_175", }, + [MCGRP_176] =3D { .name =3D "MCGRP_176", }, + [MCGRP_177] =3D { .name =3D "MCGRP_177", }, + [MCGRP_178] =3D { .name =3D "MCGRP_178", }, + [MCGRP_179] =3D { .name =3D "MCGRP_179", }, + [MCGRP_180] =3D { .name =3D "MCGRP_180", }, + [MCGRP_181] =3D { .name =3D "MCGRP_181", }, + [MCGRP_182] =3D { .name =3D "MCGRP_182", }, + [MCGRP_183] =3D { .name =3D "MCGRP_183", }, + [MCGRP_184] =3D { .name =3D "MCGRP_184", }, + [MCGRP_185] =3D { .name =3D "MCGRP_185", }, + [MCGRP_186] =3D { .name =3D "MCGRP_186", }, + [MCGRP_187] =3D { .name =3D "MCGRP_187", }, + [MCGRP_188] =3D { .name =3D "MCGRP_188", }, + [MCGRP_189] =3D { .name =3D "MCGRP_189", }, + [MCGRP_190] =3D { .name =3D "MCGRP_190", }, + [MCGRP_191] =3D { .name =3D "MCGRP_191", }, + [MCGRP_192] =3D { .name =3D "MCGRP_192", }, + [MCGRP_193] =3D { .name =3D "MCGRP_193", }, + [MCGRP_194] =3D { .name =3D "MCGRP_194", }, + [MCGRP_195] =3D { .name =3D "MCGRP_195", }, + [MCGRP_196] =3D { .name =3D "MCGRP_196", }, + [MCGRP_197] =3D { .name =3D "MCGRP_197", }, + [MCGRP_198] =3D { .name =3D "MCGRP_198", }, + [MCGRP_199] =3D { .name =3D "MCGRP_199", }, +}; + enum my_multicast_many_groups_two { MCGRP_TWO_1, MCGRP_TWO_2, @@ -1170,6 +1589,43 @@ static struct genl_family third_genl_family =3D { .policy =3D third_genl_policy, }; =20 +// LARGE_GENL +enum { + LARGE_GENL_CMD_UNSPEC, + LARGE_GENL_CMD_ECHO, + __LARGE_GENL_CMD_MAX, +}; + +#define LARGE_GENL_CMD_MAX (__LARGE_GENL_CMD_MAX - 1) + +static int large_genl_echo(struct sk_buff *skb, struct genl_info *info) +{ + return 0; +} + +// Generic Netlink operations for LARGE_GENL family +static const struct genl_ops large_genl_ops[] =3D { + { + .cmd =3D LARGE_GENL_CMD_ECHO, + .flags =3D 0, + .doit =3D large_genl_echo, + .dumpit =3D NULL, + }, +}; + +// genl_family struct for LARGE_GENL family +static struct genl_family large_genl_family =3D { + .hdrsize =3D 0, + .name =3D LARGE_GENL_FAMILY_NAME, + .version =3D 1, + .maxattr =3D 1, + .netnsok =3D true, + .ops =3D large_genl_ops, + .n_ops =3D ARRAY_SIZE(large_genl_ops), + .mcgrps =3D genl_many_mcgrps_one, + .n_mcgrps =3D ARRAY_SIZE(genl_many_mcgrps_one), +}; + // genl_family struct with incorrect name static struct genl_family incorrect_genl_family =3D { .hdrsize =3D 0, @@ -1237,14 +1693,22 @@ static int __init init_netlink(void) goto failure_2; } =20 - rc =3D genl_register_family(&third_genl_family); + rc =3D genl_register_family(&large_genl_family); if (rc) { pr_err("%s: Failed to register Generic Netlink family\n", __func__); goto failure_3; } =20 + rc =3D genl_register_family(&third_genl_family); + if (rc) { + pr_err("%s: Failed to register Generic Netlink family\n", __func__); + goto failure_4; + } + return 0; =20 +failure_4: + genl_unregister_family(&large_genl_family); failure_3: genl_unregister_family(&my_genl_family_parallel); failure_2: @@ -1417,6 +1881,7 @@ static int __init module_netlink_init(void) genl_unregister_family(&my_genl_family); genl_unregister_family(&my_genl_family_parallel); genl_unregister_family(&third_genl_family); + genl_unregister_family(&large_genl_family); err_sysfs: sysfs_remove_file(kobj_genl_test, &my_attr_u32_genl_test.attr); sysfs_remove_file(kobj_genl_test, &my_attr_str_genl_test.attr); @@ -1437,6 +1902,7 @@ static void __exit module_netlink_exit(void) genl_unregister_family(&my_genl_family); genl_unregister_family(&my_genl_family_parallel); genl_unregister_family(&third_genl_family); + genl_unregister_family(&large_genl_family); =20 sysfs_remove_file(kobj_genl_test, &my_attr_u32_genl_test.attr); sysfs_remove_file(kobj_genl_test, &my_attr_str_genl_test.attr); --=20 2.34.1