• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revision22fe4d08aaa9a1622c3918221ba4e22c21761fd0 (tree)
Time2014-04-09 15:23:37
AuthorHiroaki Nakano <nakano.hiroaki@nttc...>
CommiterHiroaki Nakano

Log Message

edit途中。

Signed-off-by: Hiroaki Nakano <nakano.hiroaki@nttcom.co.jp>

Change Summary

Incremental Difference

--- a/include/l7vs.h
+++ b/include/l7vs.h
@@ -47,4 +47,6 @@
4747
4848 extern char l7vs_module_path[]; /*! protocol module path */
4949
50+#define P_FIFO "/tmp/l7vsd/l7vsd.parent" /*! sever named pipe pathname */
51+
5052 #endif /* L7VS_H */
--- a/include/l7vs_service.h
+++ b/include/l7vs_service.h
@@ -45,7 +45,9 @@ typedef uint32_t handle_t;
4545 #define TEMP_SERVICEHANDLE UINT32_MAX
4646 #define BPS_DEFAULT_INTERVAL 1000000ULL
4747
48-// virtual service definition datatype
48+#define NAMED_PIPE_PATH /tmp/l7vs
49+
50+// virtual service definition datatype for child
4951 struct l7vs_service{
5052 handle_t handle; //! l7vs_service_handle
5153 struct l7vs_lsock* lsock; //! listen socket struct pointer
@@ -78,7 +80,7 @@ struct l7vs_service{
7880 int qos_down_flag; //! QoS to client intervention flag (DOWN Direction)
7981 };
8082
81-// virtual service definition, external representation.
83+// virtual service definition, external representation for parent.
8284 struct l7vs_service_arg{
8385 size_t len; //! structure size
8486 struct sockaddr_in addr; //! server address
@@ -86,6 +88,8 @@ struct l7vs_service_arg{
8688 int persist; //! persistency
8789 int backlog; //! listen(2) backlog length
8890
91+ pid_t child_pid[MAX_CHILD]; //! child process pid list
92+
8993 char protomod[L7VS_MODNAME_LEN]; //! protocol module name
9094 char schedmod[L7VS_MODNAME_LEN]; //! scheduler
9195
--- a/src/config.c
+++ b/src/config.c
@@ -607,6 +607,9 @@ l7vs_config_add_vs(union l7vs_config_req *arg,
607607 struct l7vs_service *srv;
608608 struct iovec iov;
609609
610+ int status;
611+ int i;
612+
610613 if(logger_get_log_level(LOG_CAT_L7VSD_NETWORK) == LOG_LV_DEBUG){
611614 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,16,
612615 "in_fuction: void l7vs_config_add_vs (union l7vs_config_req *arg, struct sockaddr_un *addr)"
@@ -639,15 +642,15 @@ l7vs_config_add_vs(union l7vs_config_req *arg,
639642
640643 srv = l7vs_service_create(sarg, &rsp.code);
641644 if (srv == NULL) {
642- if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
643- LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,2,"ADD_VS: service already exists");
644- }
645- l7vs_config_iomux->status = iomux_config_command_vs_create_error;
646- goto out;
645+ if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
646+ LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,2,"ADD_VS: service already exists");
647+ }
648+ l7vs_config_iomux->status = iomux_config_command_vs_create_error;
649+ goto out;
647650 } else {
648- l7vs_config_iomux->status = iomux_config_command_add_vs_vs_created;
649- LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_VIRTUAL_SERVICE,1,"ADD_VS: IFRM001: created a service ");
650- }
651+ l7vs_config_iomux->status = iomux_config_command_add_vs_vs_created;
652+ LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_VIRTUAL_SERVICE,1,"ADD_VS: IFRM001: created a service ");
653+ }
651654
652655 l7vs_config_iomux->status = iomux_config_command_add_vs_succeeded;
653656
--- a/src/l7vsd.c
+++ b/src/l7vsd.c
@@ -28,6 +28,7 @@
2828 #include <sys/types.h>
2929 #include <sys/stat.h>
3030 #include <sys/socket.h>
31+#include <sys/wait.h>
3132 #include <signal.h>
3233 #include <unistd.h>
3334 #include <stdlib.h>
@@ -55,6 +56,22 @@ l7vs::Logger l7vs::Logger::instance;
5556 l7vs::Parameter l7vs::Parameter::instance;
5657
5758 /*!
59+ * create server named pipe
60+ */
61+static void
62+create_server_pipe()
63+{
64+ int ret;
65+
66+ ret = mkfifo(P_FIFO, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
67+ if(ret < 0){
68+ perror("mkfifo");
69+ }
70+
71+ return ret;
72+}
73+
74+/*!
5875 * exit signal handler
5976 *
6077 * @param[in] sig signal
@@ -288,8 +305,8 @@ usage(FILE *fp, char *ident)
288305 * @return int exit status
289306 */
290307 int
291-//l7vsd_main(int argc, char *argv[])
292-main(int argc, char *argv[])
308+l7vsd_main(int argc, char *argv[])
309+//child(int idx)
293310 {
294311 //parameter set function register
295312 parameter_register_function_pointer( PARAM_COMP_SNMPAGENT, l7vs_snmpbridge_reload_config );
@@ -310,9 +327,9 @@ main(int argc, char *argv[])
310327 }
311328 *(argv_str + pos) = '\0';
312329 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,17,
313- "in_function: int main(int argc, char *argv[]) "
314- "argc=%d, argv=%s",
315- argc, argv_str);
330+ "in_function: int child(int idx) "
331+ "idx=%d\n",
332+ idx);
316333 }
317334 /*------ DEBUG LOG END ------*/
318335
@@ -367,7 +384,7 @@ main(int argc, char *argv[])
367384 /*-------- DEBUG LOG --------*/
368385 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
369386 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,19,
370- "out_function: int main(int argc, char *argv[]) "
387+ "out_function: int child(int idx) "
371388 "return_value: 1");
372389 }
373390 /*------ DEBUG LOG END ------*/
@@ -388,7 +405,7 @@ main(int argc, char *argv[])
388405 /*-------- DEBUG LOG --------*/
389406 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
390407 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,20,
391- "out_function: int main(int argc, char *argv[]) "
408+ "out_function: int child(int idx) "
392409 "return_value: 1");
393410 }
394411 /*------ DEBUG LOG END ------*/
@@ -412,7 +429,7 @@ main(int argc, char *argv[])
412429 /*-------- DEBUG LOG --------*/
413430 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
414431 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,21,
415- "out_function: int main(int argc, char *argv[]) "
432+ "out_function: int child(int idx) "
416433 "return_value: 1");
417434 }
418435 /*------ DEBUG LOG END ------*/
@@ -421,6 +438,9 @@ main(int argc, char *argv[])
421438 _exit(1);
422439 }
423440
441+ ret = create_server_pipe();
442+ if(ret < 0) exit(1);
443+
424444 l7vs_module_init(NULL);
425445 l7vs_lsock_init();
426446 l7vs_replication_init();
@@ -452,12 +472,13 @@ main(int argc, char *argv[])
452472 /*-------- DEBUG LOG --------*/
453473 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
454474 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,22,
455- "out_function: int main(int argc, char *argv[]) "
475+ "out_function: int child(int idx) "
456476 "return_value: 0");
457477 }
458478 /*------ DEBUG LOG END ------*/
459479 fflush(stdout);
460480 fsync(1);
481+
461482 _exit(0);
462483 return 0; /* this instruction never called ;-) */
463484 }
--- a/src/lsock.c
+++ b/src/lsock.c
@@ -208,6 +208,7 @@ l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog)
208208 }
209209
210210 setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEADDR, (char*) &on, sizeof(int));
211+ setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEPORT, (char*) &on, sizeof(int));
211212 ret = bind(lsock->iom->fd, (struct sockaddr *)sin, sizeof(*sin)); //binding the socket for incoming client request
212213 if (ret < 0) {
213214 char addr_str[DEBUG_STR_LEN]={0};
--- a/src/service.c
+++ b/src/service.c
@@ -48,6 +48,7 @@
4848
4949 //! service list pointer
5050 static GList * l7vs_service_list;
51+static Glist * l7vs_service_arg_list;
5152
5253 //! service handle
5354 uint32_t service_handle_base = 0;
@@ -604,6 +605,63 @@ l7vs_service_list_dest_arg(struct l7vs_service *srv,
604605 }
605606
606607 /*!
608+ * check child process when create service. and send information for adding service.
609+ * @param[in]
610+ * @param[out]
611+ * @return
612+ */
613+int
614+l7vs_child_precess_check()
615+{
616+ GList *l;
617+ int i, writefifo;
618+ int srv_sock_check_flg;
619+ pid_t pid;
620+ char *fifoname;
621+
622+ /* IP, port and protomod duplication check */
623+ srv_sock_check_flg = 0;
624+ for(l = g_list_first(l7vs_service_arg_list); l != NULL; l = g_list_next(l)) {
625+ saref = (struct l7vs_service_arg *)l->data;
626+ /* IPとportの重複チェック */
627+ if((saref->addr.sin_addr.s_addr != arg->srv_arg.addr.sin_addr.s_addr) || (saref->addr.sin_port != arg->srv_arg.addr.sin_port)) {
628+ continue;
629+ }else{
630+ /* IPとportが一緒だったら、プロトコルモジュール名を比較 */
631+ srv_sock_check_flg = 1;
632+ if(saref->protomod != arg->srv_arg->protomod) {
633+ /* 子プロセスにプロトコルモジュール通知 */
634+ /* l7vs_service.h struct l7vs_service_arg(child_pid[]) */
635+ /* IP,portからpidのリストを取得 */
636+ for( i =0; i < MAX_CHILD; i++) {
637+ pid = saref->child_pid[i];
638+ /* pidからファイルパス名生成 */
639+ /* 既存/tmp/l7vsd_ip_port/l7vsd.pid をwriteで開いて書き込み */
640+ if((writefifo = open(fifoname, O_WRONLY, 0)) < 0) {
641+ perror("open");
642+ continue;
643+ }else{
644+ /* VS作成用テキスト情報を構築 */
645+ /* 名前付きパイプに情報を書き込み */
646+ ret = write(writefifo, saref->protomod, n);
647+ if(ret < 0){
648+ perror("write");
649+ }
650+ close(writefifo);
651+ }
652+ }
653+ }else{
654+ /* サービス重複エラー */
655+ LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,2, "Virtual service already exists" );
656+ return srv_sock_check_flg;
657+ }
658+ }
659+ }
660+
661+ return srv_sock_check_flg;
662+}
663+
664+/*!
607665 * create service instance. and set service value.
608666 * @param[in] *arg l7vs_service_arg pointer
609667 * @param[out] *err error code
@@ -615,13 +673,21 @@ l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err)
615673 struct l7vs_protomod *pmod;
616674 struct l7vs_scheduler *sched;
617675 struct l7vs_service *srv, *sref;
676+ struct l7vs_service_arg *saref;
618677 struct l7vs_lsock *lsock;
619678 struct l7vs_dest *sorry_dest; //! sorry-server destination
620679 // struct l7vs_service_repdata * service_replicationdata;
621680
681+ int srv_sock_check_flg = 0;
682+ int srv_mod_check_flg = 0;
622683 int ret = 0;
684+ int i, readid, writeid;
685+ pid_t pid;
623686 GList *l;
624687
688+ char fifoname[256];
689+ char childinfo[64];
690+
625691 if( NULL == arg ){
626692 LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_PROGRAM,15, "Could not create service : argument \"arg\" is NULL" );
627693 return NULL;
@@ -654,213 +720,236 @@ l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err)
654720 return NULL;
655721 }
656722
657- lsock = l7vs_lsock_get(&arg->srv_arg.addr, arg->srv_arg.proto, arg->srv_arg.backlog);
658- if (lsock == NULL) {
659- LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,1, "Could not create listen socket" );
660- *err = L7VS_CONFIG_ERR_NOSOCK;
661- //debug output
662- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
663- char debugstr[DEBUG_STR_LEN];
664- memset( debugstr, 0, DEBUG_STR_LEN );
665- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_lsock_get)" );
666- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,31, debugstr );
667- }
668- return NULL;
669- }
670-
671- pmod = l7vs_protomod_get(arg->srv_arg.protomod);
672- if (pmod == NULL) {
673- l7vs_lsock_put(lsock);
674- *err = L7VS_CONFIG_ERR_NOMEM;
675- //debug output
676- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
677- char debugstr[DEBUG_STR_LEN];
678- memset( debugstr, 0, DEBUG_STR_LEN );
679- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_protomod_get)" );
680- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,32, debugstr );
681- }
682- return NULL;
683- }
684-
685- sched = l7vs_sched_get(arg->srv_arg.schedmod);
686- if (sched == NULL) {
687- l7vs_protomod_put(pmod);
688- l7vs_lsock_put(lsock);
689- *err = L7VS_CONFIG_ERR_NOSCHED;
690- //debug output
691- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
692- char debugstr[DEBUG_STR_LEN];
693- memset( debugstr, 0, DEBUG_STR_LEN );
694- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_sched_get)" );
695- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,33, debugstr );
696- }
697- return NULL;
698- }
699-
700- // create new destination for sorry-server (weight not set)
701- // FIXME ignore IPv6 address???
702- sorry_dest = (struct l7vs_dest *)l7vs_dest_create((struct sockaddr_in *)&arg->srv_arg.sorry_addr, 0);
703- if (sorry_dest == NULL) {
704- l7vs_sched_put(sched);
705- l7vs_protomod_put(pmod);
706- l7vs_lsock_put(lsock);
707- *err = L7VS_CONFIG_ERR_NOMEM;
708- //debug output
709- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
710- char debugstr[DEBUG_STR_LEN];
711- memset( debugstr, 0, DEBUG_STR_LEN );
712- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_dest_create)" );
713- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,34, debugstr );
714- }
715- return NULL;
716- }
717-
718- srv = (struct l7vs_service *) calloc(1, sizeof(struct l7vs_service));
719- if (srv == NULL) {
720- l7vs_dest_destroy(sorry_dest);
721- l7vs_sched_put(sched);
722- l7vs_protomod_put(pmod);
723- l7vs_lsock_put(lsock);
724- *err = L7VS_CONFIG_ERR_NOMEM;
725- LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_SYSTEM_MEMORY,5, "l7vs_service memory allocate error" );
726- return NULL;
727- }
728- //DEBUG output
729- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
730- char debugstr[DEBUG_STR_LEN];
731- memset( debugstr, 0, DEBUG_STR_LEN );
732- sprintf( debugstr, "memory allocated : address = %p , size = %zu", srv, sizeof(struct l7vs_service ) );
733- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,35, debugstr );
734- }
735-
736- srv->handle = ++service_handle_base;
737- if( TEMP_SERVICEHANDLE == srv->handle ){
738- srv->handle = ++service_handle_base;
739- }
740- ret = pmod->create(&arg->protomod_arg, srv->handle);
741- if (ret != 0) {
742- //DEBUG output
743- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
744- char debugstr[DEBUG_STR_LEN];
745- memset( debugstr, 0, DEBUG_STR_LEN );
746- sprintf( debugstr, "memory free : address = %p", srv );
747- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,36, debugstr );
748- }
749- free(srv);
750- l7vs_dest_destroy(sorry_dest);
751- l7vs_sched_put(sched);
752- l7vs_protomod_put(pmod);
753- l7vs_lsock_put(lsock);
754- *err = L7VS_CONFIG_ERR_NOMEM;
755- //debug output
756- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
757- char debugstr[DEBUG_STR_LEN];
758- memset( debugstr, 0, DEBUG_STR_LEN );
759- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure pmod create)" );
760- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,37, debugstr );
761- }
762- return NULL;
763- }
764-
765- for (l = g_list_first(l7vs_service_list); l != NULL;
766- l = g_list_next(l)) {
767- sref = (struct l7vs_service *)l->data;
768-
769- if (lsock != sref->lsock) {
770- continue;
771- }
772-
773- if (pmod != sref->pm) {
774- continue;
775- }
776-
777- if (pmod->compare(srv->handle, sref->handle) != 0) {
723+ /* IPとportの重複チェック、proto_modだけ違うものならproto_mod追加 */
724+ srv_sock_check_flg = l7vs_child_precess_check();
725+
726+ /* IPとportが重複しない場合は子プロセスを作る */
727+ if( srv_sock_check_flg == 0 ) {
728+ for( i=0; i < fork_num; i++ ){
729+ pid_t pid = fork();
730+ /* 子プロセスを生成したら親プロセスでIP,portとPIDの対応リストを作る */
731+
732+ /* 子ならgetpidして親に名前付きパイプで通知 */
733+ if( pid == 0 ){
734+ /* ソケット作成 */
735+ lsock = l7vs_lsock_get(&arg->srv_arg.addr, arg->srv_arg.proto, arg->srv_arg.backlog);
736+ if(lsock == NULL) {
737+ LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,1, "Could not create listen socket" );
738+ *err = L7VS_CONFIG_ERR_NOSOCK;
739+ //debug output
740+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
741+ char debugstr[DEBUG_STR_LEN];
742+ memset( debugstr, 0, DEBUG_STR_LEN );
743+ sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_lsock_get)" );
744+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,31, debugstr );
745+ }
746+ return NULL;
747+ }
748+
749+ /* プロトコルモジュールロード */
750+ pmod = l7vs_protomod_get(arg->srv_arg.protomod);
751+ if (pmod == NULL) {
752+ l7vs_lsock_put(lsock);
753+ *err = L7VS_CONFIG_ERR_NOMEM;
754+ //debug output
755+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
756+ char debugstr[DEBUG_STR_LEN];
757+ memset( debugstr, 0, DEBUG_STR_LEN );
758+ sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_protomod_get)" );
759+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,32, debugstr );
760+ }
761+ return NULL;
762+ }
763+
764+ /* スケジュールモジュールロード */
765+ sched = l7vs_sched_get(arg->srv_arg.schedmod);
766+ if (sched == NULL) {
767+ l7vs_protomod_put(pmod);
768+ l7vs_lsock_put(lsock);
769+ *err = L7VS_CONFIG_ERR_NOSCHED;
770+ //debug output
771+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
772+ char debugstr[DEBUG_STR_LEN];
773+ memset( debugstr, 0, DEBUG_STR_LEN );
774+ sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_sched_get)" );
775+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,33, debugstr );
776+ }
777+ return NULL;
778+ }
779+
780+ // create new destination for sorry-server (weight not set)
781+ // FIXME ignore IPv6 address???
782+ sorry_dest = (struct l7vs_dest *)l7vs_dest_create((struct sockaddr_in *)&arg->srv_arg.sorry_addr, 0);
783+ if (sorry_dest == NULL) {
784+ l7vs_sched_put(sched);
785+ l7vs_protomod_put(pmod);
786+ l7vs_lsock_put(lsock);
787+ *err = L7VS_CONFIG_ERR_NOMEM;
788+ //debug output
789+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
790+ char debugstr[DEBUG_STR_LEN];
791+ memset( debugstr, 0, DEBUG_STR_LEN );
792+ sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_dest_create)" );
793+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,34, debugstr );
794+ }
795+ return NULL;
796+ }
797+
798+ /* サービス構造体作成 */
799+ srv = (struct l7vs_service *) calloc(1, sizeof(struct l7vs_service));
800+ if (srv == NULL) {
801+ l7vs_dest_destroy(sorry_dest);
802+ l7vs_sched_put(sched);
803+ l7vs_protomod_put(pmod);
804+ l7vs_lsock_put(lsock);
805+ *err = L7VS_CONFIG_ERR_NOMEM;
806+ LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_SYSTEM_MEMORY,5, "l7vs_service memory allocate error" );
807+ return NULL;
808+ }
809+ //DEBUG output
810+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
811+ char debugstr[DEBUG_STR_LEN];
812+ memset( debugstr, 0, DEBUG_STR_LEN );
813+ sprintf( debugstr, "memory allocated : address = %p , size = %zu", srv, sizeof(struct l7vs_service ) );
814+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,35, debugstr );
815+ }
816+
817+ srv->handle = ++service_handle_base;
818+ if( TEMP_SERVICEHANDLE == srv->handle ){
819+ srv->handle = ++service_handle_base;
820+ }
821+ ret = pmod->create(&arg->protomod_arg, srv->handle);
822+ if (ret != 0) {
823+ //DEBUG output
824+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
825+ char debugstr[DEBUG_STR_LEN];
826+ memset( debugstr, 0, DEBUG_STR_LEN );
827+ sprintf( debugstr, "memory free : address = %p", srv );
828+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,36, debugstr );
829+ }
830+ free(srv);
831+ l7vs_dest_destroy(sorry_dest);
832+ l7vs_sched_put(sched);
833+ l7vs_protomod_put(pmod);
834+ l7vs_lsock_put(lsock);
835+ *err = L7VS_CONFIG_ERR_NOMEM;
836+ //debug output
837+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
838+ char debugstr[DEBUG_STR_LEN];
839+ memset( debugstr, 0, DEBUG_STR_LEN );
840+ sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure pmod create)" );
841+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,37, debugstr );
842+ }
843+ return NULL;
844+ }
845+
846+ srv->lsock = lsock;
847+ srv->pm = pmod;
848+ l7vs_sched_bind(sched, srv);
849+
850+ // set sorry data
851+ srv->sorry_cc = arg->srv_arg.sorry_cc;
852+ srv->sorry_dest = sorry_dest;
853+ srv->sorry_flag = arg->srv_arg.sorry_flag;
854+ // set QoS value
855+ srv->qos_threshold_up = arg->srv_arg.qos_threshold_up;
856+ srv->qos_threshold_down = arg->srv_arg.qos_threshold_down;
857+
858+ l7vs_lsock_add_service(lsock, srv);
859+ l7vs_service_list = g_list_append(l7vs_service_list, srv);
860+
861+ // create g_hash_table
862+ srv->conn_hash = g_hash_table_new( NULL, NULL );
863+
864+ // set replicationmode
865+ // get the replication area.
866+ unsigned int r_size = 0;
867+ l7vs_service_repdata * repdata = (l7vs_service_repdata*)l7vs_replication_pay_memory( REP_COMP_SV, &r_size );
868+ // if repdata is NULL, Cansel to replication mode
869+ if( NULL != repdata ){
870+ // if virtuar service number is 1, change mode and copy to the data.
871+ if( 1 == g_list_length( l7vs_service_list ) ){
872+ l7vs_replication_switch_to_master();
873+ // when Syb->Act, Data is saved in a preliminary area of original Service.
874+ // The replication data area is calculated.
875+ rep_size_num = (r_size * DATA_SIZE) / sizeof(struct l7vs_service_repdata);
876+ // get mirror area.
877+ rep_mirror = (struct l7vs_service_repdata*)calloc( rep_size_num, sizeof(struct l7vs_service_repdata) );
878+ // Copy to the data
879+ if( NULL != rep_mirror )memcpy( rep_mirror, repdata, (rep_size_num * sizeof(struct l7vs_service_repdata)) );
880+ //DEBUG output
881+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
882+ char debugstr[DEBUG_STR_LEN];
883+ memset( debugstr, 0, DEBUG_STR_LEN );
884+ sprintf( debugstr, "memory allocated : address = %p , size = %d", rep_mirror, (rep_size_num * sizeof(struct l7vs_service_repdata)) );
885+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE, 100, debugstr );
886+ }
887+ }
888+ // if replication data mirror isn't NULL, get a rep_mirror area.
889+ if( NULL != rep_mirror )set_replication_data( rep_size_num, rep_mirror, srv );
890+ //make replication data
891+ make_replication_data( rep_size_num, repdata );
892+ }
893+
894+ /* 名前付きパイプ作成 */
895+ pid = getpid();
896+ snprintf(filename, sizeof(filename), "/tmp/l7vsd_%s_%d/l7vsd.%d", ip, port, pid);
897+ ret = mkfifo(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
898+ if(ret == -1){
899+ perror("mkfifo");
900+ /* 各種アンロード */
901+ return NULL;
902+ }
903+
904+ /* 親PIPEを開いてPIDとIP,portを親に通知 */
905+ snprintf(child_info, sizeof(child_info), "%s %d %d", ip, port, pid);
906+ len = strlen(child_info);
907+ if((writefifo = open(P_FIFO, O_WRONLY, 0)) < 0) {
908+ perror("open");
909+ /* 各種アンロード */
778910 continue;
911+ }else{
912+ /* 名前付きパイプに情報を書き込み */
913+ ret = write(writefifo, child_info, sizeof(child_info));
914+ if(ret < 0){
915+ perror("write");
916+ /* 各種アンロード */
917+ }
918+ close(writefifo);
919+ }
920+
921+ //debug output
922+ if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
923+ char debugstr[DEBUG_STR_LEN];
924+ memset( debugstr, 0, DEBUG_STR_LEN );
925+ sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err)" );
926+ l7vs_service_c_str( debugstr, srv );
927+ LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,40, debugstr );
928+ }
929+
930+ return srv;
931+
932+ }else if( pid > 0 ){
933+ /* 親プロセス処理 */
934+
935+ /* 子プロが書き込んだ情報を受け取る */
936+ if((readfifo = open("/tmp/l7vsd.parent", O_RDONLY, 0)) < 0) {
937+ perror("open");
938+ return NULL;
939+ }else{
940+ ret = read(readfifo,child_info,n);
941+ if(ret < 0){
942+ perror("read");
943+ /* 各種アンロード */
944+ }
945+ close(readfifo);
946+ }
947+ }else if( pid < 0 ){
948+ /* 子プロセス作成失敗 */
949+ perror( "fork" );
950+ return NULL;
779951 }
780-
781- LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,2, "Virtual service already exists" );
782- l7vs_dest_destroy(sorry_dest);
783- l7vs_sched_put(sched);
784- l7vs_protomod_put(pmod);
785- l7vs_lsock_put(lsock);
786- pmod->destroy(srv->handle);
787- //DEBUG output
788- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
789- char debugstr[DEBUG_STR_LEN];
790- memset( debugstr, 0, DEBUG_STR_LEN );
791- sprintf( debugstr, "memory free : address = %p", srv );
792- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,38, debugstr );
793- }
794- free(srv);
795- *err = L7VS_CONFIG_ERR_VS_EXISTS;
796- //debug output
797- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
798- char debugstr[DEBUG_STR_LEN];
799- memset( debugstr, 0, DEBUG_STR_LEN );
800- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (Duplication service)" );
801- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,39, debugstr );
802- }
803- return NULL;
804- }
805-
806- srv->lsock = lsock;
807- srv->pm = pmod;
808- l7vs_sched_bind(sched, srv);
809-
810- // set sorry data
811- srv->sorry_cc = arg->srv_arg.sorry_cc;
812- srv->sorry_dest = sorry_dest;
813- srv->sorry_flag = arg->srv_arg.sorry_flag;
814- // set QoS value
815- srv->qos_threshold_up = arg->srv_arg.qos_threshold_up;
816- srv->qos_threshold_down = arg->srv_arg.qos_threshold_down;
817-
818- l7vs_lsock_add_service(lsock, srv);
819- l7vs_service_list = g_list_append(l7vs_service_list, srv);
820-
821- // create g_hash_table
822- srv->conn_hash = g_hash_table_new( NULL, NULL );
823-
824- // set replicationmode
825- // get the replication area.
826- unsigned int r_size = 0;
827- l7vs_service_repdata * repdata = (l7vs_service_repdata*)l7vs_replication_pay_memory( REP_COMP_SV, &r_size );
828- // if repdata is NULL, Cansel to replication mode
829- if( NULL != repdata ){
830- // if virtuar service number is 1, change mode and copy to the data.
831- if( 1 == g_list_length( l7vs_service_list ) ){
832- l7vs_replication_switch_to_master();
833- // when Syb->Act, Data is saved in a preliminary area of original Service.
834- // The replication data area is calculated.
835- rep_size_num = (r_size * DATA_SIZE) / sizeof(struct l7vs_service_repdata);
836- // get mirror area.
837- rep_mirror = (struct l7vs_service_repdata*)calloc( rep_size_num, sizeof(struct l7vs_service_repdata) );
838- // Copy to the data
839- if( NULL != rep_mirror )memcpy( rep_mirror, repdata, (rep_size_num * sizeof(struct l7vs_service_repdata)) );
840- //DEBUG output
841- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
842- char debugstr[DEBUG_STR_LEN];
843- memset( debugstr, 0, DEBUG_STR_LEN );
844- sprintf( debugstr, "memory allocated : address = %p , size = %d", rep_mirror, (rep_size_num * sizeof(struct l7vs_service_repdata)) );
845- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE, 100, debugstr );
846- }
847- }
848- // if replication data mirror isn't NULL, get a rep_mirror area.
849- if( NULL != rep_mirror )set_replication_data( rep_size_num, rep_mirror, srv );
850- //make replication data
851- make_replication_data( rep_size_num, repdata );
852- }
853-
854- //debug output
855- if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){
856- char debugstr[DEBUG_STR_LEN];
857- memset( debugstr, 0, DEBUG_STR_LEN );
858- sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err)" );
859- l7vs_service_c_str( debugstr, srv );
860- LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,40, debugstr );
861- }
862-
863- return srv;
952+ }
864953 }
865954
866955
@@ -1675,3 +1764,12 @@ l7vs_service_update_throughput( struct l7vs_service* srv, unsigned long long cur
16751764 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,98,"out_function: void l7vs_service_update_throughput(struct l7vs_service* srv, unsigned long long current_time)");
16761765 }
16771766 }
1767+
1768+void
1769+send_pid(int readid)
1770+{
1771+ size_t len;
1772+ ssize_t n;
1773+ char *ptr;
1774+
1775+}